Redis 应用场景

2021/01/14 posted in  实践

Redis的应用场景,以及Redis数据类型的各种可能的应用方式

缓存功能

  1. Redis作为缓存,MySQL作为存储层,加速读写和降低后端压力
  2. 实现

计数功能

  1. 实现快速计数,查询缓存的功能,同时数据可以异步落地到其他数据源
  2. 注意的问题:防作弊,不同维度计数,数据持久化到数据源

共享Session

  1. 分布式Web应用共享Session
  2. 实现

限速

  1. 为了短信接口不被频繁访问,限制获取短信验证码的频率

Redis 对象应用场景

哈希

hgetall, 如果哈希数据较多会发生阻塞,如果获取部分则使用hmget,一定获取所有的则使用hscan

内部编码

  • ziplist : 哈希元素个数小于hash-max-ziplist-entries(512),同时所有的值小于hash-max-ziplist-value(64)的值使用ziplist作为内部实现;减少内存使用
  • hashtable : 无法满足ziplist的条件时

列表

存储多个有序的字符串,Redis中可以同时在头和尾进行操作,可以充当栈和队列的角色

操作图

特点

  • 元素有序
  • 元素可重复

内部编码

  • ziplist : 哈希元素个数小于hash-max-ziplist-entries(512),同时所有的值小于hash-max-ziplist-value(64)的值使用ziplist作为内部实现;减少内存使用
  • linkedList : 无法满足ziplist的条件时

使用场景

  • 消息队列:lpush+brpop
  • stack : lpush+lpop
  • queue : lpush+rpop
  • 有限集合:lpush+ltrim

集合

元素不重复,无序

内部编码

  • intset : 元素都是整数并且元素个数小于set-intset-max-entries(512),减少内存使用
  • hashtable : 无法满足intset时

使用场景

  • 标签 :sadd
  • 生成随机数: spop/srandmember
  • 社交需求: sadd + sinter

有序集合

有序集合元素不能重复,但是score可以重复

内部编码

  • ziplist : 哈希元素个数小于hash-max-ziplist-entries(128),同时所有的值小于hash-max-ziplist-value(64)的值使用ziplist作为内部实现;减少内存使用
  • skiplist : 当ziplist不满足时

使用场景

  1. 排行榜系统(点赞)
  • zadd+zincrby 获得点赞
  • zrem : 取消点赞
  • zrevrange : 获取最多点赞数
  • zsocre + zrank : 分数和排名