Redis常见的应用场景

常见应用场景

这里只是简单记录一下应用场景,每个应用场景的使用细节上都需要优化。

1. 缓存

Redis相比其他缓存,有一个非常大的优势,就是支持多种数据类型。

数据类型说明
string字符串,最简单的k-v存储
hashhash格式,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 通过 PUBLISHSUBSCRIBE等命令实现了订阅与发布模式

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的 lpoplpush接口进行队列的写入和消费,本身性能较好能解决大部分问题。
lpush + brpop阻塞队列。

但是,不提倡使用,更加建议使用rabbitmq等服务,作为消息中间件。

10. 用户标签

使用set可以给用户添加标签,同时可以通过交集、并集等操作实现部分社交需求。

11. 随机数、抽奖

使用setspop/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-192018-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值