浅谈 Redis 使用场景

"需求&成长"

Posted by Gordon on March 25, 2018

Redis官方

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster. Learn more →

Redis中文社区

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

使用场景说明

计数器

数据统计的需求非常普遍,通过原子递增保持计数。例如,点赞数、收藏数、分享数等。

1、首先我们需要计算所有出现过的用户设备号(SELECT distinct(user_device) FROM statistic_20180201 UNION SELECT distinct(user_device) FROM statistic_20180202),把这些设备号存在redis的集合中

($redis>sadd('user_device','6ab3d84ace678644f44645'))


2、再计算当天出现的所有设备号(SELECT distinct(user_device) FROM statistic_20180203),将这些设备号存在redis临时集合中

` ($redis>sadd(‘tmp_20180203’,’5a6vhbb84ace678fgv44f44645’); `


3、利用redis的sdiffstore命令,返回user_device和tmp_20180203两个集合的差集,这个新的new_20180203集合,就是当日(20180203)的新增用户,为避免占用内存,需给这个new_20180203集合设置过期时间,由于要算次日留存率,所以new_20180203集合的生存期设为1天(同理,要算七日留存率,则设置7天生存期);

($redis>sdiffstore('new_20180203',"user_device","tmp_20180203))

4、利用redis的SCARD命令,得出new_20180203这个集合的元素数量

($redis->SCARD('new_20180203'))

5、不要忘记,将当天的用户设备号合并进user_device集合中,利用redis的SUNIONSTORE命令$redis>sunionstore('user_device',"user_device","tmp_20170803"),再用$redis->del('tmp_20170803'),删除这个临时集合;

6、计算次日留存率,我们要计算8月4日出现的所有设备号(SELECT distinct(user_device) FROM statistic_20170804),将这些设备号存在redis临时集合中

($redis>sadd('tmp_20170804','5a6vhbb84ace678fgv44f44645');

7、利用redis的SINTERSTORE命令,$redis>sinterstore('next_day_retention',"new_20180203","tmp_20180204"),返回new_20180203和tmp_20180204两个集合的并集,就是8月3日新增的用户,8月4日也正常登陆的用户集合了;

8、利用redis的SCARD命令,得出next_day_retention这个集合的元素数量($redis->SCARD('next_day_retention')),就是当天新增的用户,在注册的第2天还登录的用户数;

9、之前给new_20180203这个集合设置一天的生存期就派上用场了,利用redis的SCARD命令,得出new_20180203这个集合的元素数量($redis->SCARD('new_20180203')),就是20170803新增的用户数量;

10、再通过除法运算,$redis>SCARD('next_day_retention') / $redis->SCARD('new_20180203'),得出的就是8月3日的次日留存率了。

排行榜

排行榜按照得分进行排序,例如,展示最近、最热、点击率最高、活跃度最高等等条件的top list。

用于存储时间戳

类似排行榜,使用redis的zset用于存储时间戳,时间会不断变化。例如,按照用户关注用户的最新动态列表。

记录用户判定信息

记录用户判定信息的需求也非常普遍,可以知道一个用户是否进行了某个操作。例如,用户是否点赞、用户是否收藏、用户是否分享等。

社交列表

社交属性相关的列表信息,例如,用户点赞列表、用户收藏列表、用户关注列表等。

缓存

缓存一些热点数据,例如,PC版本文件更新内容、资讯标签和分类信息、生日祝福寿星列表。

队列

Redis能作为一个很好的消息队列来使用,通过list的lpop及lpush接口进行队列的写入和消费,本身性能较好能解决大部分问题。但是,不提倡使用,更加建议使用rabbitmq等服务,作为消息中间件。

会话缓存

使用Redis进行会话缓存。例如,将web session存放在Redis中。

业务使用方式

  • String(字符串): 应用数, 资讯数等, (避免了select count(*) from …)
  • Hash(哈希表): 用户粉丝列表, 用户点赞列表, 用户收藏列表, 用户关注列表等。
  • List(列表):消息队列, push/sub提醒。
  • SortedSet(有序集合):热门列表, 最新动态列表, TopN, 自动排序。