文章目录
常见应用场景
这里只是简单记录一下应用场景,每个应用场景的使用细节上都需要优化。
1. 缓存
Redis相比其他缓存,有一个非常大的优势,就是支持多种数据类型。
数据类型 | 说明 |
---|---|
string | 字符串,最简单的k-v存储 |
hash | hash格式,value为field和value,适合ID-Detail这样的场景。 |
list | 简单的list,顺序列表,支持首位或者末尾插入数据 |
set | 无序list,查找速度快,适合交集、并集、差集处理 |
sorted set | 有序的set |
2. 排行榜
排行榜按照得分进行排序,例如,展示最近、最热、点击率最高、活跃度最高等等条件的top list。
可以使用有序集合sorted set
.
3. 计数器
数据统计的需求非常普遍,通过原子递增保持计数。例如,点赞数、收藏数、分享数等。
用到的命令:
命令 | 说明 |
---|---|
incr | 自增 |
incrby | 自定义自增步长 |
decr | 自减 |
decrby | 自定义自减步长 |
4. 最热前N条数据
可以使用list
实现有限集合
用到的命令:
命令 | 说明 |
---|---|
lpush | 将一个或多个值 value 插入到列表 key 的表头 |
ltrim | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
5. 分布式锁
利用Redis单线程的特性
用到的命令:
命令 | 说明 |
---|---|
NX | 不存在才能设置成功 |
PX | 毫秒级过期时间 |
获取所得命令:
SET resource_name my_random_value NX PX 30000
删除锁的Lua脚本
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
6. 订阅发布
Redis 通过 PUBLISH
、SUBSCRIBE
等命令实现了订阅与发布模式
7. 分布式session
使用Redis进行会话缓存。例如,将web session存放在Redis中。
8. 限速
先获取 key 的当前值,如果没有超出限制再执行 INCR 增1,如果 key 不存在,使用 redis 的事务初始化 key 和过期时间。
GET
+ INCR
+ EXPIRE
伪代码:
count = redis.GET(key)
if redis return nil {
redis.MULTI
redis.INCR(key)
redis.EXPIRE(key, expire_time)
redis.EXEC
count = 1
}
if count > limit {
return 超出限制
} else {
redis.INCR(key)
}
9. 队列、阻塞队列
Redis能作为一个很好的消息队列来使用,通过list的 lpop
及lpush
接口进行队列的写入和消费,本身性能较好能解决大部分问题。
lpush
+ brpop
阻塞队列。
但是,不提倡使用,更加建议使用rabbitmq等服务,作为消息中间件。
10. 用户标签
使用set
可以给用户添加标签,同时可以通过交集、并集等操作实现部分社交需求。
11. 随机数、抽奖
使用set
的 spop
/srandmember
生成随机数
用到的命令:
命令 | 说明 |
---|---|
spop | 移除并返回集合中的一个随机元素 |
srandmember | 返回集合中的一个随机元素 |
12. 网站用户的访问记录
每个独立用户对网站的访问记录
- 将每个独立用户是否访问过网站保存到Bitmaps中,将方位的用户标识为1,没有访问过得用户标识为0;
setbit unique:users:2018-09-19 ${userId} 1
其中${userId}
为偏移量 - 获取id为8的用户是在在***2018-09-19***访问过网站
getbit unique:users:2018-09-19 8
- 获取 2018-09-19 这一天独立访问的用户数
bitcount unique:users:2018-09-19
- 获取 2018-09-19 和 2018-09-20 这两天都访问过网站的用户
bitop and unique:users:2018-09-19-20 unique:users:2018-09-19 unique:users:2018-09-20
- 计算 2018-09-19 访问过网站的最小用户id
bitops unique:users:2018-09-19-20 1
另外可以通过HyperLogLog实现上面部分功能:
https://mp.csdn.net/mdeditor/82772904#
关于Bitmaps可以查看另一边笔记
https://blog.csdn.net/zhang_Red/article/details/82772036
13. 地理位置
Redis 在 3.2 版本以后增加了地理位置 GEO 功能,支持存储地理位置信心用来实现注入附近位置、摇一摇等依赖地理位置的功能。
参考: https://blog.csdn.net/zhang_Red/article/details/82775136