zoukankan      html  css  js  c++  java
  • Redis 笔记与总结4 set 和 zset 类型

    (一)set 类型

    set 是集合是 string 类型的无序集合。 set 元素最大可以包含(2 的 32 次方)个元素。set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都

    是O(1)。 hash table 会随着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久

    后就会改用跳表( skip list)来实现,跳表已经在 sorted set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集

    (union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns 中的好友推荐和 blog 的 tag 功能。

    sadd 方法

    向名称为 key 的 set 中添加方法。

    smembers 方法

    查看 set 中的元素。

    【例】

    sadd “集合的名称” “集合的元素”

    127.0.0.1:6379> sadd myset1 one
    (integer) 1
    
    127.0.0.1:6379> sadd myset1 two
    (integer) 1
    
    127.0.0.1:6379> sadd myset1 two
    (integer) 0
    
    127.0.0.1:6379> smembers myset1
    1) "two"
    2) "one"

    注意:集合中不允许有重复的元素。

    srem 方法(rem:remove)

    删除名称为 key 的 set 中的元素。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "two"
    2) "one"
    
    127.0.0.1:6379>  srem myset1 one
    (integer) 1
    
    127.0.0.1:6379> smembers myset1
    1) "two"
    
    127.0.0.1:6379>  srem myset1 one
    (integer) 0
    
    127.0.0.1:6379> smembers myset1
    1) "two"

    spop 方法

    随机返回并删除名称为 key 的 set 中的一个元素。

    【例】

    127.0.0.1:6379> smembers myset1
     1) "three"
     2) "five"
     3) "seven"
     4) "one"
     5) "four"
     6) "eight"
     7) "six"
     8) "ten"
     9) "two"
    10) "nine"
    
    127.0.0.1:6379> spop myset1
    "one"
    
    127.0.0.1:6379> spop myset1
    "seven"
    
    127.0.0.1:6379> spop myset1
    "five"
    
    127.0.0.1:6379> spop myset1
    "ten"
    
    127.0.0.1:6379> smembers myset1
    1) "three"
    2) "four"
    3) "six"
    4) "eight"
    5) "two"
    6) "nine"

    sdiff 方法

    返回所有给定 set 与第一个 set 的差集(与 PHP 中 array_diff() 方法类似)。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "one"
    2) "two"
    
    127.0.0.1:6379> smembers myset2
    1) "two"
    2) "three"
    
    127.0.0.1:6379> sdiff myset1 myset2
    1) "one"
    
    127.0.0.1:6379> sdiff myset2 myset1
    1) "three"

    sdiffstore 方法

    返回所有给定 set 与第一个 set 的差集(和 sdiff 一样),并将结果存为另一个 set。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "one"
    2) "two"
    
    127.0.0.1:6379> smembers myset2
    1) "three"
    2) "two"
    
    127.0.0.1:6379> sdiffstore myset3 myset1 myset2
    (integer) 1
    
    127.0.0.1:6379> smembers myset3
    1) "one"

    sinter 方法

    返回所有给定 set 的交集。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "one"
    2) "two"
    
    127.0.0.1:6379> smembers myset2
    1) "three"
    2) "two"
    
    127.0.0.1:6379> sinter myset1 myset2
    1) "two"

    sinterstore 方法

    返回所有给定 set 的交集,并将结果存为另一个 set。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "one"
    2) "two"
    
    127.0.0.1:6379> smembers myset2
    1) "three"
    2) "two"
    
    127.0.0.1:6379> sinterstore myset4 myset1 myset2
    (integer) 1
    
    127.0.0.1:6379> smembers myset4
    1) "two"

    sunion 方法

    返回所有给定 set 的并集。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "one"
    2) "two"
    
    127.0.0.1:6379> smembers myset2
    1) "three"
    2) "two"
    
    127.0.0.1:6379> sunion myset1 myset2
    1) "three"
    2) "one"
    3) "two"

     sunionstore 方法

    返回所有给定 set 的并集,并将结果存为另一个 set。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "one"
    2) "two"
    
    127.0.0.1:6379> smembers myset2
    1) "three"
    2) "two"
    
    127.0.0.1:6379> sunionstore myset5 myset1 myset2
    (integer) 3
    
    127.0.0.1:6379> smembers myset5
    1) "three"
    2) "one"
    3) "two"

    smove 方法(从第一个集合中剪切、粘贴到第二个集合中)

    从第一个 key 对应的 set 中移除 member 并添加到第二个对应的 set 中。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "one"
    2) "two"
    
    127.0.0.1:6379> smove myset1 myset6 one
    (integer) 1
    
    127.0.0.1:6379> smembers myset6
    1) "one"
    
    127.0.0.1:6379> smembers myset1
    1) "two"

    scard 方法

    返回名称为 key 的set 的元素个数。

    【例】

    127.0.0.1:6379> smembers myset1
    1) "two"
    
    127.0.0.1:6379> scard myset1
    (integer) 1
    
    127.0.0.1:6379> smembers myset2
    1) "three"
    2) "two"
    
    127.0.0.1:6379> scard myset2
    (integer) 2

    sismember 方法(类似 PHP 中的 in_array() 方法)

    测试 member 是否是名称为 key 的 set 的元素。

    【例】

    127.0.0.1:6379> smembers myset2
    1) "three"
    2) "two"
    
    127.0.0.1:6379> sismember myset2 one
    (integer) 0
    
    127.0.0.1:6379> sismember myset2 two
    (integer) 1

    srandmember 方法

    随机返回名称为 key 的 set 的一个元素,但不删除元素。

    【例】

    127.0.0.1:6379> smembers myset5
    1) "three"
    2) "one"
    3) "two"
    
    127.0.0.1:6379> srandmember myset5
    "two"
    
    127.0.0.1:6379> srandmember myset5
    "two"
    
    127.0.0.1:6379> srandmember myset5
    "three"

    (二)sorted set 类型

    sorted set 是 set 的一个升级版本, 它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后, zset 会自动重新按

    新的值调整顺序。可以理解为有两列的 mysql 表,一列存 value,一列存顺序。操作中 key 理解为 zset 的名字。

    和 set 一样 sorted set 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double 类型的 score。 sorted set 的实现是 skip list 和 hash

    table 的混合体。

    当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个元素获取 score 的开销是 O(1),另一个 score 到元素的映射被

    添加到 skip list,并按照 score 排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是 O(log(N))和 skip list 的开销一致,redis 的 skip list

    实现用的是双向链表,这样就可以逆序从尾部取元素。 sorted set 最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为 score 存储,对象的

    id 当元素存储。

    zadd 方法

    向名称为 key 的zset 中添加元素 member,score 用于排序。如果该元素存在,则更新其顺序。

    【例】

    127.0.0.1:6379> zadd myzset 1 one
    (integer) 1
    
    127.0.0.1:6379> zadd myzset 2 two
    (integer) 1
    
    127.0.0.1:6379> zadd myzset 3 three
    (integer) 1
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    
    127.0.0.1:6379> zadd myzset 4 three
    (integer) 0
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "4"
    
    127.0.0.1:6379> zrange myzset 0 -1
    1) "one"
    2) "two"
    3) "three"

    zrem 方法

    删除名称为 key 的 zset 中的元素 member。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "4"
    
    127.0.0.1:6379> zrem myzset three
    (integer) 1
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"

    zincrby 方法

    如果存在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则向该集合中添加该元素,其 score 值为 increment。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    
    127.0.0.1:6379> zincrby myzset 2 one
    "3"  #one 的顺序号变为3
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "two"
    2) "2"
    3) "one"
    4) "3"
    
    127.0.0.1:6379> zincrby myzset 2 three
    "2"
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "2"
    3) "two"
    4) "2"
    5) "one"
    6) "3"

    【例2】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "2"
    3) "two"
    4) "2"
    5) "one"
    6) "3"
    
    127.0.0.1:6379> zincrby myzset -2 three
    "0"
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3"

    zrank 方法

    返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序),即下标。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3"
     
    127.0.0.1:6379> zrank myzset one
    (integer) 2 #返回索引
    
    127.0.0.1:6379> zrank myzset two
    (integer) 1
    
    127.0.0.1:6379> zrank myzset three
    (integer) 0
    
    127.0.0.1:6379> zrank myzset four
    (nil)

    zrevrank 方法

    rev :翻转。返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序),即下标。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3"
    
    127.0.0.1:6379> zrevrank myzset one
    (integer) 0
    
    127.0.0.1:6379> zrevrank myzset two
    (integer) 1
    
    127.0.0.1:6379> zrevrank myzset three
    (integer) 2

    说明:zrevrank 先降序排序,再找索引。

    zrevrange 方法

    返回名称为 key 的 zset(按 score 从大到小顺序)中的 index 从 start 到 end 的所有元素(按照索引 score 降序排序)。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3"
    
    127.0.0.1:6379> zrevrange myzset 0 -1 withscores
    1) "one"
    2) "3"
    3) "two"
    4) "2"
    5) "three"
    6) "0"

    zrangebyscore 方法

    返回集合中 score 在给定区间的元素。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3"
    
    127.0.0.1:6379> zrangebyscore myzset 2 3 withscores #找到索引2-3范围内的所有元素
    1) "two"
    2) "2"
    3) "one"
    4) "3" 

    zcount 方法

    返回集合中 score 在给定区域的数量。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3"
    
    127.0.0.1:6379> zcount myzset 2 3 
    (integer) 2
    127.0.0.1:6379> zcount myzset 0 3 
    (integer) 3

    zcard 方法

    返回 zset 中所有元素的个数。

    【例】

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3"
    
    127.0.0.1:6379> zcard myzset
    (integer) 3

    zremrangebyrank 方法

    删除集合中排名在给定区间的元素(按索引删除)。

    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "two"
    4) "2"
    5) "one"
    6) "3" 
    
    127.0.0.1:6379> zremrangebyrank myzset 1 1 #索引的1到1
    (integer) 1 
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
    3) "one"
    4) "3"

     zremrangebyscore 方法

    删除集合中 score 在给定区间的元素(按顺序删除)。

    127.0.0.1:6379> zrange myzset 0 -1 withscores
     1) "three"
     2) "0"
     3) "two"
     4) "2"
     5) "one"
     6) "3"
     7) "four"
     8) "4"
     9) "five"
    10) "5"
    
    127.0.0.1:6379> zremrangebyscore  myzset 2 5
    (integer) 4
    
    127.0.0.1:6379> zrange myzset 0 -1 withscores
    1) "three"
    2) "0"
  • 相关阅读:
    Python13_安装、解释器
    Python12_关于文件概念的讨论与序列化
    Python11_文件的读写
    which | whereis |locate |find
    tail命令 | head命令
    cat 命令|more命令|less命令
    数据库模型设计,第一范式、第二范式、第三范式简单例子理解
    json
    正则表达式
    SFTP相关命令
  • 原文地址:https://www.cnblogs.com/dee0912/p/4596511.html
Copyright © 2011-2022 走看看