Redis常见应用场景!

登录鉴权:

用户登录鉴权,以及对应的登录验证码或Token到期失效。

  • Redis Key的超时失效功能,非常适合于这种业务场景。

计数器:

类似于知乎的帖子点赞、收藏,电商的库存扣减等。

  • 在高并发场景下,用MySQL数据库去硬扛这种读写压力是比较吃力的。

Redis的INCR、DECR、INCRBY、DECRBY相关命令,则解决了这个问题。

粉丝关注:

Set是一个无序的天然去重的集合

  • 即:Key-Set。

Set还提供了求交集、求并集等一系列直接操作集合的方法

  • 非常适合于求共同或单方好友、粉丝、爱好之类的业务场景。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
redis> SADD Tony Mary    //Mary成为了Tony的粉丝
(integer) 1
redis> SADD Tony Lynn //Lynn成为了Tony的粉丝
(integer) 1
redis> SMEMBERS Tony //Tony的粉丝列表
1) "Mary"
2) "Lynn"
redis> SADD Tom Mary //Mary成为了Tom的粉丝
(integer) 1
redis> SADD Tom Eric //Eric成为了Tom的粉丝
(integer) 1
redis> SMEMBERS Tom //Tom的粉丝列表
1) "Mary"
2) "Eric"
redis> SINTER Tony Tom //Tony和Tom的共同粉丝
1) "Mary"
redis> SUNION Tony Tom //Tony和Tom的所有粉丝
1) "Mary"
2) "Lynn"
3) "Eric"
redis> SDIFF Tony Tom //Tony的粉丝,但不是Tom的粉丝
1) "Lynn"
redis> SDIFF Tom Tony //Tom的粉丝,但不是Tony的粉丝
1) "Eric"

排行榜:

Zset(SortedSet),是Set的可排序版。

通过增加一个排序属性score来实现的

  • 适用于排行榜和时间线之类的业务场景,且在高并发场景下具备非常优秀的性能。

防刷:

防刷:用户在极短时间内,频繁发起请求去调用系统中的某个接口,该情况下需要对其进行限制。

举例:限制用户每秒钟只能下单一次,若用户在一秒钟内连续三次下单

  • 这时只有第一个下单是成功的,其他两个会通过Redis的过期时间机制,对其进行限制。

消息队列:

Redis可以通过list数据结构实现消息队列的功能,这样可以在电商秒杀

  • 或者在线教育集中约课等高并发写场景下,提供消峰功能。

浏览器历史记录:

每当访问一个新的网页,浏览器就会自动存储下来

  • 当点击 后退 按钮时,最近一次访问的网页就会展示出来。

可以通过Redis list来实现栈功能,进而实现浏览器历史记录场景。

用户签到:

用户签到、用户出勤、当天活跃用户等场景,用Redis Set数据结构也可以实现

  • 但用户量级庞大的情况下,会极大占用内存空间。

这种情况下,非常适合Redis BitMap数据结构,通过其bit位来进行状态存储。

网站UV统计:

通过Redis Set存储用户ID的方式进行解决,非常耗费内存空间

  • 可以使用HyperLogLog

Redis HyperLogLog 提供不精确的去重计数方案,标准误差是 0.81%

  • 但仅仅占用12k的内存空间,非常适用于大型网站UV统计这种空间消耗巨大,但数据不需要特别精确的业务场景。

统计一个亿的Keys

HyperLogLog:

Redis提供了一个扩展类型HyperLogLog用于基数统计,计算2^64个元素大概只需要12KB的内存空间。

但是HyperLogLog是存在误差的,大概是在0.81%,如果需要精准的统计,还是需要使用Set