0%

redis之set

集合对象的编码可以是intset或者hashtable。

一、原理

集合对象set是string类型(整数也会转换成string类型进行存储)的无序集合。

注意集合和列表的区别:集合中的元素是无序的,因此不能通过索引来操作元素;集合中的元素不能有重复。

集合对象的编码可以是intset或者hashtable。

  1. intset编码:intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合中。

intset编码

  1. hashtable编码:hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象(即集合中的元素),而字典的值则全部设置为null。

hashtable编码

  1. 编码转换:当集合同时满足以下两个条件时,使用 intset 编码:
    • 集合对象中所有元素都是整数
    • 集合对象所有元素数量不超过512

不能满足这两个条件的就使用hashtable编码。

第二个条件可以通过配置文件的set-max-intset-entries进行配置。

二、常用命令

  1. 添加集合元素 sadd key member [member ...]
  2. 删除集合元素 srem key member [member ...]
  3. 查看集合元素 smembers key
  4. 取交集 sinter key [key ...]
    • 返回给定所有集合的交集并存储在destination(键)中 sinterstore destination key [key ...]
  5. 取差集 sdiff key [key ...]
    • 返回给定所有集合的差集并存储在destination(键)中 sdiffstore destination key [key ...]
  6. 取并集 sunion key [key ...]
    • 所有给定集合的并集存储在destination(键)集合中 sunionstore destination key [key ...]
  7. 判断member元素是否是集合key的成员 sismember key member
  8. 取集合元素的个数 scard key
  9. 随机删除集合的某个/count个元素 spop key [count]
  10. 随机获取集合的某个/count个元素 srandmember key [count]

三、DEMO

应用1:计算共同好友

  1. 初始化用户1和2的好友列表
    • 添加用户1的好友列表 sadd user:1:friend 1 2 4
    • 添加用户2的好友列表 sadd user:2:friend 2 3 4
  2. 查看好友列表
    • 用户1 smembers user:1:friend
    • 用户2 smembers user:2:friend
  3. 查看用户1和2共同好友 sinter user:1:friend user:2:friend
  4. 删除用户1的某个好友 srem user:1:friend 2
  5. 是用户1不是用户2的好友 sdiff user:1:friend user:2:friend
  6. 判断1是否是用户1的好友 sismember user:1:friend 1
  7. 查看用户1好友的个数 scard user:1:friend
  8. 随机删除用户2某个好友 spop user:2:friend
  9. 随机取用户2的两个好友 srandmember user:2:friend 2

四、实验

  1. sadd type_set 1 2 3
  2. object encoding type_set
  3. sadd type_set a b c
  4. object encoding type_set