Redis在工作中的使用总结

Redis的奇技淫巧,你都知道哪些?

Posted by BY jie on December 5, 2020

心向明灯,定会重生

序言

2020年12月05日16:43:04 重新更新

本篇帖子的目的主要是为了记录自己在截止目前的项目开发工作中,redis在项目场景中的应用方法。以及一些踩过的坑。也算是做一次复习和回顾了(话说,这段时间怎么能这么冷啊 - -)。总的来说,我这边用到的Redis的地方,主要是分为了4类,包括常规缓存,统计在线人数,限流,使用排它锁来达到续期令牌的目的等。

redis版本:spring-data-redis:2.1.5.RELEASE
项目构建方式:build.gradle

1.常规缓存

一个项目中,总会存在些低频变动的数据。而这些低频变动的数据,就特别适合放在缓存中。采用的策略即是为它们设置一个较长的过期时间(1h,6h,12h,24h,一周等),然后放在缓存中。当数据过期或者是数据库中的数据有更新的时候,再把重新拉取最新数据,并重置缓存。另一方面,这种缓存数据,也能减少不必要的资源消耗(能省一点儿是一点儿咯,毕竟蚊子肉也是肉嘛)。同时,也能提高相关接口的响应速度。

存入缓存时,需要判断当前缓存对应的key是否存在 判断当前的缓存key是否存在 以账户信息为例 存储账户

2.在线人数统计

项目中有一个需求是要统计某个直播视频的在线观看人数。我们采用的策略即是,当一个用户进到直播页面的时候,就存入当前用户的登入的时间戳。存时间戳有一个好处是,它们的值会自动递增。相当于每一个人都能有自己的时间标识。然后为其设置过期时间(依据实际情况进行设定,我们设置的是1min)。在统计人数的时候,只要统计1min之内的key值有多少,就能得到具体的人数了。

方法图示 存入key 存入key 存入规则 存入规则 获取统计结果 获取统计结果

3.流量限制

这个是通过Redis自身的Increment锁去实现的。原理就是,存入一个key,并为其设定过期时间。在过期时间内,再有其它请求进入时,通过redis的方法判断当前的数量是否超过了限定值。如果没有,则让请求正常的进入到相应的业务处理环节中。反之,如果超过了,则抛出相应的提示说明,阻止当前的请求进入到正常的业务处理逻辑中。

并发场景下,使用Redis的Increment方法来限制请求数 限流

4.生成排它锁,解决线程安全的问题

虽然可以反复地从redis中获取到对象,用来做为是否要继续执行业务逻辑的操作依据。但这样做的一个弊端就是反复的序列化操作,会造成redis资源的无端消耗。所以我们采取了标识过期的思路。即为多个请求要竞争的资源指定一个标识,放入缓存中,同时设定好相应的过期时间。这样,在非过期时间中,只会有一个请求拥有操作资源的资格。从而旧达到了排它的目的。只有等特征标识过期后,下一个请求才能继续进入获取到竞争资源,跟着再去处理别的事项。这就是一种简单的排它锁思路,能有效地解决并发场景下的线程安全的问题。

利用排它锁,实现固定时间内的令牌刷新 把缓存过期作为一种锁来处理

5.网络上摘录的好帖子

springboot之使用redistemplate优雅地操作redis