Redis 高级特性及其相关使用场景

redis : Remote Dictionary Service的首字母缩写,也就是「远程字典服务」。

expire 过期时间

redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。

  1. 过期时间可以设置为秒或者毫秒精度。
  2. 过期时间分辨率总是 1 毫秒。
  3. 过期信息可以被持久化(持久化一个时间戳)。

使用场景

  1. 限时的优惠活动信息
  2. 网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)
  3. 手机验证码
  4. 限制网站访客访问频率(例如:1分钟最多访问10次)

redis管道(pipeline)

redis的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java的客户端(jedis)中是可以使用的。

在插入更多数据的时候,管道的优势更加明显:测试10万条数据的时候,不使用管道要40秒,实用管道378毫秒。

缓存场景

由于缓存一致性原因,缓存的内容需要考虑业务需求,如点赞数,排行榜,手机验证码,token可以缓存,但是像订单数据这种可以就必须要有保证redis和DB数据一致性。

各种计数

商品维度计数(喜欢数,评论数,鉴定数,浏览数,etc)

订单缓存

订单列表数据在缓存中,是以用户的唯一标识作为键,以一个按下单时间倒序的有序集合为值进行存储的。redis的sorted set中每个元素都有一个分数用以作为排序的基础,保证分数score唯一就可以通过score来查询数据。

订单列表数据只需要缓存用户的最新几条数据。如规定一个阈值N,超过这个值就从DB中查,否则直接读Redis。

保证数据一致性,先更新数据库,再更新缓存。

如果缓存操作失败,可以先重试,重试失败的话可以把失败的消息交给mq,通过消费mq来更新缓存。

会话缓存

单机版缓存(服务内),缓存没有办法在服务器间得到共享;资源浪费;缓存穿透率较高。

使用缓存服务器Redis memcached:缓存在服务器间共享;资源浪费减少;缓存穿透率低。

https://my.oschina.net/barryhome/blog/4512213

  • 对多端共享支持友好
  • 对多端共享会话支持友好
  • 实现方式相对简单

分布式锁的场景

SET key value [EX seconds] [NX]。其中可选参数EX second :设置键的过期时间为 second 秒;NX :只在键不存在时,才对键进行设置操作。这个命令相当于setNx和expire两个命令的原子操作命令。

订单使用分布式锁的场景是订单状态有变更的时候,需要先使用锁–>读缓存数据–>判断当前订单状态是否允许变更为别的状态–>更新缓存中的订单状态–>释放锁。

分布式锁Redis实现和Redission实现(lua脚本和看门狗,lua脚本可以实现原子性操作)。一文搞懂分布式锁及其业务场景