redis的一般使用场景

355 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

首先我们聊聊redis的使用场景。

1、数据的缓存

热点数据的缓存 由于redis访问速度块、⽀持的数据类型⽐较丰富,所以redis很适合⽤来存储热点数据,另外结合expire,可以设置过期时间。 登录token缓存,设置过期时间,过期token失效。 查询结果缓存,查询结果根据设置key放入缓存,下次进来先访问redis,命中则返回,不用每次直接访问数据库。为保证数据一致性,只在数据库查询后将对象放入缓存,如果对象发生了修改或删除操作,直接清除对应缓存(或设为过期);在数据库新增和查询后将对象放入缓存,修改后更新缓存,删除后清除对应缓存(或设为过期)

2、限时业务的运⽤

redis中可以使⽤expire命令设置⼀个键的⽣存时间,到时间后redis会删除它。利⽤这⼀特性可以运⽤在限时的优惠活动信息、⼿机验证码等业务场景。

3、计数器限流,全局ID

redis由于incrby命令可以实现原⼦性的递增,所以可以运⽤于⾼并发的秒杀活动、分布式序列号的⽣成、具体业务还体现在⽐如限制⼀个⼿机号发多少条短信、⼀个接⼝⼀分钟限制多少请求、⼀个接⼝⼀天限制调⽤多少次等等。

4、新闻热榜排⾏榜

关系型数据库在排⾏榜⽅⾯查询速度普遍偏慢,所以可以借助redis的SortedSet进⾏热点数据的排序。 举例: 在奶茶活动中,我们需要展⽰各个部门的点赞排⾏榜, 所以我针对每个部门做了⼀个SortedSet,然后以⽤户的openid作为上⾯的username,以⽤户的点赞数作为上⾯的score, 然后针对每个⽤户做⼀个hash,通过zrangebyscore就可以按照点赞数获取排⾏榜,然后再根据username获取⽤户的hash信息,这个当时在实际运⽤中性能体验也蛮不错的。

5、分布式锁

这个主要利⽤redis的setnx命令进⾏,setnx:"set if not exists"就是如果不存在则成功设置缓存同时返回1,否则返回0 ,后台运⽤服务器是集群的,定时任务可能在两台机器上都会运⾏,所以在定时任务中⾸先 通过setnx设置⼀个lock,如果成功设置则执⾏,如果没有成功设置,则表明该定时任务已执⾏。 当然结合具体业务,我们可以给这个lock加⼀个过期时间,⽐如说30分钟执⾏⼀次的定时任务,那么这个过期时间设置为⼩于30分钟的⼀个时间 就可以,这个与定时任务的周期以及定时任务执⾏消耗时间相关。 当然我们可以将这个特性运⽤于其他需要分布式锁的场景中,结合过期时间主要是防⽌死锁的出现

6、点赞、好友等相互关系的存储

Redis set对外提供的功能与list类似是⼀个列表的功能,特殊之处在于set是可以⾃动排重的,当你需要存储⼀个列表数据,⼜不希望出现重复数据时,set是⼀个很好的选择,并且set提供了判断某个成员是否在⼀个set集合内的重要接⼝,这个也是list所不能提供的。 ⼜或者在微博应⽤中,每个⽤户关注的⼈存在⼀个集合中,就很容易实现求两个⼈的共同好友功能。这个在奶茶活动中有运⽤,就是利⽤set存储⽤户之间的点赞关联的,另外在点赞前判断是否点赞过就利⽤了sismember⽅法,当时这个接⼝的响应时间控制在10毫秒内,⼗分⾼效。

7、消息队列

list的数据结构实现是双向链表,有lpush和rpop这样的命令,所以能够便捷的应用于消息队列(生产者 / 消费者模型)。 消息的生产者只需要通过lpush将消息放入 list,消费者便可以通过rpop取出该消息,并且可以保证消息的有序性。如果需要实现带有优先级的消息队列也可以选择sorted set

List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间 blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

8、抽奖

利用set结构的无序性,通过 Spop( Redis Spop 命令用于移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素。 ) 随机获得值

9、点赞、签到、打卡

利用set结构实现。 假如上面的朋友圈动态ID是 wx1001,用户ID是u3001,用 like:t1001 来维护 t1001 这条微博的所有点赞用户; 点赞了这条微博:sadd like:wx1001 u3001; 取消点赞:srem like:wx1001 u3001; 是否点赞:sismember like:wx1001 u3001; 点赞的所有用户:smembers like:wx1001; 点赞数:scard like:wx1001。