Redis02 | 青训营笔记

78 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天,今天继续学习了redis的实用场景案例,并通过案例,学习了redis的特性(排序,限流,分布式锁)实现特性的方式(zset,key,setnx)

排行榜

千万级别的积分排序问题。如果使用MySQL,每个进来的访问的orderby排序,性能很差,如果出现数据操作变更,重排序。访问量大,MySQL崩溃。

Redis的数据结构zset来解决这个问题

RedisClient.ZAdd命令将数据添加到zset中去。

查询命令zrevrange ···zset 可以查询排序输出。

可以通过各种操作命令,对zset进行操作。

zset数据结构 zskiplist

跳跃表,很熟悉。通过构建子链,加快访问。

Redis里面 zset,是结合跳跃表和hash字典的

跳跃表找到了元素,还希望知道,元素对应的值是多少。此处用hash存储,快速访问,还可以用hash反查(

跳跃表一般不超过四层内部链表是双向链表,实现倒排。

限流

要求1s内放行的请求为N,超过N则禁止访问。

用redis的key作为限流的计数。每秒放行多少个。(这是计时计数器的操作,而不是令牌桶?)

分布式锁

出现在多个请求抢key(不能出现并发超限的问题)

使用redis的setnx实现,因为redis是单线程执行命令(get)排队,setnx只有未设置过才能执行成功。

案例只是体验setnx的特性,不是高可用的分布式锁实现

该实现存在的问题(需要搞清楚):

  1. 业务超时解锁,导致并发问题,业务执行时间超过锁超时时间。
  2. redis主备切换临界点问题,主备切换后,A持有的锁还未同步到新的主节点时,B可在新主节点获取
  3. redis集群脑裂(异常,投票多个主节点),导致出现多个主节点。