Redis(三)------五大数据类型

Redis(三)------五大数据类型、三种特殊数据类型

  • Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ

  • 它支持多种类型的数据结构,如:字符串(String)、散列(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)与范围查询,基数统计(Hyperloglogs),位图场景(Bitmaps)和地理空间(Geospatial)索引半径查询

  • Redis内置了复制(Replication)、LUA脚本(Lua Scripting)、LRU驱动事件(LRU Eviction)、事务(Transactions)和不同级别的磁盘持久化

5、Redis-Key

127 .0.0.1:6379> keys *  # 查看所有的key
(empty list or set)
127 .0.0.1:6379> set name zzz  # set key
OK
127 .0.0.1:6379> keys *
1 ) "name"
127 .0.0.1:6379> set age 1
OK
127 .0.0.1:6379> keys *
1 ) "age"
2 ) "name"
127 .0.0.1:6379> EXISTS name  # 判断当前的key是否存在,返回1说明存在
(integer) 1
127 .0.0.1:6379> EXISTS name1 # 返回0说明不存在
(integer) 0
127 .0.0.1:6379> move name 1 # 移动当前的key到指定数据库
(integer) 1
127 .0.0.1:6379> keys *
1 ) "age"
127.0.0.1:6379> select 1 # 切换到数据库1
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> get name
"zzz"
127.0.0.1:6379[1]> select 0 # 切换到数据库0
OK
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name zzz
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"zzz"
127.0.0.1:6379> EXPIRE name 10 #设置key的过期时间,单位是秒
(integer) 1
127.0.0.1:6379> ttl name  # 查看当前key的剩余时间
(integer) 4
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2 
127.0.0.1:6379> get name # 就会自动删除 keys *也就没了
(nil) # 表示为空
127.0.0.1:6379> type name  # 查看当前key的一个类型!
string
127.0.0.1:6379> type age   
string

6、五大数据类型

6.1 String类型

6.1.1 基本用法
命令 描述
set key value 设置值
get key 获得值
key * 获得所有key
EXISTS key 判断key是否存在,1存在,0不存在
APPEND key “字符串” 追加字符串,key不存在为set key value
STRLEN key 获取字符串长度
incr key 自增1
decr key 自减1
INCRBY key 增加量 批量增加
DECRBY key 减少量 批量减少
  • 实践
------------ SET GET ------------
# 设置值
127.0.0.1:6379> set name zzz
# 获得值
127.0.0.1:6379> get name 
# 获得所有的key
127.0.0.1:6379> keys * 

------------ EXIST ------------
# 判断某一个key是否存在 1为存在 0为不存在
127.0.0.1:6379> EXISTS name  
(integer) 1

------------ APPEND ------------
# 追加字符串,如果当前key不存在,就相当于set key value
127.0.0.1:6379> APPEND name "hehe" 
# 7就是name的值的长度
(integer) 7
127.0.0.1:6379> get name
"zzzhehe"

------------ STRLEN ------------
# 获取字符串的长度
127.0.0.1:6379> STRLEN name  
(integer) 7

# i++
# 步长 i+=
# 初始浏览量为 0
127.0.0.1:6379> set views 0 
OK
# 查看浏览量
127.0.0.1:6379> get views
"0"

------------ incr ------------
# 自增1 浏览量+1
127.0.0.1:6379> incr views  
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"

------------ decr ------------
# 自减1 浏览量-1
127.0.0.1:6379> decr views  
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"

------------ INCRBY ------------
# 可以设置步长,指定增量!
127.0.0.1:6379> INCRBY views 10 
(integer) 9
127.0.0.1:6379> INCRBY views 10
(integer) 19

------------ DECRBY ------------
# 减少量
127.0.0.1:6379> DECRBY views 5
(integer) 14
6.1.2 字符串范围range
命令 描述
GETRANGE key n1 n2 截取字符串[n1,n2]
GETRANGE key 0 -1 获取全部字符串,相当于get key
SETRANGE key n 字符串 替换n开始的字符串,写多少换多少
  • 实践
# 设置 key1 的值
127.0.0.1:6379> set key1 "hello,zzz" 
OK

------------ GETRANGE ------------
# 截取字符串 [0,3]
127.0.0.1:6379> GETRANGE key1 0 3  
"hell"
# 获取全部的字符串 和 get key 是一样的
127.0.0.1:6379> GETRANGE key1 0 -1 
"hello,zzz"

------------ SETRANGE ------------
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
#替换指定位置开始的字符串!替换下标1开始往后的字符串,写了几个替换几个
127.0.0.1:6379> SETRANGE key2 1 xx 
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
6.1.3 设置set的过期时间
命令 描述
setex key n vlaue 设置key值为value,n秒后过期
setnx key “字符串” 如果不存在,再设置key值为字符串,成功返回1,失败0,如果存在创建失败
ttl key 查看过期时间
mset k1 v1 k2 v2 k3 v3… 同时设置多个值
mget k1 k2 k3… 同时获取多个值
msetnx k1 v1 k4 v4 若都不存在,同时创建,为原子性操作,一起成功或一起失败
getset key value 先get再set,不存在则创建,存在则替换原值
key:{id}:{field} value 例如:user:1:name zzz,一号user的name为zzz
  • 实例
# 设置过期时间
setex (set with expire) 
# 如果不存在,再设置(在分布式锁中会常常使用!)
setnx (set if not exist) 
# 查看过期时间
ttl key 

------------ SETEX ------------
# 设置key3 的值为 zzz 10秒后过期
127.0.0.1:6379> SETEX key3 10 zzz
OK

------------ SETNX ------------
# 如果mykey 不存在,创建mykey 值为redis
# 设置成功返回值为1,失败返回值为0
# 如果这个值存在,创建失败
127.0.0.1:6379> SETNX mykey "redis" 
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "mykey"
3) "key1"

------------ mset ------------
# 同时设置多个值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"


------------ mget ------------
# 同时获取多个值
127 .0.0.1:6379> mget k1 k2 k3 
1 ) "v1"
2 ) "v2"
3 ) "v3"

------------ msetnx ------------
# 是一个原子性的操作,要么一起成功,要么一起失败!
127.0.0.1:6379> msetnx k1 v1 k4 v4 
(integer) 0
127.0.0.1:6379> get k4
(nil)

# 对象
# 这里的key是一个巧妙的设计:user:{id}:{field},这种设计在redis中是允许的
127.0.0.1:6379> mset user:1:name zzz user:1:age 18
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zzz"
2) "18"

------------ getset ------------
# 如果不存在值,返回nil
# 先get再set
127.0.0.1:6379> getset db redis 
# 获取时没有,set了db
(nil)
127.0.0.1:6379> get db
"redis"
# 如果存在指,获取原来的值,设置新的值
127.0.0.1:6379> getset db mongodb 
"redis"
127.0.0.1:6379> get db
"mongodb"
6.1.4 String使用场景
  • value除了是字符串还可以是数字
  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

6.2 List(列表)

  • List中值可以重复

  • 在Redis中,可以将List操作为栈、队列、阻塞队列

  • 大多数List命令都是用L或R开头,Redis不区分大小写

6.2.1 基本用法
命令 描述
LPUSH/RPUSH key value1[value2] 从左/右向列表PUSH值(一个或多个)
LRANGE key n1 n2 截取list起止元素(索引从左往右递增),[0,-1]获取所有值
LLEN key 查看列表长度
LINDEX key n 通过索引获取列表n号元素
LSET key n value 通过索引更新列表n号元素值
LPOP/RPOP key 从最左/最右移除值,并返回移除值
RPOPLPUSH 现list名 新list名 将列表最右值弹出,并返回,添加到另一个列表头部
BRPOPLPUSH 现list名 新list名 timeout 将列表最右值弹出,并返回,添加到另一个列表头部。如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止
LTRIM key n1 n2 截取[n1,n2]范围内列表
LREM key n value n>0:从头部开始搜索,删除指定value,至多删除n个。n<0:从尾部开始搜索,删除指定value,至多删除-n个。n=0:删除列表中所有指定的value
BLPOP/BRPOP key1[key2] timeout 移出并获取列表第一/最后一个元素,如果列表没有元素阻塞会阻塞,直到等待超时或发现可弹出元素为止
LINSERT key BEFORE/AFTER “目标值” “插入值” 在key列表中,目标值元素前/后插入指定插入值
  • 实例
------------ LPUSH RPUSH ------------
# 取值 LRANGE
# 将一个值或者多个值,插入到列表头部
127.0.0.1:6379> LPUSH list one  
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3

------------ LRANGE ------------
# 获取list所有值
127.0.0.1:6379> LRANGE list 0 -1 
1 ) "three"
2 ) "two"
3 ) "one"
# 通过区间获取具体的值
127.0.0.1:6379> LRANGE list 0 1 
1 ) "three"
2 ) "two"
# 将一个值或者多个值,插入到列表尾部 (右)
127.0.0.1:6379> rpush list right 
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right" 

------------ LPOP RPOP ------------
# 双端队列的感觉
# 移除list的第一个元素,并返回值
127.0.0.1:6379> Lpop list   
"three"
# 移除list的最后一个元素,并返回值
127.0.0.1:6379> Rpop list  
"right"
127.0.0.1:6379> LRANGE list 0 -1
1 ) "two"
2 ) "one"

------------ Lindex ------------
127.0.0.1:6379> LRANGE list 0 -1
1 ) "two"
2 ) "one"
# 获取list中下标为1的值
127.0.0.1:6379> lindex list 1 
"one"
127.0.0.1:6379> lindex list 0
"two"

------------ Llen key ------------
# 返回列表的长度
127.0.0.1:6379> Llen list 
(integer) 2

# 移除指定的值 可移除多个
127.0.0.1:6379> lpush list three
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
# 移除list集合中指定个数的value,精确匹配
# 移除1个one
127.0.0.1:6379> lrem list 1 one 
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
# 移除2个three
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"

------------ ltrim ------------
# 修剪 没有rtrim
127.0.0.1:6379> rpush mylist hello hello1 hello2 hello3
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
# 通过下标截取指定的长度,list已改变,只剩下截取的元素
# 截取区间[1,2]数据,其他移除
127.0.0.1:6379> LTRIM mylist 1 2
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello1"
2) "hello2"

------------ RPOPLPUSH ------------
# 移除列表的最后一个元素,将他移动到新的列表中
# rpoplpush list名称 新list名称 
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> RPOPLPUSH mylist mylistnew
"hello3"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> LRANGE mylistnew 0 -1
1) "hello3"

------------ lset ------------
# 将列表中的指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> exists list
(integer) 0
# 如果不存在列表去更新会报错
127.0.0.1:6379> lset list 0 value 
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
# 如果存在,更新当前下标的值
127.0.0.1:6379> lset list 0 item 
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
# 如果不存在该下标,报错
127.0.0.1:6379> lset list 1 other 
(error) ERR index out of range

------------ linsert ------------
# 将某个具体的value插入到列表中某个元素的前面或后面
127.0.0.1:6379> rpush mylist "hello" "world"
(integer) 2
# 将new插入到world前
127.0.0.1:6379> linsert mylist before "world" "new"
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "new"
3) "world"
# 将!插入到world后
127.0.0.1:6379> linsert mylist after "world" "!"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "new"
3) "world"
4) "!"
  • 在两边插入或改动值,效率最高,修改中间元素,效率相对较低
  • 如果移除所有值,代表列表不存在
6.2.2 List使用场景
  • 消息排队
  • 消息队列(Lpush,Rpop)
  • 栈(Lpush,Lpop)

6.3 Set(集合)

  • Set中的成员不能重复,是无序不重复集合
6.3.1 基本用法
命令 描述
SADD key member1 member2 … 向集合中无序增加一个/多个成员
SCARD key 获取集合的成员数
SMEMBERS key 返回集合中的所有成员
SISMEMBER key member 查询member元素是否是集合成员,结果是无序的
SRANDMEMBER key n 随机返回集合中n个成员,n默认值为1
SPOP key n 随机移除n个成员并返回删除成员,n默认值为1
SMOVE 原集合 新集合 member 将原集合中的成员member移动到新集合中
SREM key member1 member2… 移除集合中一个/多个成员
SDIFF key1 key2… 返回所有集合的差集【只返回key1相对于其他集合的不同】(key1,key2中不同的成员),只有一个参数默认和自身运算
SDIFFSTORE 新集合名 key1 key2… 在SIDFF基础上,将差集结果保存到新集合中(覆盖原数据),不能保存到其他类型key
SINTER key1 key2… 返回所有集合交集(key1,key2中相同元素),只有一个参数默认和自身运算
SINTERSTORE 新集合名 key1 key2… 在SINTER基础上,将交集保存到新集合中(覆盖原数据),不能保存其他类型key
SUNION key1 key2… 返回所有集合并集(key1,key2中不重复的所有元素),只有一个参数默认和自身运算
SUNIONSTORE 新集合名 key1 key2… 在SUNION基础上,将并集保存到新集合中(覆盖原数据),不能保存其他类型key
  • 实例
------------ SADD SCARD SMEMBERS SISMEMBER ------------
# 向myset中增加成员 m1~m4
127.0.0.1:6379> SADD myset m1 m2 m3 m4 
(integer) 4
# 获取集合的成员数目
127.0.0.1:6379> SCARD myset 
(integer) 4
# 获取集合中所有成员
127.0.0.1:6379> smembers myset 
1) "m4"
2) "m3"
3) "m2"
4) "m1"
# 查询m5是否是myset的成员 不是返回0,是返回1
127.0.0.1:6379> SISMEMBER myset m5 
(integer) 0 
127.0.0.1:6379> SISMEMBER myset m2
(integer) 1

------------ SRANDMEMBER SPOP ------------
# 随机返回3个成员
127.0.0.1:6379> SRANDMEMBER myset 3 
1) "m2"
2) "m3"
3) "m4"
# 随机移除并返回2个成员
127.0.0.1:6379> SPOP myset 2 
1) "m1"
2) "m4"

------------ SMOVE SREM ------------
# 将myset中m3成员移动到newset集合
127.0.0.1:6379> SMOVE myset newset m3 
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "m4"
2) "m2"
3) "m1"
127.0.0.1:6379> SMEMBERS newset
1) "m3"
# 从newset中移除m3元素
127.0.0.1:6379> SREM newset m3 
(integer) 1
127.0.0.1:6379> SMEMBERS newset
(empty list or set)

------------ SDIFF ------------
# 下面开始是多集合操作,多集合操作中若只有一个参数默认和自身进行运算
# setx=>{m1,m2,m4,m6}, sety=>{m2,m5,m6}, setz=>{m1,m3,m6}
# 等价于setx-sety-setz
127.0.0.1:6379> SDIFF setx sety setz 
#这就是看setx中与其他集合中有不一样的列出来 只针对setx中的列出来
1) "m4" 
# setx - sety
127.0.0.1:6379> SDIFF setx sety 
1) "m4"
2) "m1"
# sety - setx
127.0.0.1:6379> SDIFF sety setx 
1) "m5"

------------ SINTER ------------
# 共同关注(交集)
# 求 setx、sety、setx的交集
127.0.0.1:6379> SINTER setx sety setz 
1) "m6"
# 求setx sety的交集
127.0.0.1:6379> SINTER setx sety 
1) "m2"
2) "m6"

------------ SUNION ------------
# setx sety setz的并集
127.0.0.1:6379> SUNION setx sety setz 
1) "m4"
2) "m6"
3) "m3"
4) "m2"
5) "m1"
6) "m5"
# setx sety 并集
127.0.0.1:6379> SUNION setx sety 
1) "m4"
2) "m6"
3) "m2"
4) "m1"
5) "m5"
6.3.2 Set使用场景
  • 微博,将A用户,B用户关注用户放在不同集合中,查看共同关注

6.4 Hash(哈希)

  • Redis Hash是一个String类型的field(字段)和value的映射表,hash特别适用于存储对象。(key-value都是字段-行数据)
  • Set就是一种简化的Hash,只变动key,而value使用默认值填充(就像java的set和hashmap一样),可以将一个Hash表作为一个对象进行存储,表中存放对象的信息
6.4.1 基本用法
命令 描述
HSET key field value 将哈希表key中的字段field的值设置为value。重复设置同一个field会覆盖,返回值0
HMSET key field1 v1 field2 v2 … 同时设置多个字段值(field1-v1,field2-v2)
HSETNX key field value 当哈希表中字段不存在时,设置字段值
HEXISTS key field 查看哈希表中,field字段是否存在
HGET key field 获取存储在哈希表中指定字段值
HMGET key field1 field2… 批量获取存储在哈希表中指定字段的值
HGETALL key 获取该哈希表中所有的字段和值
HKEYS key 获取该哈希表中的所有字段
HLEN key 获取该哈希表中字段的数量
HVALS key 获取该哈希表中的所有值
HDEL key field1 field2… 删除该哈希表中一个/多个字段
HINCRBY key field n 给该哈希表中指定字段的整数值加上n,并返回增加后的结果。值适用于整数字段
HINCRBYFLOAT key field n 给该哈希表中指定字段的浮点数值加上n,并返回增加后的结果。只使用于浮点数字段
  • 实例
------------ HSET HMSET HSETNX ------------ 
# 将studentx哈希表作为一个对象,设置name为mmm
127.0.0.1:6379> HSET studentx name mmm 
(integer) 1
# 重复设置field进行覆盖,并返回0
127.0.0.1:6379> HSET studentx name zzz
(integer) 0
# 设置studentx的age为20
127.0.0.1:6379> HSET studentx age 20 
(integer) 1
# 设置sex为1,tel为12345678910
127.0.0.1:6379> HMSET studentx sex 1 tel 12345678910
OK
 # HSETNX 设置已存在的field 失败0 成功1 
127.0.0.1:6379> HSETNX studentx name zzz
(integer) 0 
127.0.0.1:6379> HSETNX studentx email [email protected]
(integer) 1 

------------ HEXISTS ------------ 
# name字段在studentx中是否存在 存在1 不存在0
127.0.0.1:6379> HEXISTS studentx name 
(integer) 1 
127.0.0.1:6379> HEXISTS studentx abc
(integer) 0 

------------ HGET HMGET HGETALL ------------
# 获取studentx中name字段的value
127.0.0.1:6379> HGET studentx name 
"zzz"
# 获取studentx中name、age、tel字段的value
127.0.0.1:6379> HMGET studentx name age tel 
1) "zzz"
2) "20"
3) "12345678910"
# 获取studentx中所有的field及其value
127.0.0.1:6379> HGETALL studentx 
 1) "name"
 2) "zzz"
 3) "age"
 4) "20"
 5) "sex"
 6) "1"
 7) "tel"
 8) "12345678910"
 9) "email"
10) "[email protected]"


------------ HKEYS HLEN HVALS ------------ 
# 查看studentx中所有的field
127.0.0.1:6379> HKEYS studentx 
1) "name"
2) "age"
3) "sex"
4) "tel"
5) "email"
# 查看studentx中的字段数量
127.0.0.1:6379> HLEN studentx 
(integer) 5
# 查看studentx中所有的value
127.0.0.1:6379> HVALS studentx 
1) "zzz"
2) "20"
3) "1"
4) "12345678910"
5) "[email protected]"

------------ HDEL ------------ 
# 删除studentx 中的sex、tel字段
127.0.0.1:6379> HDEL studentx sex tel 
(integer) 2
127.0.0.1:6379> HKEYS studentx
1) "name"
2) "age"
3) "email"

------------ HINCRBY HINCRBYFLOAT ------------ 
 # studentx的age字段数值加1
127.0.0.1:6379> HINCRBY studentx age 1
(integer) 21
# 只能用于整数字段
127.0.0.1:6379> HINCRBY studentx name 1 
(error) ERR hash value is not an integer
# weight字段增加0.6
127.0.0.1:6379> HINCRBYFLOAT studentx weight 0.6 
"50.6"
6.4.2 Hash使用场景
  • Hash适合用来存储对象,尤其时用户信息之类的,经常变动的信息
  • String更适合字符串存储

6.5 Zset(有序集合)

6.5.1 基本用法
命令 描述
ZADD key score1 member1 score2 member2… 向有序集合中添加一个/多个成员,或更新已存在成员分数
ZCARD key 获取该有序集合成员数
ZCOUNT key min max 计算该有序集合在[min,max]区间上的成员数
ZINCRBY key n member 对该有序集合中指定成员的分数加n
ZSCORE key member 返回该有序集合中,成员的分数值
ZRANK key member 返回该有序集合中成员的索引
ZRANGE key n1 n2 返回[n1,n2]区间内的成员
ZRANGEBYLEX key n1 n2 通过字典区间[n1,n2]返回有序集合的成员
ZRANGEBYSCORE key n1 n2 返回分数区间[n1,n2]内的成员,开区间
ZLEXCOUNT key n1 n2 在该有序集合中,计算字典区间[n1,n2]内成员数量
ZREM key member1 member2… 移除该有序集合中一个/多个成员
ZREMRANGEBYLEX key n1 n2 移除该有序集合中给定字典区间[n1,n2]内所有成员
ZREMRANGEBYRANK key n1 n2 移除该有序集合给定排名区间[n1,n2]内所有成员
ZREMRANGEBYSCORE key n1 n2 移除该有序集合给定分数区间[n1,n2]内所有成员
ZREVRANGE key n1 n2 分数由高到低排序,再通过当前索引,返回该有序集合中索引指定区间[n1,n2]内的成员,分数由高到低
ZREVRANGEBYSCORE key n1 n2 分数由高到低排序,返回该有序集合中指定分数区间[n1,n2]内的成员,
ZREVRANGEBYLEX key n1 n2 字典倒序排序,返回该有序集合中指定字典区间[n1,n2]的成员
ZREVRANK key member 分数从高到低排序,返回该有序集合中指定成员的排名
ZINTERSTORE 新有序集合名 n key1 key2… 计算给定一个或多个有序集合的交集,并将结果存在新有序集合中,n:参与运算有序集合数。相同成员的score相加存入交集
ZUNIONSTORE 新有序集合名 n key1 key2… 计算给定的一个/多个有序集合的并集,并将结果存在新有序集合中,n:参与运算有序集合数。相同成员的score取最小值存入并集
  • 实例
------------ ZADD ZCARD ZCOUNT ------------ 
# 向有序集合myzset中添加成员m1 score=1 以及成员m2 score=2..
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3 
(integer) 2
# 获取有序集合的成员数
127.0.0.1:6379> ZCARD myzset 
(integer) 2
# 获取score在 [0,1]区间的成员数量
127.0.0.1:6379> ZCOUNT myzset 0 1 
(integer) 1

------------ ZINCRBY ZSCORE ------------ 
# 将成员m2的score值加5
127.0.0.1:6379> ZINCRBY myzset 5 m2 
"7"
# 获取成员m1的score
127.0.0.1:6379> ZSCORE myzset m1 
"1"

------------ ZRANK ZRANGE ------------ 
# 获取成员m1的索引,索引按照score排序,score相同索引值按字典顺序顺序增加
127.0.0.1:6379> ZRANK myzset m1 
(integer) 0
127.0.0.1:6379> ZRANK myzset m2
(integer) 2
# 获取索引在 0~1的成员
127.0.0.1:6379> ZRANGE myzset 0 1 
1) "m1"
2) "m3"
# 获取全部成员
127.0.0.1:6379> ZRANGE myzset 0 -1 
1) "m1"
2) "m3"
3) "m2"


------------ ZRANGEBYLEX ------------ 
# testset=>{abc,add,amaze,apple,back,java,redis} score均为0
# 安字典区间
127.0.0.1:6379> zadd testset 0 abc 0 add 0 amaze 0 apple 0 back 0 java 0 redis
(integer) 7
# 返回所有成员 - +代表所有的区间
127.0.0.1:6379> ZRANGEBYLEX testset - + 
1) "abc"
2) "add"
3) "amaze"
4) "apple"
5) "back"
6) "java"
7) "redis"
# 分页 按索引显示查询结果的 0,1,2条记录
127.0.0.1:6379> ZRANGEBYLEX testset - + LIMIT 0 3 
1) "abc"
2) "add"
3) "amaze"
# 显示 3,4,5条记录
127.0.0.1:6379> ZRANGEBYLEX testset - + LIMIT 3 3 
1) "apple"
2) "back"
3) "java"
# 显示 (-,apple] 区间内的成员 就是展示apple及前面的数据
127.0.0.1:6379> ZRANGEBYLEX testset (- [apple 
1) "abc"
2) "add"
3) "amaze"
4) "apple"
# 显示 [apple,java]字典区间的成员
127.0.0.1:6379> ZRANGEBYLEX testset [apple [java 
1) "apple"
2) "back"
3) "java"
# 其实就是左开右开 但是-代表所有所以( [都是一样的
127.0.0.1:6379> ZRANGEBYLEX testset (- (apple
1) "abc"
2) "add"
3) "amaze"

------------ ZREM ZREMRANGEBYLEX ZREMRANGBYRANK ZREMRANGEBYSCORE ------------ 
# 移除成员abc
127.0.0.1:6379> ZREM testset abc 
(integer) 1
# 移除字典区间[apple,java]中的所有成员
127.0.0.1:6379> ZREMRANGEBYLEX testset [apple [java 
(integer) 3
# 移除排名0~1的所有成员
127.0.0.1:6379> ZREMRANGEBYRANK testset 0 1 
(integer) 2
# 移除score在 [0,3]的成员
127.0.0.1:6379> ZREMRANGEBYSCORE myzset 0 3 
(integer) 2


------------ ZREVRANGE ZREVRANGEBYSCORE ZREVRANGEBYLEX ------------ 
# testset=> {abc,add,apple,amaze,back,java,redis} score均为0
# myzset=> {(m1,1),(m2,2),(m3,3),(m4,4),(m7,7),(m9,9)}
# 先倒排序 再筛选
# ZREVRANGE 就是zset reverse range 反转根据索引展示
127.0.0.1:6379> zadd myset 1 m1 2 m2 3 m3 4 m4 7 m7 9 m9
127.0.0.1:6379> ZRANGE myset 0 -1
1) "m1"
2) "m2"
3) "m3"
4) "m4"
5) "m7"
6) "m9"
# 按score递减排序,然后按索引,返回结果的 0~3
127.0.0.1:6379> ZREVRANGE myset 0 3 
1) "m9"
2) "m7"
3) "m4"
4) "m3"
# 返回排序结果的 索引的2~4
127.0.0.1:6379> ZREVRANGE myset 2 4 
1) "m4"
2) "m3"
3) "m2"

# 按score递减顺序 返回集合中分数在[2,6]之间的成员
127.0.0.1:6379> ZREVRANGEBYSCORE myset 6 2
1) "m4"
2) "m3"
3) "m2"
# 这样写是报错的 因为不存在
127.0.0.1:6379> ZREVRANGEBYSCORE myset 2 6 
(empty list or set) 
# 按字典倒序 返回集合中(add,java]字典区间的成员
127.0.0.1:6379> ZREVRANGEBYLEX testset [java (add 
1) "java"
2) "back"
3) "apple"
4) "amaze"

------------ 补充 ------------ 
# 补充这个是自动排序的根据首字母 如果score最小就最前面 否则在后面
127.0.0.1:6379> ZRANGE testset 0 -1
1) "java"
2) "redis"
# 这边发现添加的两个都是score为0的根据首字母排序了
127.0.0.1:6379> ZADD testset 0 hehe 0 xixi
(integer) 2
127.0.0.1:6379> ZRANGE testset 0 -1
1) "hehe"
2) "java"
3) "redis"
4) "xixi"
# 然后设置了score为1的 aaa实在最后
127.0.0.1:6379> ZADD testset 1 aaa
(integer) 1
127.0.0.1:6379> ZRANGE testset 0 -1
1) "hehe"
2) "java"
3) "redis"
4) "xixi"
5) "aaa"
------------ ZREVRANK ------------ 
# ZREVRANK 就是先倒排 再根据值找索引 位置
# 按score递减顺序,返回成员m7索引
127.0.0.1:6379> ZREVRANK myset m7 
(integer) 1
127.0.0.1:6379> ZREVRANK myset m2
(integer) 4


------------ ZINTERSTORE ZUNIONSTORE ------------ 
# mathscore=>{(xm,90),(xh,95),(xg,87)} 小明、小红、小刚的数学成绩
# enscore=>{(xm,70),(xh,93),(xg,90)} 小明、小红、小刚的英语成绩
127.0.0.1:6379> ZRANGE mathscore 0 -1
1) "xg"
2) "xm"
3) "xh"
127.0.0.1:6379> ZRANGE enscore 0 -1
1) "xm"
2) "xg"
3) "xh"
127.0.0.1:6379> ZRANGE enscore 0 -1 withscores
1) "xm"
2) "70"
3) "xg"
4) "90"
5) "xh"
6) "93"

# 将mathscore enscore进行合并 结果存放到sumscore
127.0.0.1:6379> ZINTERSTORE sumscore 2 mathscore enscore
(integer) 3
# 合并后的score是之前集合中所有score的和
127.0.0.1:6379> ZRANGE sumscore 0 -1 withscores
1) "xm"
2) "160"
3) "xg"
4) "177"
5) "xh"
6) "188"

# 取两个集合的成员score最小值作为结果的
127.0.0.1:6379> ZUNIONSTORE lowestscore 2 mathscore enscore AGGREGATE MIN 
(integer) 3
127.0.0.1:6379> ZRANGE lowestscore 0 -1 withscores
1) "xm"
2) "70"
3) "xg"
4) "87"
5) "xh"
6) "93"
6.5.2 Zset使用场景
  • 存储班级成绩表,工资表
  • 普通消息,重要消息,带权重进行判断
  • 排行榜应用实现

猜你喜欢

转载自blog.csdn.net/weixin_44176393/article/details/123645850