Redis从入门到精通
Redis入门学习
今日目标
了解什么是Redis Redis的安装 掌握Redis基础操作-掌握Redis的数据类型(重要)
Redis简介
在介绍什么是Redis的时候,先提出一些现象,共大家参考,然后再说什么是Redis
前些年网站的翻车现场
12306总是崩溃的网站
淘宝网站崩溃 京东促销服务器崩溃
思考:为什么这些网站会奔溃?
从上面里个例子中,我们不难发现奔溃的一些原因:
海量用户
高并发
那么什么是出现网站奔溃的肯本原因呢?
性能瓶颈: 磁盘IO性能低下 扩展瓶颈: 数据关系复杂,扩展性能差,不方便大规模集群
思考:如果解决性能瓶颈?
使用非关系数据库(Nosql),非关系数据库有以下优点:
内存存储:降低了磁盘IO次数 不存储关系,只存储数据: 去除了数据间关系,关系越简单越好
Nosql介绍
NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征:
可扩容,可伸缩 大数据量下高性能 灵活的数据模型-高可用 常见 Nosql 数据库:
Redis memcache HBase MongoDB
Redis介绍
什么是Redis
官网:https://redis.io
redis是一款非关系型数据库(NOSQL, not only sql),redis存储的数据是在内存中。
特点:可以快速读取到数据,因为存储的数据是在内存中的。
Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「**!的首字母缩写,也就是「远程字典服务」。
Redis特点
基于内存存储,读写性能高
适合存储热点数据(热点商品、资讯、新闻),一般数据一般变化频率比较低,或者是高并发请求数据
企业应用广泛
Redis使用场景
数据缓存 消息队列 注册中心 发布订阅 分布式锁
Redis下载和安装
Redis的下载可以分为windows和Linux版本
windows 版本下载地址:https://github.com/microsoftarchive/redis/releases redis高级使用 主要是redis4.x以上版本 Linux版本下载地址:http://download.redis.io/releases/ Redis入门使用 主要以3.x版本为主
windows安装Redis
【步骤一】:下载Redis
1.下载地址:
https://github.com/microsoftarchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.zip
2.解压
注意:redis安装目录:
不要有空格 不要有中文
【步骤二】:windows启动Redis服务器
打开cmd
启动
redis-server.exe redis.windows.conf
【步骤三】:运行Redis客户端
set name lisi
get name
Linux安装Redis
【步骤一】:更新系统软件包和Redis编译需要的依赖
yum update -y
yum install gcc-c++ -y
yum install centos-release-scl -y
yum install devtoolset-9-gcc* scl enable devtoolset-9 bash -y
yum install -y gcc g++ make
yum install tcl -y
【步骤二】:下载和编译Redis
下载Redis
curl -O -L http://download.redis.io/releases/redis-6.2.9.tar.gz
解压Redis
tar -zxvf redis-6.2.9.tar.gz
进入redis目录
cd redis-6.2.9
编译
make
【步骤三】:运行Redis的测试套件(可选)
注意:可能要花费几分钟
make test
【步骤四】:安装Redis到系统目录
make install
【步骤五】: 移动配置文件redis.conf
在redis目录下将redis.conf 复制一份到其src目录下
cp redis.conf src/
【步骤六】: 修改redis.conf文件
将配置文件中的daemonize配置项改为yes,默认值为no
# 使用Ctrl+C 结束霸屏运行的服务器端,之后再进行编辑redis.conf
vim redis.conf
# 编辑文件 将 daemonize no 修改为 daemonize yes
daemonize yes
redis的服务默认只是允许本机连接,其他机器默认情况是不被允许连接,如果允许其他机器也能连接linux的reids服务,那么需要修改bind 127.0.0.1 你自己的linux机器的ip地址
vim redis.conf
# 编辑内容将 "bind 127.0.0.1" 修改为 "bind 127.0.0.1 当前linux的ip"
bind 127.0.0.1 192.168.150.101
【步骤七】: 启动Redis
进入src目录下,进行启动redis
cd src && ./redis-server redis.conf
查看redis是否启动
netstat -ntlp | grep redis
效果:可以看到6379已经运行
【步骤八】: 启动客户端链接redis
新开一个finalshell
cd redis-6.2.9/src/
## 启动客户端
./redis-cli
set name zhangsan
get name
【步骤九】: 关闭防火墙
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
【步骤十】: windows系统中使用图形界面客户端远程访问linux的redis
安装redis-desktop-manager
安装好后,点击桌面图标启动
链接
Redis基本操作
添加字符串信息
功能: 设置 key value 数据
命令: set key value
示例: set name lisi
效果:
查询字符串信息
功能: 根据 key 查询对应的 value,如果不存在,返回空(nil)
命令: get key
示例:get name
效果:
清除屏幕信息
功能:清除屏幕中的信息
命令: clear
示例:clear
效果:
帮助
功能:获取命令帮助文档,获取组中所有命令信息名称
命令:
- help 命令名称
- help @组名
示例:help get
效果:
退出客户端
功能:退出客户端
命令:
- quit
- exit
- <ESC>
示例:help get
效果:
Redis数据类型
今日目标
掌握Redis的数据类型
昨天已经介绍了如何安装Redis,以及讲解了Redis的基本操作,那么现在我们就要具体学习Redis的数据类型了
Redis数据类型
Redis数据类型介绍
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
字符串 string
哈希 hash
列表 list
集合 set
有序集合 sorted set / zset
Redis数据存储格式
redis本身就是一个Map,所有数据都是使用key:value格式进行存储 数据类型是指存储数据类型,即value部分的数据类型,key用于都是字符串。
string(字符串)类型
string类型数据特点:
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型 存储数据的格式:一个存储空间保存一个数据 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
string 类型数据的基本操作
添加/修改数据
set key value
获取数据
get key
删除数据
del key
示例:
set username springboot
get username
del username
get username
添加/修改多个数据
mset key1 value1 key2 value2 …
获取多个数据
mget key1 key2 …
获取数据字符个数(字符串长度)
strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value
示例:
#多数据添加
mset name zhangsan age 20
#获取多个数据
mget name age
#获取name对应value的长度
strlen name
#因为name存在,所以对数据进行追加 name 由zhangsan 变成zhangsansan
append name san
get name
# 因为username不存在所以创建新的key value
append username springboot
get username
string 类型数据的扩展操作
string 作为数值操作 incr/decrby使用场景
string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
incr/decrby 格式:
设置数值数据增加指定范围的值
# 对key值进行+1
incr key
# 对key值进行+increment
incrby key increment
设置数值数据减少指定范围的值
# 对key值进行 -1
decr key
# 对key值进行 - increment
decrby key increment
使用场景:
记录我们有一个文章,记录该文章的点赞数,就可以使用incr/decr
set article:1043214:read 1
incr article:1043214:read
get article:1043214:read
decr article:1043214:read
get article:1043214:read
注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis数值上限范围,将报错
string 设置数据具有指定的生命周期
setex/psetex 格式:
SETEX 命令设置一个带有过期时间的键(key),单位为秒
SETEX key seconds value
PSETEX 命令设置一个带有过期时间的键(key),单位为毫秒。
PSETEX key milliseconds value
使用场景:
电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天,3天后自动取消热门。
新闻网站会出现热点新闻,热点新闻最大的特征是时效性,如何自动控制热点新闻的时效性。
总结:控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
setex mykey 60 "Hello Redis"
## 一分钟后获取mykey 结构为nil(空)
get mykey
效果:
psetex mykey 1000 "Hello Redis"
## 一秒后获取mykey 结构为nil(空)
get mykey
效果:
hash(哈希)类型
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,
注意:hash里面包含的键值对个数有限制,限制42亿以内
hash类型数据特点:
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息 需要的存储结构:一个存储空间保存多个键值对数据 hash类型:底层使用哈希表结构实现数据存储
hash类型数据的基本操作
添加/修改数据
hset key field value
获取数据
hget key field
hgetall key
删除数据
hdel key field1 [field2]
示例:
## 添加数据
hset person name zhangsan
##
hset person age 30
## 获取person的name
hget person name
## 获取person的age
hget person age
##获取整个person
hgetall person
## 删除
hdel person name age
hgetall person
效果:
添加/修改多个数据
hmset key field1 value1 field2 value2 …
获取多个数据
hmget key field1 field2 …
获取哈希表中字段的数量
hlen key
判断哈希表中是否存在指定的字段
hexists key field
示例:
hmset person name lisi age 40
hmget person name age
## 获取哈希表中 字段的数量
hlen person
## 判断person 是否存在name属性 存在返回1 不存在返回0
hexists person name
hexists person sex
效果:
hash类型数据扩展操作
获取哈希表中所有的字段名或字段值
hkeys key
hvals key
设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
使用场景:
购物车数据,就可以使用redis进行存储
解决方案
以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
将商品编号作为field,购买数量作为value进行存储
添加商品:追加全新的field与value
浏览:遍历hash
删除商品:删除field
清空:删除key
代码示例:
hmset 001 order001 1 order002 2 order003 1
hgetall 001
hincrby 001 order001 1
hget 001 order001
hincrby 001 order002 -1
hget 001 order002
效果:
hash注意事项
hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil) 每个hash 可以存储 232-1 个键值对 hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用 hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
list(列表)类型
Redis 列表是简单的字符串列表,按照插入顺序排序,
类似于java中的linkedList(双向链表),value的个数限制42亿个以内。list类型数据特点:
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序 list类型:保存多个数据,底层使用双向链表存储结构实现
list 类型数据基本操作
添加/修改数据
#Left, 将一个或多个值插入到列表头部(左部),
lpush key value1 [value2] ……
# rpush是从尾部插入
rpush key value1 [value2] ……
获取数据
#获取列表指定范围内的元素
lrange key start stop
lindex key index
# 获取列表长度
llen key
获取并移除数据
# lpop从左侧头部删除一个元素
lpop key
# rpop从右侧头部删除一个元素
rpop key
示例:
# list左侧添加数据
lpush list zhangsan lisi wangwu
# 获取list 0 - 3数据
lrange list 0 3
# 获取list 0 到尾部数据
lrange list 0 -1
# 删除尾部数据
rpop list
# 获取长度
llen list
# 右侧添加数据
rpush list zhaoliu
# 获取倒数第二的数据
lindex list -2
效果:
list 类型数据扩展操作
规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout
移除指定数据
lrem key count value
【说明:】
- key 是要进行操作的列表的键名。
- count 是要删除的元素的数量,有以下几种情况:
当 count > 0 时,从列表的头部开始,删除与 value 相等的元素,最多删除 count 个。
当 count < 0 时,从列表的尾部开始,删除与 value 相等的元素,最多删除 count 绝对值的个数。
当 count = 0 时,删除所有与 value 相等的元素。
- value 是要删除的具体元素的值。
使用场景:
微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息如果取消点赞,移除对应好友信息
解决方案
## 添加文章 点赞
rpush user001:article001 zhangsan wangwu
rpush user001:article001 lisi
##查看数据
lrange user001:article001 0 -1
## 从头部开始删除一个值为zhangsan的数据
lrem user001:article001 1 zhangsan
lrange user001:article001 0 -1
效果:
list 类型数据操作注意事项
list中保存的数据都是string类型的,数据总容量是有限的,最多232-1 个元素(4294967295)。 list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作 获取全部数据操作结束索引设置为-1 list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
set(集合)类型
Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
set类型数据特点:
新的存储需求:存储大量的数据,在查询方面提供更高的效率 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询 set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
set类型数据的基本操作
添加数据
# 向集合添加一个或多个成员
sadd key member1 [member2]
获取全部数据
# 返回集合中的所有成员
smembers key
删除数据
# 移除集合中一个或多个成员
srem key member1 [member2]
获取集合数据总量
scard key
判断集合中是否包含指定数据
sismember key member
示例:
sadd set1 zhangsan lisi wangwu zhangsan
smembers set1
srem set1 lisi
smembers set1
scard set1
sismember set1 wangwu
sismember set1 zhaoliu
效果:
set 类型数据的扩展操作
随机获取集合中指定数量的数据
srandmember key [count]
随机获取集合中的某个数据并将该数据移出集合
spop key [count]
使用场景:
每位用户首次使用今日头条时会设置3项爱好的内容,但是后期为了增加用户的活跃度、兴趣点,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?
业务分析:
- 系统分析出各个分类的最新或最热点信息条目并组织成set集合
- 随机挑选其中部分信息
- 配合用户关注信息分类中的热点信息组织成展示的全信息集合
解决方案:
sadd hostarticle article001 article002 article003 article004 article005
## 随机从hostarticle集合中获取3个数据
srandmember hostarticle 3
效果
求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
将指定数据从原始集合中移动到目标集合中
smove source destination member
set类型数据操作的注意事项
set 类型不允许数据重复,如果添加的数据在set 中已经存在,将只保留一份 set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间
sorted set(有序集合)类型
Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score) 。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。
sorted set类型数据特点:
新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式 需要的存储结构:新的存储模型,可以保存可排序的数据 sorted_set类型:在set的存储结构基础上添加可排序字段
sorted set类型数据的基本操作
添加数据
zadd key score1 member1 [score2 member2]
获取全部数据
# 正序
zrange key start stop [WITHSCORES]
# 倒叙
zrevrange key start stop [WITHSCORES]
删除数据
zrem key member [member ...]
按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
注意:
min与max用于限定搜索查询的条件
start与stop用于限定查询范围,作用于索引,表示开始和结束索引
offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
获取集合数据总量
zcard key
zcount key min max
集合交、并操作
zinterstore destination numkey skey [key ...]
zunionstore destination numkeys key [key ...]
效果
sorted set类型数据的扩展操作
获取数据对应的索引(排名)
zrank key member
zrevrank key member
score值获取与修改
zscore key member
zincrby key increment member
使用场景:
各类资源网站TOP10(电影,歌曲,文档,电商,游戏等) 聊天室活跃度统计 游戏好友亲密度分析
为所有参与排名的资源建立排序依据
示例:
## 文档热度排序
zadd wordset 10 word001 30 word002 40 word003 90 word005 80 word006 70 word007
## 获取正序排序
zrank wordset word005
# 获取倒叙排序
zrevrank wordset word005
# 分数加
zincrby wordset 2 word005
效果:
sorted set类型数据操作的注意事项
score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重 sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
发表评论