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) 与范围查询, bitmaps, hyperloglogs 和 地理空间(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, 自动排序。