IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis(三)------五大数据类型 -> 正文阅读

[大数据]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 valuen>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 12345@qq.com
(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) "12345@qq.com"


------------ 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) "12345@qq.com"

------------ 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使用场景

  • 存储班级成绩表,工资表
  • 普通消息,重要消息,带权重进行判断
  • 排行榜应用实现
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:40:57  更:2022-03-22 20:41:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:06:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码