概念:
Redis(Remote Dictionary Server)是C语言开发的一个开源的高性能键值对数据库。
特征:
1. 数据间没有必然的关联联系。
2. 内部采用单线程机制进行工作。
3. 高性能。官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是80000次/s。
4. 多数据类型支持
①字符串类型 string
②列表类型 list
③散列类型 hash
④集合类型 set
⑤有序集合类型 sorted_set
5. 持久化支持,可以进行数据灾难恢复
Redis的应用
1. 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
2. 任务队列,如秒杀、抢购、购票排队等
3. 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
4. 时效性信息控制,如验证码控制、投票控制等
5. 分布式数据共享,如分布式集群架构中的session分离
6. 消息队列
7. 分布式锁
windows版本下载
https://github.com/microsoftarchive/redis/tags
一、String类型
String类型数据的基本操作
1.添加/修改数据 set key value
2.获取数据 get key
3.删除数据 del key
4.添加/修改多个数据 mset key1 value1 key2 value2 ...
5.获取多个数据 mget key1 key2...
6.获取数据字符长度(字符串的长度) strlen key
7.key 不存在时,为 key 设置指定的值 setnx key value
8.追加信息到延时信息后部(如果原始信息存在就追加,否则新建)append key value
string 类型数据的拓展操作
业务场景1
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保持统一性,不能重复。Oracle数据库具有sequence设定,可以解决该问题,但是Mysql数据库并不具有类似的机制,那么该如何解决。
解决方案
1. 设置数值数据增加指定范围的值
incr key 默认增加1
incrby key increment 指定增加的整数值
incrbyfloat key increment 指定增加的小数值
2. 设置数值数据减少指定范围的值
decr key 默认减少1
decrby key increment 指定减少的整数值
string作为数值操作
1.string在redis内部存储默认就是一个字符串,当遇到增减类操作incr、decr时会转为数值型进行计算。
2. redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
注意:按键值进行操作的数据,如果原始数据不能转为数值或超越了redis数值上限范围将报错。9223372036854775807(java中long型数据最大值,long_MAX_VALUE)
Tips1:
1. redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性。
2. 次方案适用于所有的数据库,且支持数据库集群。
业务场景2
‘最强女生’启动海选投票,只能通过微信投票,每个微信号每4小时只能投一票。
电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持三天,三天后自动取消热门。
新闻网站出现热点新闻,热点新闻最大的特征是时效性,如何自动控制热点新闻的时效性。
解决方案
设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
Tip 2:
redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作。
业务场景3
解决方案
1.在redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可
eg: user:id:356894:fans -> 122222
eg: user:id:555214:blogs ->568
eg: user:id:125689:focuss ->83
例如:set user:id:356894:fans 122222
2. 在redis中以json格式存储大V用户信息,定时刷新(也可以使用hash类型)
eg: user:id:35555465 ->{fans:122222,blogs:568,focuss:83}
例如:set user:id:35555465 {fans:122222,blogs:568,focuss:83}
Tip 3:
redis应用于各种结构型和非结构型高热度数据访问加速
key的设置约定
数据库中的热点数据key命名惯例
表名 : 主键名 :主键值 :字段名
eg: user:id:123456:name
string 类型数据操作的注意事项
1. 数据操作不成功的反馈与数据正常操作之间的差异
①表示运行结果是否成功
(Integer)0 ->false 失败
(Integer)1 ->true 成功
②表示运行结果值
(Integer)3 ->3 3个
2. 数据未获取到
(nil)等同于null
3. 数据最大存储量
512MB
4. 数值计算的最大范围值(java中的long的最大值)
9223372036854775807
二、hash类型
hash类型数据的基本操作
1. 添加/修改数据 hset key field value
2. 获取数据 hget key field hgetall key(获取所有数据)
3. 删除数据 hdel key field1 [field2]
4. 添加/修改多个数据 hmset key field1 value1 field2 value2 ...
5. 获取多个数据 hmget key field1 field2 ...
6. 获取哈希表中字段的数量 hlen key
7. 获取哈希表中是否存在指定的字段 hexists key field
hash 类型数据的扩展操作
1. 获取哈希表中所有的字段名或字段值
hkeys key
hvals key
2.设置指定字段的数值数据增加指定范围的值
hincrby key field increment increment代表数值(整数)
hincrbyfloat key field increment increment代表数值(小数)
hash 类型数据操作的注意事项
1. hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为nil。
2. 每个hash可以存储2的32次方减1个键值对。
3. hash类型十分接近对象的数据存储形式,并且可以灵活的添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,
更不可以将hash作为对象列表使用
4. hgetall操作可以获取全部属性,如果内部的field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。
hash 类型的应用场景
业务场景1
电商网站购物车的实现
解决方案
1. 以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
2. 将商品编号作为field,购买数量作为value进行存储
3. 添加商品:追加全新的field和value
4. 浏览:遍历hash
5. 更改数量:自增/自减,设置value值
6. 删除商品:删除field
7. 清空:删除key
hsetnx key field value field值不存在就新增否则不变
业务场景2
解决方案
1. 以商家id作为key
2. 将参与抢购的商品id作为field
3. 将参与抢购的商品数量作为对应的value
4. 抢购时使用降值的方式控制产品数量
三、list类型
list 类型数据基本操作
1. 添加/修改数据
lpush key value1 [value2]...
rpush key value1 [value2]...
2. 获取数据
lrange key start stop start和stop指索引位置 lrange key 0 -1 获取全部数据
lindex key index
llen key
3. 获取并移除数据(每执行一次获取一个值)
lpop key (按最先从左边插入的数据依次获取数值,然后从列表中将其删除)
rpop key (按最先从右边插入的数据依次获取数值,然后从列表中将其删除)
list 类型数据拓展操作
规定时间内获取并移除数据
blpop key1 [key2] timeout timeout指时间(s)
brpop key1 [key2] timeout
注:如果获取不到会一直等到规定时间结束后返回,如果有数据会立马获取到。key1 [key2] 表示可以多个list一起查找
list 类型数据扩展操作
业务场景1
微信朋友圈点赞,要求按照点赞顺序显示好友信息
如果取消点赞,移除对应好友信息
解决方案
移除指定数据
lrem key count value count指要移除的值的个数
tips 6:
redis 应用于具有操作先后顺序的数据控制
list 类型数据注意事项
set 类型
set 数据类型基本操作
1. 添加数据
sadd key member1 [member2]
2. 获取全部数据
smembers key
3. 删除数据
srem key member1 [member2
4. 获取集合数据总量
scard key
5. 判断集合中是否包含指定数据
sismember key member]
set 类型数据的扩展操作
业务场景1
解决方案
1. 随机获取集合中指定数量的数据
srandmember key [count]
2. 随机获取集合中的某个数据并将该数据移出集合
spop key
业务场景2
解决方案
1. 求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2] key1 key2顺序不一样结果也不一样
2. 求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
destination指的是指定的集合,key1、key2代表两个集合
3. 将指定数据从原始集合中移动到目标集合中
smove source destination member
source指的是从哪移的集合
destination指的是要移过去集合
member指的是移哪个值
业务场景3
解决方案
1. 依赖set集合数据不重复的特征,依赖set集合hash存储结构特征完成数据过滤与快速查询
2. 根据用户id获取用户所有角色
3. 根据用户所有角色获取用户所有操作权限放入set集合
4. 根据用户所有角色获取用户所有数据全选放入set集合
tip:
redis应用于同类型不重复数据的合并操作
业务场景4
解决方案
1. 利用set集合的数据去重特征,记录各种访问数据
2. 建立string类型数据,利用incr统计日访问量(PV)
3. 建立set模型,记录不同的cookie数量(UV)
4. 建立set模型,记录不同IP数量(IP)
tip:
redis应用于同类型数据的快速去重
set类型数据操作的注意事项
sorted_set类型
sorted_set 类型数据的基本操作
1. 添加数据
zadd key score1 member [score2 member2]
2. 获取全部数据
zrange key start stop [WITHSCORES] 按score值从小到大排序
zrevrange key start stop [WITHSCORES] 按score值从大到小排序
zrange key start stop withscores 返回值包含score值和member值一起输出
zrange key start stop 返回值只有member值
3. 删除数据
zrem key member [member ...]
4. 按条件获取数据
zrangebyscore key min max [WITHSCORES] [limit]
zrevrangebyscore key min max [WITHSCORES]
eg: zrangebyscore key min max limit 0 3 withscores 获取三条数据
5.条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
6. 获取集合数据总量
zcard key
zcount key min max
7. 集合交、并操作
zinterstore destination numkeys key [key...]
zunionstore destination numkeys key [key...]
destination指的是交、并后的集合名
numkeys指的是有几个集合交、并
numkeys值为几,后面就需要有几个集合
注意:
1. min与max用于限定搜索查询的条件
2. start 与stop用于限定查询范围,作用于索引,表示开始和结束索引
3. offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
sorted_set 类型数据的扩展操作
业务场景1
解决方案
1. 获取数据对应的索引(排名)
zrank key member
zrevrank key member
2. score值获取与修改
zscore key member
zincrby key increment member
tip:
redis应用于计数器组合排序功能的对应排名
业务场景2
解决方案
获取系统时间 time
tip:
redis应用于定时任务执行顺序管理或任务过期管理
业务场景3
解决方案
sorted_set 类型数据操作的注意事项
key通用操作
key基本操作
1. 删除指定key del key
2. 获取key是否存在 exists key
3. 获取key的类型 type key
key拓展操作(时效性控制)
1. 为指定key设置有效期
expire key seconds
pexpire key milliseconds
有效期为时间戳
expireat key timestamp
pexpireat key milliseconds-timestamp
2. 获取key的有效时间
ttl key 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
pttl key
3.切换key从时效性转换为永久性
persist key
4. 查询key
keys pattern pattern指查询匹配规则
查询匹配规则
* 匹配任意数量的任意字符
? 匹配一个任意符号
[] 匹配一个指定符号
例如:
keys * 查询所有
keys it* 查询所有以it开头
keys *it 查询所有以it结尾
keys ??it 查询所有前面两个任意字符,后面以it结尾
keys user:? 查询所有以user:开头,最后一个字符任意
keys u[st]er:1 查询所有以u开头,以er:1结尾,中间包含一个字母,s或t
key其他操作
1. 为key改名
rename key newkey 注意:newkey的值如果存在执行后会覆盖,相当于执行set操作
renamenx key newkey 注意:newkey的值如果存在执行失败,不存在才能成功
2. 对所有key排序(适用于list、set、sorted_set)
sort key
3. 其他key通用操作
help @generic
数据库通用指令
db 基本操作
1. 切换数据库
select index index值是0-15 默认操作的库是0
2. 其他操作
quit
ping 通过此命令可以判断与服务器是否连通,如果连通会返回pong
echo message
db 相关操作
1. 数据移动(移动删除操作,本库指定的key值删除)
move key db db指库的索引值(0-15)
注意:
本库必须存在该key值否则移动失败
移到其他库必须保证要移动的库里不存在要移的key否则移动失败
2. 数据清除
dbsize 查看库里所有key的数量
flushdb 删除本库的的所有数据
flushall 删除所有库里的所有数据
Linux环境下启动redis
在Redis内,我们可以使用EXPIRE或EXPIREAT设置key的过期时间,Redis内存达到maxmemory限制后,Redis内存就会施行过期数据淘汰策略。
过期删除策略通常有三种:定时删除、惰性删除、定期删除,目前Redis使用的过期键删除策略为惰性删除和定期删除,两种策略配合使用。
惰性删除,指当某个key值过期之后,该key值不会马上被删除,只有当读或者写一个已经过期的key时,才会触发惰性删除策略,此时该key完成删除。
定期删除,指每隔一段时间就会扫描一定数量数据库的expires字典内一定数量的key,并删除里面过期的key。
由于惰性删除无法保证过期数据被及时删除掉,所以Redis采用惰性删除,定期删除相结合的方法,
可以帮助实现定期主动淘汰已过期的key,从而使cpu和内存资源达到最优的平衡效果。