Redis开发与运维读书笔记之七

第2章 API的理解和使用 第5部分

集合

集合Set用来保存多个字符串,但不允许重复,且元素是无序的,不能通过索引获得下标。

集合支持取交集、并集、差集,可以解决实际问题。

命令
[list]
  • 集合内操作:
  • [list]
  • 添加元素
  • sadd key element [element ...]
  • 删除元素
  • srem key element [element ...]
  • 计算元素个数
  • scard key
  • 判断元素是否在集合中
  • sismember key element
  • 随即从集合中返回指定个数元素
  • srandmember key [count]

    count不写,默认为1
  • 从集合中随机弹出元素
  • spop key
  • 获取所有元素
  • smemebers key

    [/list]
  • 集合间操作
  • [list]
  • 交集
  • sinter key [key ...]
  • 并集
  • sunion key [key ...]
  • 差集
  • sdiff key [key ...]
  • 保存交集、并集、差集
  • sinterstore destination key [key ...]
    sunionstore destination key [key ...]
    sdiffstore  destination key [key ...]
    
  • [/list]
    [/list]

    内部编码
    • intset:当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset作为集合的内部实现,减少内存的使用
    • hashtable:当集合无法满足intset的条件时,Redis会选用hashtable作为集合的内部实现


    使用场景
    集合典型的使用场景是标签(tag),为不同标签客户推荐不同的产品等,用户和标签的关系应该在一个事务内自行,防止部分失败造成数据的不一致
    [list]
  • 给用户添加标签
  • sadd user:1:tags tag1 tag2 tag3
    sadd user:2:tags tag1 tag2 tag3
    
  • 给标签添加用户
  • sadd tag1:users user:1 user3
    sadd tag2:users user:1 user2 user3
    
  • 删除用户下的标签
  • srem user:1:tags tag1 tag5
    
  • 删除标签下的用户
  • srem tag1:users user:1
    srem tag2:users user:1
    
  • 计算用户共同感兴趣的标签
  • sinter user:1:tags user:2:tags
    

    [/list]
    上面是一个用集合实现标签的基本思路,实际的标签系统远为复杂,但集合的应用场景通常为:
    • sadd = Tagging(标签)
    • spop/srandmember = Random item(生成随机谁,如抽奖)
    • sadd + sinter = Social Graph (社交需求你,如人际关系图)

    猜你喜欢

    转载自xwhuang.iteye.com/blog/2378423