Redis的应用场景,以及Redis数据类型的各种可能的应用方式
缓存功能
- Redis作为缓存,MySQL作为存储层,加速读写和降低后端压力
- 实现

计数功能
- 实现快速计数,查询缓存的功能,同时数据可以异步落地到其他数据源
- 注意的问题:防作弊,不同维度计数,数据持久化到数据源
共享Session
- 分布式Web应用共享Session
- 实现

限速
- 为了短信接口不被频繁访问,限制获取短信验证码的频率
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不满足时
使用场景
- 排行榜系统(点赞)
- zadd+zincrby 获得点赞
- zrem : 取消点赞
- zrevrange : 获取最多点赞数
- zsocre + zrank : 分数和排名
