一文搞定Redis五大数据类型及使用场景( 二 )


一文搞定Redis五大数据类型及使用场景文章插图
集合集合类型也可以保存多个字符串元素 , 与列表不同的是 , 集合中不允许有重复元素并且集合中的元素是无序的 。 一个集合最多可以存储2^32-1个元素 。
4.1 内部编码集合类型的内部编码有两种:

  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时 , redis会选用intset来作为集合的内部实现 , 从而减少内存的使用 。
  • hashtable(哈希表):当intset不能满足要求时 , 会使用hashtable 。
4.2 使用场景4.2.1 用户标签例如一个用户对篮球、足球感兴趣 , 另一个用户对橄榄球、乒乓球感兴趣 , 这些兴趣点就是一个标签 。 有了这些数据就可以得到喜欢同一个标签的人 , 以及用户的共同感兴趣的标签 。 给用户打标签的时候需要①给用户打标签 , ②给标签加用户 , 需要给这两个操作增加事务 。
  • 给用户打标签
sadd user:1:tags tag1 tag2
  • 给标签添加用户
sadd tag1:users user:1sadd tag2:users user:1使用交集(sinter)求两个user的共同标签
sinter user:1:tags user:2:tags4.2.2 抽奖功能集合有两个命令支持获取随机数 , 分别是:
  • 随机获取count个元素 , 集合元素个数不变
srandmember key [count]
  • 随机弹出count个元素 , 元素从集合弹出 , 集合元素个数改变
spop key [count]用户点击抽奖按钮 , 参数抽奖 , 将用户编号放入集合 , 然后抽奖 , 分别抽一等奖、二等奖 , 如果已经抽中一等奖的用户不能参数抽二等奖则使用spop , 反之使用srandmember 。
一文搞定Redis五大数据类型及使用场景文章插图
有序集合有序集合和集合一样 , 不能有重复元素 。 但是可以排序 , 它给每个元素设置一个score作为排序的依据 。 最多可以存储2^32-1个元素 。
5.1 内部编码有序集合类型的内部编码有两种:
  • ziplist(压缩列表):当有序集合的元素个数小于list-max-ziplist-entries配置(默认128个)同时所有值都小于list-max-ziplist-value配置(默认64字节)时使用 。 ziplist使用更加紧凑的结构实现多个元素的连续存储 , 更加节省内存 。
  • skiplist(跳跃表):当不满足ziplist的要求时 , 会使用skiplist 。
5.2 使用场景5.2.1 排行榜用户发布了n篇文章 , 其他人看到文章后给喜欢的文章点赞 , 使用score来记录点赞数 , 有序集合会根据score排行 。 流程如下
用户发布一篇文章 , 初始点赞数为0 , 即score为0
zadd user:article 0 a有人给文章a点赞 , 递增1
zincrby user:article 1 azrevrangebyscore user:article 0 2zrangebyscore user:article 0 25.2.2 延迟消息队列下单系统 , 下单后需要在15分钟内进行支付 , 如果15分钟未支付则自动取消订单 。 将下单后的十五分钟后时间作为score , 订单作为value存入redis , 消费者轮询去消费 , 如果消费的大于等于这笔记录的score , 则将这笔记录移除队列 , 取消订单 。
一文搞定Redis五大数据类型及使用场景文章插图
总结在开发中 , 字符串类型是用的最多的数据类型 , 导致我们忽视了redis的其他四种数据类型 , 在具体场景下选择具体的数据类型对提升redis性能有非常大的帮助 。 redis虽然支持消息队列的实现 , 但是并不支持ack 。 所以redis实现的消息队列不能保证消息的可靠性 , 除非自己实现消息确认机制 , 不过这非常麻烦 , 所以如果是重要的消息还是推荐使用专门的消息队列去做 。
一文搞定Redis五大数据类型及使用场景文章插图
一文搞定Redis五大数据类型及使用场景文章插图
一文搞定Redis五大数据类型及使用场景文章插图
【一文搞定Redis五大数据类型及使用场景】点分享
一文搞定Redis五大数据类型及使用场景文章插图
一文搞定Redis五大数据类型及使用场景文章插图