Redis数据类型(String&List&Hash&Set&Sorted Sed)

一、String数据类型

  • String是redis最基本的数据类型,最大能存储512MB的数据
  • String数据类型是二进制安全的。可以存储任何数据(比如数字、图片、序列化对象等等)

1.1 APPEND & STRLEN

  • STRLEN:获取指定键的字符长度
  • APPEND:用于为指定的Key追加值
    • 如果该Key已经存在并且是一个字符串,append命令将value追加到Key原来的值末尾
    • 如果该Key不存在,append就简单的给该Key设为value,就像执行set key value一样
【STRLEN】
[root@localhost ~]# redis-cli -h 192.168.131.10 -p 6379  【登录数据库】
192.168.131.10:6379> keys *                              【查询所有key】
(empty list or set)
192.168.131.10:6379> exists q                            【判断该键是否存在】 
(integer) 0                                              【存在返回1,不存在返回0】





【APPEND】
192.168.131.10:6379> append q 10                         【因为q键不存在,所以append命令返回当前值的长度】
(integer) 2
192.168.131.10:6379> append q 100                        【因为q键已经存在,所以返回追加完“100”后的总长度】
(integer) 5
192.168.131.10:6379> get q                               【通过get命令获取q键,用来判断appedn的结果】
"10100"
192.168.131.10:6379> set q 20                            【通过set命令为q键设置新值,并覆盖原有值】
OK
192.168.131.10:6379> get q                               【获取q键的值】
"20"
192.168.131.10:6379> STRLEN q                            【获取指定键的字符长度】
(integer) 2

1.2 INCR & DECR & INCRBY & DECRBY

  • INCR:递增
  • DECR:递减
  • INCRBY:减少指定整数
  • DECRBY:增加指定整数
【INCR】
192.168.131.10:6379> set q1 100       【设置q1键的值为100】
OK
192.168.131.10:6379> incr q1          【q1键的值递增1(integer) 101




【DECR】
192.168.131.10:6379> decr q1          【q1键的值递减1(integer) 100
192.168.131.10:6379> del q1           【删除已经的q键】
(integer) 1                           【返回1说明删除成功】
192.168.131.10:6379> decr q1          【对空值的键进行递减操作,因为其原值被设定为0,所以递减后的值为-1(integer) -1
192.168.131.10:6379> get q2           【获取q2的值】
(nil)
192.168.131.10:6379> incr q2          【对空值的键进行递增操作,因为其原值被设定为0,所以递减后的值为1(integer) 1
192.168.131.10:6379> set q1 hello     【将q1键的值设为普通字符串】
OK
192.168.131.10:6379> incr q1          【因为q1键的值为不能转换为整形的字符串】
(error) ERR value is not an integer or out of range
192.168.131.10:6379> set q1 100       【将q1键的值设定为100】
OK




【DECRBY】
192.168.131.10:6379> decrby q1 50     【减少指定的整数】
(integer) 50




【INCRBY】
192.168.131.10:6379> incrby q1 30     【增加指定的指数】
(integer) 80

1.3 GETSET & SETEX & SETNX

  • GETSET: 获取指定键的值同时并将其设置为新值,这两个操作同时完成
  • SETEX:设置指定键的过期时间(返回值-1:永不过期;返回值-2:已经过期)
  • SETNX:在指的键不存在时,为该键设置指的的值
【Getset】
192.168.131.10:6379> set qz 30        【设置qz键的值为30】
OK
192.168.131.10:6379> get qz           【获取qz键的值】
"30"
192.168.131.10:6379> INCR qz          【将qz键的值递增1(integer) 31
192.168.131.10:6379> GETSET qz 300    【获取qz键的值的同时并将其设置为新值,这两个操作同时完成】
"31"
192.168.131.10:6379> get qz           【查看qz键的新值】
"300"



【Setex】
192.168.131.10:6379> setex qz1 15 take-easy   【设置qz1键的过期时间为15秒,值为take-easy】
OK
192.168.131.10:6379> ttl qz1                  【查看qz1键的剩余存活时间(秒数)】
(integer) 13
192.168.131.10:6379> ttl qz                   【返回值-1表示永不过期】
(integer) -1
192.168.131.10:6379> get qz1                  【在qz1键的存活期内我们依旧可以获取到值】
"take-easy"
192.168.131.10:6379> ttl qz1                  【返回值-2表示已经过期】
(integer) -2
192.168.131.10:6379> get qz1                  【获取过期的qz1键的值则返回nil】
(nil)



【Setnx】
192.168.131.10:6379[1]> SELECT 1             【切换到1号库】
OK
192.168.131.10:6379[1]> keys *               【该库无键】
(empty list or set)
192.168.131.10:6379[1]> SETNX qz take-easy   【因为qz键不存在,所以setnx命令执行成功】
(integer) 1
192.168.131.10:6379[1]> SETNX qz take        【因为qz键已经存在,所以本次设置不会产生或者替换旧值,即没有任何效果】
(integer) 0
192.168.131.10:6379[1]> get qz               【核实返回的值仍为第一次设置的值】
"take-easy"

1.4 MSET & MGET & MSETNX

  • MSET:批量设置
  • MGET:批量获取
  • MSETNX:批量设置,但如有重复的键则设置失败
【MSET&MGET】
192.168.131.10:6379[1]> mset qz1 take qz2 easy      【批量设置qz1和qz2两个键的值】
OK
192.168.131.10:6379[1]> mget qz1 qz2                【批量获取qz1和qz2两个键的值】
1) "take"
2) "easy"



【MSETNX】
192.168.131.10:6379[1]> msetnx qz3 good qz4 luck    【批量设置2个键的值,但是因为之前并无这2个键,所以命令执行成功】
(integer) 1 
192.168.131.10:6379[1]> mget qz3 qz4                【批量获取qz3和qz4键的值】
1) "good"
2) "luck"
192.168.131.10:6379[1]> msetnx qz3 good qz5 luck    【批量设置2个键的值,但是qz3键已经存在,所以命令执行失败】
(integer) 0
192.168.131.10:6379[1]> mget qz3 qz5       【获取刚才批量设置的qz3和qz5两个键的值,由于qz5键没有设置成功,所以返回nil】
1) "good"
2) (nil)

二、List数据类型

  • List(列表)的元素类型为string。安装插入顺序排序,在列表的头部或尾部添加元素

2.1 LPUSH &L PUSHX & LRANGE

  • LPUSH:创建键及其关联的列表,之后将参数中的值从左到右依次插入
  • LPUSHX:插入数据时当该键不存在,则不做任何操作。如果该键存在则插入成功并返回列表中当前元素的数量
  • LRANGE:取列表中的元素(0:第一个元素,-1:最后一个元素)
【LPUSH】
192.168.131.10:6379[1]> SELECT 2            【切换到2号库】
OK
192.168.131.10:6379[2]> keys *              【查询该库无键】
(empty list or set)
【因为qz键不存在,所以lpush会创建qz键及其关联的列表,之后将参数中的值从左到右依次插入】
【因为此处的“l”代表左,所以列表显示的将会是e w q r】
192.168.131.10:6379[2]> lpush qz q w e r    
(integer) 4
192.168.131.10:6379[2]> lrange qz 1 3       【取从位置1到位置3结束的3个元素】
1) "e"
2) "w"
3) "q"
192.168.131.10:6379[2]> LRANGE qz 0 -1      【取列表中全部元素。0:第一个元素,-1:最后一个元素】
1) "r"
2) "e"
3) "w"
4) "q"



【LPUSHX】
192.168.131.10:6379[2]> lpushx qz2 e        【因为该键不存在,所以lpushx命令不会进行任何操作,并返回值0(integer) 0
192.168.131.10:6379[2]> lpushx qz t         【因为该键存在,所以lpush命令插入成功,并返回列表中当前元素的数量】
(integer) 5



【LRANGE】
192.168.131.10:6379[2]> lrange qz 0 0       【读取该键的列表中所有值的头部元素】
1) "t"
192.168.131.10:6379[2]> lrange qz 0 -1
1) "t"
2) "r"
3) "e"
4) "w"
5) "q"

2.2 LPOP & LLEN

  • LPOP:移除键关联列表的第一个元素并返回,即从右往左第一个
  • LLEN:获取键关联列表中元素数量
【LPOP】
192.168.131.10:6379[2]> keys *
(empty list or set)
192.168.131.10:6379[2]> lpush qz q w e    【创建qz键及其关联的表】
(integer) 3
192.168.131.10:6379[2]> lrange qz 0 -1    【获取qz列表中全部数据】
1) "e"
2) "w"
3) "q"
192.168.131.10:6379[2]> lpop qz           【移除qz键关联列表的第一个元素并返回,即从右往左第一个】
"e"
192.168.131.10:6379[2]> lpop qz         
"w"


【LLEN】
【获取qz键的表中元素数量。因为执行了两次lpop,所以列表头部的两个元素均已被弹出,因此现在列表中元素的数量为1192.168.131.10:6379[2]> llen qz           
(integer) 1
192.168.131.10:6379[2]> lrange qz 0 -1
1) "q"

2.3 LREM & LSET & LINDEX & LTRIM

  • LREM:在列表中删除指定元素
  • LSET:将列表中某个元素设为新值
  • LINDEX:查看某索引的值
  • LTRIM:仅保留索引值x-y之间的元素(第x个和第y个元素均被保留)
【LREM】
192.168.131.10:6379> SELECT 5                    【切换到5号库】
OK
192.168.131.10:6379[5]> keys *                   【查看当前库所有键】
(empty list or set)
192.168.131.10:6379[5]> LPUSH qz q w e r q e     【创建qz键以及与其关联的列表,并将参数插入】
(integer) 6
192.168.131.10:6379[5]> lrem qz 2 q              【从头部(left)向尾部(right)变量列表中删除2个值为q的元素】 
(integer) 2                                      【返回的值为实际删除的数量】
192.168.131.10:6379[5]> LRANGE qz 0 -1           【查看删除后列表中的全部元素】
1) "e"
2) "r"
3) "e"
4) "w"




【LSET&LINDEX】
192.168.131.10:6379[5]> LINDEX qz 3              【获取索引值为3(头部的第二个元素)的元素值】
"w"
192.168.131.10:6379[5]> LSET qz 3 www            【将索引值为3(头部的第二个元素)的元素值设为新值www】
OK
192.168.131.10:6379[5]> LINDEX qz 3              【查看设置后的索引3的值】
"www"



【LTRIM】
192.168.131.10:6379[5]> LINDEX qz 6              【索引值6超过了列表中元素的数量,所以返回nil】
(nil)
192.168.131.10:6379[5]> lset qz 6 wwwwww         【设置的索引值6超过了列表中元素的数量,索引设置失败并返回错误信息】
(error) ERR index out of range
192.168.131.10:6379[5]> ltrim qz 0 2             【仅保留索引值0-2之间的3个元素(第0和第2个元素均被保留)】
OK
192.168.131.10:6379[5]> LRANGE qz 0 -1           【查看保留后的结果】
1) "e"
2) "r"
3) "e"

2.4 LINSERT

  • LINSERT:在元素前/后插入值
    • 如果被插入的元素不存在,则操作失败,并返回值为-1
    • 为不存在的键插入新元素,命令操作失败,返回值为0
192.168.131.10:6379[5]> SELECT 6                  【切换到6号库】
OK
192.168.131.10:6379[6]> keys *                    【查看该库所有键】
(empty list or set)
192.168.131.10:6379[6]> lpush qz q w e r t        【创建qz键以及与其关联的列表,并将参数插入】
(integer) 5
192.168.131.10:6379[6]> linsert qz before q q10   【在元素q前面插入新元素q10】
(integer) 6
192.168.131.10:6379[6]> lrange qz 0 -1            【查看结果】
1) "t"
2) "r"
3) "e"
4) "w"
5) "q10"
6) "q"
192.168.131.10:6379[6]> linsert qz after r r20    【在元素r后面插入新元素r20】
(integer) 7
192.168.131.10:6379[6]> lrange qz 0 -1            【查看结果】
1) "t"
2) "r"
3) "r20"
4) "e"
5) "w"
6) "q10"
7) "q"
192.168.131.10:6379[6]> linsert qz after rr r20   【如果被插入的元素不存在,则操作失败,并返回值为-1(integer) -1
192.168.131.10:6379[6]> keys *
1) "qz"
192.168.131.10:6379[6]> linsert qz1 after rr r20  【为不存在的键插入新元素,命令操作失败,返回值为0(integer) 0

2.5 RPUSH & RPUSHX & RPOPLPUSH

  • RPUSH:在键关联的列表中插入数据,顺序是从右往左
  • RPUSHX:将元素插入到键关联的列表尾部
  • RPOPLPUSH:将键1关联列表尾部的元素插入到键2关联列表的头部(原子性的完成这两步操作。若2个键一样则将列表中的尾部元素移到头部,并返回移动的元素)
【RPUSH】
192.168.131.10:6379[6]> keys *
1) "qz"
192.168.131.10:6379[6]> rpush qz1 q w e r    【在qz1关联的列表中插入数据,顺序是从右往左】
(integer) 4
192.168.131.10:6379[6]> lrange qz1 0 -1      【查看qz1关联的列表以及插入顺序】
1) "q"
2) "w"
3) "e"
4) "r"


【RPUSHX】
192.168.131.10:6379[6]>  rpushx qz1 u        【将元素u插入到qz1关联的列表尾部】
(integer) 5                                  【因为之前有4个元素,索引插入u后返回值为5192.168.131.10:6379[6]> lrange qz1 0 -1      【查看,核对】
1) "q"
2) "w"
3) "e"
4) "r"
5) "u"
192.168.131.10:6379[6]> keys *
1) "qz2"
2) "qz1"
3) "qz"
192.168.131.10:6379[6]>  rpushx qz3 u        【因为qz3键不存在,所以不会插入数,并且返回值为0(integer) 0
192.168.131.10:6379[6]> lrange qz1 0 -1      【查看qz1键的列表】
1) "q"
2) "w"
3) "e"
4) "r"
5) "u"
192.168.131.10:6379[6]> rpop qz1             【移除并返回qz键关联的列表中从右往左的第一个元素】
"u"
192.168.131.10:6379[6]> lrange qz1 0 -1      【查看,核对】
1) "q"
2) "w"
3) "e"
4) "r"



【RPOPLPUSH】
192.168.131.10:6379[6]> lrange qz1 0 -1      【查看qz1键关联的列表值】
1) "q"
2) "w"
3) "e"
4) "r"
192.168.131.10:6379[6]> RPOPLPUSH qz1 qz3    【将qz1键关联列表尾部的元素r插入到qz3键关联列表的头部(原子性的完成这两步操作)】
"r"
192.168.131.10:6379[6]> lrange qz1 0 -1      【查看,核对】
1) "q"
2) "w"
3) "e"
192.168.131.10:6379[6]> lrange qz3 0 -1      【查看,核对】
1) "r"
192.168.131.10:6379[6]> lrange qz1 0 -1
1) "q"
2) "w"
3) "e"
192.168.131.10:6379[6]> RPOPLPUSH qz1 qz1    【将列表中的尾部元素移到头部,并返回移动的元素】
"e"
192.168.131.10:6379[6]> lrange qz1 0 -1      【查看,核对】
1) "e"
2) "q"
3) "w"

三、Hash数据类型(散列类型)

  • Hash用于存储对象
  • 可以采用:对象类型和ID构成键名,并使用字段表示对象的属性,而字段值则存储属性值的命名方式(例如:存储ID为3的树木对象)
  • 如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间
  • 每一个Hash可以存储2的23次方-1(4294967295)个键值对

3.1 HSET & HGET & HEXISTS & HLEN & HDEL & HSETNX

  • HSET:给键关联表设置字段并赋值
  • HGET:获取键关联表中某字段的值
  • HDEL :删除键关联表中某个字段(该字段有值,返回1。无值,返回0)
  • HLEN:获取键关联表中字段的数量
  • HEXISTS:判断键关联表中是否存在某字段(存在返回值1,不存在返回值0)
  • HSETNX:给键关联表中添加字段并赋值,如果该字段不存在,则添加成功并返回值1。如果该字段有值,则不做任何操作返回值0
【HSET&HGET】
192.168.131.10:6379[7]> keys *                【查询该库所有键】
(empty list or set)
192.168.131.10:6379[7]> hset qz name zhao     【给qz键关联的表设置字段name,赋值zhao】
(integer) 1
192.168.131.10:6379[7]> hget qz name          【获取qz键关联表中name字段的值】
"zhao"
192.168.131.10:6379[7]> hget qz name2         【获取qz键关联表中name2字段的值】
(nil)                                         【因为name2字段不存在,所有返回nil】


【HLEN&HEXISTS】
192.168.131.10:6379[7]> hset qz name2 li      【给qz键关联的表设置字段name2,赋值li】
(integer) 1
192.168.131.10:6379[7]> hlen qz               【获取qz键关联表中字段数量(name和name2两个字段)】
(integer) 2
192.168.131.10:6379[7]> hexists qz name2      【判断qz键关联表中是否存在name2字段】
(integer) 1                                   【因为存在,所以返回值1192.168.131.10:6379[7]> hdel qz name2         【删除qz键关联表中名为name2的字段】
192.168.131.10:6379[7]> hexists qz name2
(integer) 0                                   【不存在,返回值0】



【HDEL&HSETNX】
(integer) 1                                   【删除成功返回值1192.168.131.10:6379[7]> hdel qz name2         【再次删除qz键关联表中名为name2的字段】
(integer) 0                                   【因为上条命令已经将name2字段的值删除,所以这次没有值被删除,返回值0192.168.131.10:6379[7]> hsetnx qz name2 zhao  【给qz键关联表添加字段name2并赋值zhao】
(integer) 1                                   【因为该字段之前已被删除,所以添加成功后返回值1192.168.131.10:6379[7]> hsetnx qz name2 zhao  
(integer) 0                                   【因为上条命令已添加成功,所以该字段有值,因此本次命令不做任何操作且返回值0

3.2 HINCRBY

  • HINCRBY:给键关联表的值进行+值或者-值操作(结果可以为负数)
192.168.131.10:6379[7]> keys *
(empty list or set)
192.168.131.10:6379[7]> hset qz score 7        【给qz键关联的表设置字段score,赋值7(integer) 1
192.168.131.10:6379[7]> hincrby qz score 3     【给qz键关联表score字段的值+3(integer) 10                                   【返回追加后的结果】
192.168.131.10:6379[7]> hincrby qz score -6    【给qz键关联表score字段的值-6(integer) 4                                    
192.168.131.10:6379[7]> hincrby qz score -10   【给qz键关联表score字段的值-10(integer) -6

3.3 HGETALL & HKEYS & HVALS & HMGET & HMSET

  • HGETALL:返回键关联表中所有字段和值(返回时是逐队列出的)
  • HKEYS:获取键关联表中所有字段的名称
  • HVALS :获取键关联表中所有字段的值
  • HMGET :批量设置键关联表中多个字段的值
  • HMSET:批量获取键关联表中多个字段的值
【HMGET&HMSET】
192.168.131.10:6379[7]> del qz
(integer) 1
192.168.131.10:6379[7]> keys *
(empty list or set)
192.168.131.10:6379[7]> hmset qz name zhao name2 li name3 chen 【批量设置qz键关联表中多个字段的值】
OK
192.168.131.10:6379[7]> hmget qz name name2 name3 name4        【批量获取qz键关联表中多个字段的值】
1) "zhao"
2) "li"
3) "chen"
4) (nil)                                                       【因为name4字段不存在,所以返回结果nil】



【HGETALL】
192.168.131.10:6379[7]> hgetall qz                【返回qz键中所有字段和值(从结果中可以看出,返回时是逐队列出的)】
1) "name"
2) "zhao"
3) "name2"
4) "li"
5) "name3"
6) "chen"


【HKEYS & HVALS】
192.168.131.10:6379[7]> hkeys qz                  【获取qz键中所有字段的名称】
1) "name"
2) "name2"
3) "name3"
192.168.131.10:6379[7]> hvals qz                  【获取qz键中所有字段的值】
1) "zhao"
2) "li"
3) "chen"

四、SET数据类型(无序集合)

4.1 概述与应用范围

  • SET数据类型概述
    • 无序集合的元素类型为String且元素具有唯一性,不允许存在重复的成员
    • 多个集合类型之间可以进行交集、并集和差集运算
  • SET数据类型应用范围
    • 可以使用该类型跟踪一些唯一性数据(比如:访问某一论坛的唯一IP地址信息。对于此场景,我们仅需要在每次访问该论坛时将访问者的IP存入Redis中,SET数据类型就会自动保证该IP地址的唯一性)
    • 充分利用SET数据类型的服务端聚合操作方便、高效的特性可以用于维护数据对象之间的关联关系(比如:所有购买某一汽车设备的客户ID都被存储在一个指定的Set中,而购买另外一种汽车设备的客户ID则被存储在另外一个Set中。如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections(交集)命令就可以充分发挥它的方便和效率的优势了)

4.2 SADD & SMEMBERS & SCARD & SISMEMBER

  • SADD:插入元素到某键(已存在的元素不会被重复插入)
  • SMEMBERS:查看插入的结果(输出的结果顺序与插入顺序无关)
  • SCARD:查看集合中元素数量
  • SISMEMBER:查看某元素是否存在(存在返回值1,不存在返回值0)
【SADD】
192.168.131.10:6379[7]> select 8
OK
192.168.131.10:6379[8]> keys *
(empty list or set)
192.168.131.10:6379[8]> sadd qz q w e r  【因为qz集合不存在,所以参数中的元素值都被正常插入】
(integer) 4
192.168.131.10:6379[8]> sadd qz q t y    【因q元素已经存在于qz集合,所以本次操作仅插入了t和y两个新元素】
(integer) 2


【SISMEMBER】
192.168.131.10:6379[8]> sismember qz q   【查看q元素是否存在】
(integer) 1                              【存在返回1192.168.131.10:6379[8]> sismember qz u
(integer) 0                              【不存在返回0】


【SMEMBERS】
192.168.131.10:6379[8]> smembers qz      【查看插入的结果(输出的结果顺序与插入顺序无关)】
1) "y"
2) "r"
3) "e"
4) "t"
5) "w"
6) "q"


【SCARD】
192.168.131.10:6379[8]> scard qz         【获取qz集合中元素数量】
(integer) 6

4.3 SPOP & SREM & SRANDMEMBER & SMOVE

  • SPOP:移除集合中指定键的一个或多个随机元素,移除后会返回移除的元素
  • SREM:移除集合中一个或多个成员元素,不存在的成员元素会被忽略(如果键不是集合类型,返回错误)
  • SRANDMEMBER:返回集合中的一个随机元素
    • 从Redis2.6版本开始,SRANDMEMBER命令接收可选的count参数
    • 如果count为正数,且小于集合基数,那么命令返回一个包含count个元素的数组,数组中的元素各不相同
    • 如果count大于等于集合基数,那么返回整个集合
    • 如果count为负数,返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值
    • 该操作与SPOP相似,但SPOP将随机元素从集合中移除并返回,但是SRANDMEMBER则只返回随机元素,而不对集合进行任何改到
  • SMOVE:将指定成员Member元素从Source集合移动到Destination集合
    • SMOVE是原子性操作
    • 如果Source集合不存在或不包含指定Member元素,那么SMOVE命令则不执行任何操作,仅返回0。否则,Member元素从Source集合中被移除,并添加到Destination集合中
    • 当Destination集合已经包含Member元素时,SMOVE命令只是简单地将Source集合中的Member元素删除
    • 当Source或Destionation不是集合类型时,则返回一个错误
【SRANDMEMBER&SPOP】
192.168.131.10:6379[8]> keys *
(empty list or set)
192.168.131.10:6379[8]> 
192.168.131.10:6379[8]> keys *
(empty list or set)
192.168.131.10:6379[8]> sadd qz q w e r   【将参数插入到qz集合中】
(integer) 4
192.168.131.10:6379[8]> smembers qz       【查看集合中所有成员】
1) "r"
2) "e"
3) "w"
4) "q"
192.168.131.10:6379[8]> SRANDMEMBER qz    【随机返回qz集合中一个元素】
"r"
192.168.131.10:6379[8]> SRANDMEMBER qz
"w"
192.168.131.10:6379[8]> spop qz           【随机移除并返回集合中的一个元素】
"e"
192.168.131.10:6379[8]> SMEMBERS qz       【查看移除后集合的元素信息】
1) "r"
2) "w"
3) "q"



【SREM】
192.168.131.10:6379[8]> SREM qz a q w     【从集合中移除a、w、q三个元素,因为a不存在,所以只有q和w备移除,返回值2(integer) 2
192.168.131.10:6379[8]> SMEMBERS qz       【查看移除后的查询结果】
1) "r"



【SMOVE】
192.168.131.10:6379[8]> sadd qz q w       【在qz集合中插入q、w元素】
(integer) 2
192.168.131.10:6379[8]> sadd qz2 t y      【在qz2集合中插入t、y元素】
(integer) 2
192.168.131.10:6379[8]> SMOVE qz qz2 r    【将r从qz集合移动到qz2集合】
(integer) 1
192.168.131.10:6379[8]> SMEMBERS qz
1) "w"
2) "q"
192.168.131.10:6379[8]> SMEMBERS qz2      【移动后查询qz2集合】
1) "r"
2) "y"
3) "t"
192.168.131.10:6379[8]> SMOVE qz qz2 r    【因为qz集合中没有r元素,所以移动失败,返回值0(integer) 0

五、Sorted Sed数据类型(zset有序集合)

5.1 概述与应用范围

  • Sorted Sed概述
    • 有序集合,元素类型为String,元素具有唯一性,不能重复
    • 每个元素都会关联一个double类型的分数score(用来表示权重),可以通过权重的大小排序,元素的score可以相同
  • Sorted Sed应用范围
    • 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP3的用户信息。也可以利用ZRANK命令通过username来获取玩家的排行信息。最后将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息
    • Sorted Sed类型还可用于构建索引数据

5.2 ZADD & ZCARD & ZCOUNT & ZREM & ZINCRBY & ZSCORE & ZRANGE & ZRANK

  • ZADD:添加成员到集合
  • ZRANGE:返回集合中元素(withscores:返回结果中包含每个成员及其分数)
  • ZRANK:获取成员在集合中的位置索引值(0代表第一个位置)
  • ZCARD :获取集合中成员的数量
  • ZCOUNT:zcount key min max,分数满足表达式X<=score<=X的成员数量
  • ZREM:删除集合中成员(返回值为实际删除成员数量,如果没有该成员则返回nil)
  • ZINCRBY:添加不存在的成员并将其分数进行相应更新(返回值为更新后的分数,可以为负数)
  • ZSCORE:获取成员的分数(返回值是字符串形式)
【ZADD&ZRANGE】
192.168.131.10:6379[8]> keys *
(empty list or set)
192.168.131.10:6379[8]> zadd qz 1 chen               【添加一个分数为1的成员】
(integer) 1
192.168.131.10:6379[8]> zadd qz 2 li 3 wang          【添加两个分数分别为23的成员】
(integer) 2
192.168.131.10:6379[8]> ZRANGE qz 0 -1               【返回0(第一个成员),-1(最后一个成员)】
1) "chen"
2) "li"
3) "wang"
192.168.131.10:6379[8]> ZRANGE qz 0 -1 withscores    【withscores:返回结果中包含每个成员及其分数】
1) "chen"
2) "1"
3) "li"
4) "2"
5) "wang"
6) "3"



【ZRANK&ZCARD&ZCOUNT&ZREM&ZSCORE】
192.168.131.10:6379[8]> ZRANK qz chen            【获取成员chen在集合中的位置索引值】
(integer) 00代表第一个位置】
192.168.131.10:6379[8]> ZRANK qz cheng           【因为此成员不存在,所以返回nil】
(nil)
192.168.131.10:6379[8]> ZCARD qz                 【获取集合中成员的数量】
(integer) 3
192.168.131.10:6379[8]> ZCOUNT qz 1 2            【满足表达式1<= score <=2的成员数量】
(integer) 2
192.168.131.10:6379[8]> ZREM qz chen wang        【删除成员chen和wang】
(integer) 2                                      【返回实际删除成员的数量】
192.168.131.10:6379[8]> ZCARD qz                 【查看删除结果】
(integer) 1
192.168.131.10:6379[8]> ZSCORE qz li             【获取成员li的分数】
"2" 
192.168.131.10:6379[8]> ZSCORE qz wang           【因为成员wang已被删除,所以返回nil】
(nil)



【ZINCRBY】
192.168.131.10:6379[8]> ZINCRBY qz 5 wang       【成员wang不存在,该命令将添加成员并将其分数增加相应值】
"5"                                             【返回值为该成员更新后的分数】
192.168.131.10:6379[8]> ZINCRBY qz -15 wang    
"-10"
192.168.131.10:6379[8]> ZRANGE qz 0 -1  WITHSCORES
1) "wang"
2) "-10"
3) "li"
4) "2"

5.3 ZRANGEBYSCORE & ZREMRANGEBYRANK & ZREMRANGEBYSCORE

  • ZRANGEBYSCORE:获取分数满足x<=score<=x表达式的成员
  • ZREMRANGEBYRANK:在集合中删除位置索引满足0<=rank<=1表达式的成员
  • ZREMRANGEBYSCORE
    • 例如1:zrangebyscore qz -inf +inf limit 2 3
    • 获取集合中位置索引-int 到+inf中从位置索引2开始到后面3个成员
    • -int(表示第一个成员,也就是位置索引最低的,即0),+inf表示最后一个成员(位置索引最高的)
    • limit后面的参数用于限制返回成员的值,2表示从位置索引等于2的成员开始取后面3个成员
    • 例如2:ZRANGEBYSCORE qz 10 40 limit 1 2
    • 在位置索引1开始到后面2个成员中,取满足10<=score<=40表达式的成员
【ZRANGEBYSCORE】
192.168.131.10:6379[8]> keys *
(empty list or set)
192.168.131.10:6379[8]> zadd qz 10 chen 20 li 30 zhao 40 wang 【添加4个分数分别为10203040的成员】
(integer) 4
192.168.131.10:6379[8]> ZRANGEBYSCORE qz 9 31                 【获取分数满足9<=score<=31表达式的成员】
1) "chen"
2) "li"
3) "zhao"
192.168.131.10:6379[8]> zrange qz 0 -1 withscores             【查看qz集合里成员与分数】
1) "chen"
2) "10"
3) "li"
4) "20"
5) "zhao"
6) "30"
7) "wang"
8) "40"


【ZREMRANGEBYRANK & ZREMRANGEBYSCORE】
【-int(表示第一个成员,也就是位置索引最低的,即0),+inf表示最后一个成员(位置索引最高的)】
【limit后面的参数用于限制返回成员的值,2表示从位置索引等于2的成员开始取后面3个成员】
192.168.131.10:6379[8]> zrangebyscore qz -inf +inf limit 2 3 
1) "zhao"
2) "wang"

【在位置索引1开始到后面2个成员中,取满足10<=score<=40表达式的成员】
192.168.131.10:6379[8]> ZRANGEBYSCORE qz 10 40 limit 1 2
1) "li"
2) "zhao"
192.168.131.10:6379[8]> ZREMRANGEBYSCORE qz 10 20    【删除分数满足10<=socre<=20表达式的成员】
(integer) 2                                          【返回实际删除的数量】
192.168.131.10:6379[8]> zrange qz 0 -1 withscores    【查看qz集合里成员与分数来验证】
1) "zhao"
2) "30"
3) "wang"
4) "40"
192.168.131.10:6379[8]> ZREMRANGEBYRANK qz 0 1       【删除位置索引满足0<=rank<=1表达式的成员】
(integer) 2
192.168.131.10:6379[8]> zrange qz 0 -1 withscores    【查看qz集合里成员与分数来验证】
(empty list or set)
192.168.131.10:6379[8]> zcard qz                     【获取集合中成员的数量来验证】
(integer) 0

5.4 ZREVRANGE & ZREVRANGEBYSCORE & ZREVRANK

  • ZREVRANGE:按位置索引从高到低的方式获取并返回此区间内的成员
  • ZREVRANGEBYSCORE:获取分数满足X>=score>=X表达式的成员,并以从高到低的顺序输出
  • ZREVRANK:获取集合中成员的位置(是从高到低的排序)
【ZREVRANGE】
192.168.131.10:6379[8]> keys *
(empty list or set)
192.168.131.10:6379[8]> zadd qz 10 one 20 two 30 three 40 four 【添加4个分数分别为10203040的成员】
(integer) 4
192.168.131.10:6379[8]> ZREVRANGE qz 0 -1 withscores      【按位置索引从高到低的方式获取并返回此区间内的成员】
1) "four"
2) "40"
3) "three"
4) "30"
5) "two"
6) "20"
7) "one"
8) "10"
192.168.131.10:6379[8]> ZREVRANGE qz 1 3【因为是从高到低的排序,所以位置索引为0的是four,因此位置索引1为three,并以此类推】
1) "three"
2) "two"
3) "one"



【ZREVRANK】
192.168.131.10:6379[8]> ZREVRANK qz two           【获取qz集合中two的位置】
(integer) 2                                       【因为是从高到低的排序,所以two的位置索引为2192.168.131.10:6379[8]> ZREVRANK qz four
(integer) 0                                       【因为是从高到低的排序,所以two的位置索引为0】



【ZREVRANGEBYSCORE】
192.168.131.10:6379[8]> ZREVRANGEBYSCORE qz 30 10 【获取分数满足30>=score>=10表达式的成员,并以从高到低的顺序输出】
1) "three"
2) "two"
3) "one"
【ZREVRANGEBYSCORE命令支持limit选项,等同于zrangebyscore中的该选项含义,只不过在计算位置时是按照相反的顺序计算和获取】
192.168.131.10:6379[8]> ZREVRANGEBYSCORE qz 40 20 limit 1 2
1) "three"
2) "two"

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaKe___Easy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值