Redis笔记之五大基本数据类型
Redis是一个开源、内存存储的数据结构服务器,可用作`数据库`、`高速缓存`和`消息队列代理`。它支持字符串、哈希表、列表、集合、有序集合、位图、hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
五大基本数据类型
Redis是一个开源、内存存储的数据结构服务器,可用作
数据库
、高速缓存
和消息队列代理
。它支持字符串、哈希表、列表、集合、有序集合、位图、hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
1. Redis-key
在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作。
主要命令:
- exists key:判断键是否存在
- del key:删除键值对
- move key db:将键值对移动到指定数据库
- expire key second:设置键值对的过期时间
- type key:查看value的数据类型
127.0.0.1:6379> keys * # 查看当前数据库所有key (empty list or set) 127.0.0.1:6379> set name zhangsan # set key OK 127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> keys * 1) "age" 2) "name" 127.0.0.1:6379> move age 1 # 将键值对移动到指定数据库 (integer) 1 127.0.0.1:6379> EXISTS age # 判断键是否存在 (integer) 0 # 不存在 127.0.0.1:6379> EXISTS name (integer) 1 # 存在 127.0.0.1:6379> SELECT 1 OK 127.0.0.1:6379[1]> keys * 1) "age" 127.0.0.1:6379[1]> del age # 删除键值对 (integer) 1 # 删除个数 # ========================================================= 127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> EXPIRE age 15 # 设置键值对的过期时间 (integer) 1 # 设置成功 开始计数 127.0.0.1:6379> ttl age # 查看key的过期剩余时间 (integer) 13 127.0.0.1:6379> ttl age (integer) 11 127.0.0.1:6379> ttl age (integer) 9 127.0.0.1:6379> ttl age (integer) -2 # -2 表示key过期,-1表示key未设置过期时间 127.0.0.1:6379> get age # 过期的key 会被自动delete (nil) 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> type name # 查看value的数据类型 string
关于TTL命令:
Redis的key,通过TTL命令返回key的过期时间,一般来说有三种:
- 当前key没有设置过期时间,所以会返回-1
- 当前key有设置过期时间,而且key已经过期,所以会返回-2
- 当前key有设置过期时间,且key还没有过期,故会返回key的正常剩余时间
关于重命名rename和renamenx:
- rename key newkey 修改 key 的名称
- renamenx key newkey 仅当 newkey 不存在时,将key改名为 newkey
更多redis命令:https://www.redis.net.cn/order/
2. String(字符串)
2.1 概念
- String类型是redis的最基础的数据结构,也是最经常使用到的类型。 而且其他的四种类型多多少少都是在字符串类型的基础上构建的,所以String类型是redis的基础。
- String 类型的值最大能存储 512MB,这里的String类型可以是简单字符串、 复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串
2.2 命令
命令 | 说明 |
---|---|
append key value | 向指定的key的value后追加字符串 |
decr/incr key | 将指定key的value数值进行+1/-1(仅对于数字) |
incrby/decrby key n | 指定步长对数值进行加减 |
incrbyfloat key n | 为数值加上浮点型数值 |
strlen key | 获取key保存值的字符串长度 |
getrange key start end | 按起止位置获取字符串(闭区间,起始和结束位置都取) |
setrange key offset value | 用指定的value替换key中offset开始的值 |
getset key vlaue | 将给定key 的值设为 value,并返回key的旧值(old value) |
setnx key value | 仅当key不存在时进行set |
setex key seconds value | set 键值对并设置过期时间 |
mset key1 value1 [ key2 value2…] | 批量set键值对 |
msetnx key1 value1 [ key2 value2…] | 批量设置键值对,仅当参数中所有的key都不存在时执行 |
mget key1[ key2 … ] | 批量获取多个key保存的值 |
psetex key milliseconds value | 和setex 命令相似,但它以毫秒为单位设置key的生存时间 |
getset key value | 如果不存在值,则返回nil,如果存在值,获取原来的值,并设置新的值 |
2.3 案例
127.0.0.1:6379> set name hello # 基础set
OK
127.0.0.1:6379> get name
"hello"
127.0.0.1:6379> append name world # 给name追加world
(integer) 10
127.0.0.1:6379> get name
"helloworld"
127.0.0.1:6379> set count 1
OK
127.0.0.1:6379> incr count # 给count自增1
(integer) 2
127.0.0.1:6379> get count
"2"
127.0.0.1:6379> incrby count 5 # 给count自增 5 设置步伐为5(整数)
(integer) 7
127.0.0.1:6379> incrbyfloat count 5.5 ## 个体count自增 5.5 设置步伐为5.5(小数)
"12.5"
127.0.0.1:6379> strlen name # 获取name的长度
(integer) 10
127.0.0.1:6379> getrange name 1 2 # 获取下标为1~2的字符串(包括1和2)
"el"
127.0.0.1:6379> get name
"helloworld"
127.0.0.1:6379> setrange name 5 redis # 用redis替换name中 5(下标) 以后的字符串
(integer) 10
127.0.0.1:6379> get name
"helloredis"
127.0.0.1:6379> getset name newredis # 给 name设置新的值,并返回旧的值
"helloredis"
127.0.0.1:6379> get name
"newredis"
127.0.0.1:6379> setnx name redis # 仅当 key不存在时才会设置新的值
(integer) 0
127.0.0.1:6379> get name
"newredis"
127.0.0.1:6379> setnx age 25
(integer) 1
127.0.0.1:6379> get age
"25"
127.0.0.1:6379> setex email 15 123@qq.com # 设置key-value并设置15s的过期时间
OK
127.0.0.1:6379> ttl email
(integer) 10
127.0.0.1:6379> ttl email
(integer) 7
127.0.0.1:6379> mset sex man address xian # 批量set值
OK
127.0.0.1:6379> mget sex address # 批量获取多个key的值
1) "man"
2) "xian"
127.0.0.1:6379> msetnx name zhangsan k1 v1 # 批量set值 仅当所有的key不存在
(integer) 0
127.0.0.1:6379> msetnx k2 v2 k1 v1
(integer) 1
127.0.0.1:6379> getset k3 v3
(nil)
127.0.0.1:6379> getset k1 v3
"v1"
127.0.0.1:6379> get k1
"v3"
127.0.0.1:6379>
2.4 使用场景
- value 除了是字符串还可以是数字
- 计数器
- 统计多单位的数量:uid : 123 : follow 0
- 粉丝数
- 对象存储缓存
3. List(列表)
3.1 概念
- Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
- 一个列表最多可以包含2^32 -1 个元素 (4294967295,每个列表超过40亿个元素)
- 列表可以看作是队列、栈、双端队列、双向链表等
3.2 命令
命令 | 说明 |
---|---|
lpush/rpush key value1[ value2… ] | 从左/右边向列表中push值(一个或多个) |
lrange key start end | 获取list起止元素(索引从左往右递增) |
lpushx/rpushx key value | 向已存在的列名中push值(一个或多个) |
linsert key before/after pivot value | 在指定列表元素的前/后插入value |
llen key | 查看列表长度 |
lindex key index | 通过索引获取列表元素 |
lset key index value | 通过索引为元素设值 |
lpop/rpop key | 从最左边/最右边移除值 并返回 |
rpoplpush source destination | 将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部 |
ltrim key start end | 通过下标截取指定范围内的列表 |
lrem key count value | List中是允许value重复的 count>0 :从头部开始搜索,然后删除指定的value 至多删除count个 count < 0 :从尾部开始搜索… count=0 :删除列表中所有的指定value |
blpop/brpop key1 [ key2 ] timout | 移除并获取列表中的第一个/最后一个元素,如果列表中没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
brpoplpush source destination timeout | 和rpoplpush 功能相同,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
3.3 案例
127.0.0.1:6379> lpush mylist k1 # 给 mylist中push 值
(integer) 1
127.0.0.1:6379> lpush mylist k2
(integer) 2
127.0.0.1:6379> lpush mylist k3
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1 # 查看mylist中的所有值
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> lrange mylist 0 1 # 查看mylist中下标0-1的值
1) "k3"
2) "k2"
127.0.0.1:6379> lpushx list v1 # 向已存在的列名中push值
(integer) 0 # 不存在list 则push失败
127.0.0.1:6379> lpushx mylist k4 k5 # 存在list 则push成功
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "k5"
2) "k4"
3) "k3"
4) "k2"
5) "k1"
127.0.0.1:6379> linsert mylist after k2 ins_k2 # 在k2 后面插入值ins_k2
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "k5"
2) "k4"
3) "k3"
4) "k2"
5) "ins_k2"
6) "k1"
127.0.0.1:6379> llen mylist # 返回mylist的长度
(integer) 6
127.0.0.1:6379> lindex mylist 3
"k2"
127.0.0.1:6379> lindex mylist 0
"k5"
127.0.0.1:6379> lset mylist 3 k6 # 将下标为3的值 set 为 k6
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "k5"
2) "k4"
3) "k3"
4) "k6"
5) "ins_k2"
6) "k1"
127.0.0.1:6379> lpop mylist # 从左边弹出一个元素
"k5"
127.0.0.1:6379> rpop mylist # 从右边弹出一个元素
"k1"
127.0.0.1:6379> lrange mylist 0 -1
1) "k4"
2) "k3"
3) "k6"
4) "ins_k2"
127.0.0.1:6379> rpoplpush mylist newlist 将mylist的最后一个元素弹出,加入到newlist的头部
"ins_k2"
127.0.0.1:6379> lrange newlist 0 -1
1) "ins_k2"
127.0.0.1:6379> lrange mylist 0 -1
1) "k4"
2) "k3"
3) "k6"
127.0.0.1:6379> ltrim mylist 0 1 # 截取0-1的值(取左不取右)
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "k4"
2) "k3"
127.0.0.1:6379> lpush mylist k1
(integer) 3
127.0.0.1:6379> lpush mylist k1
(integer) 4
127.0.0.1:6379> lpush mylist k1
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "k1"
2) "k1"
3) "k1"
4) "k4"
5) "k3"
127.0.0.1:6379> lrem mylist 2 k1 # 从头部开始搜索,最多删除2个k1
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "k1"
2) "k4"
3) "k3"
127.0.0.1:6379> lrem mylist -2 k3 # 从尾部开始搜索,最多删除2个k3
(integer) 1
127.0.0.1:6379> lrange mylist 0 -1
1) "k1"
2) "k4"
127.0.0.1:6379> blpop newlist mylist 30 # 从newlist 中弹出第一个值,mylist作为候选项
1) "newlist"
2) "ins_k2"
127.0.0.1:6379> lrange mylist 0 -1
1) "k1"
2) "k4"
127.0.0.1:6379> lrange newlist 0 -1
(empty list or set)
127.0.0.1:6379> lrange mylist 0 -1
1) "k1"
2) "k4"
127.0.0.1:6379> blpop newlist mylist 30 # newlist为空,所以从mylist中弹出
1) "mylist"
2) "k1"
127.0.0.1:6379> lrange mylist 0 -1
1) "k4"
127.0.0.1:6379> blpop newlist 30
(nil)
(30.00s)
127.0.0.1:6379> lrange mylist 0 -1
1) "k4"
127.0.0.1:6379> blpop mylist 30 # 我们连接另一个客户端向mylist中push了test, 阻塞被解决。
1) "k4"
2) "test"
3.4 使用场景
- 消息队列(Lpush Rpop)
- 栈(Lpush Lpop)
3.5 总结
- list实际上是一个链表,before Node after, left, right都可以插入值
- 如果key不存在,则创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或改动值,效率最高,修改中间元素,效率相对较低
4. Set(集合)
4.1 概念
- Set是无序不可重复的
- Redis的Set是String类型的无需集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- Redis中 集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)
- 集合中最大的成员数为2^32-1(4294967295,每个集合最多可存储40多亿个成员)
4.2 命令
命令 | 说明 |
---|---|
sadd key member1 [ member2 … ] | 向集合中无序增加一个/多个成员 |
scard key | 获取集合中的成员数 |
smembers key | 返回集合中的所有成员 |
sismember key member | 查询member元素是否是集合的成员,结果是无序的 |
srandmember key [ count ] | 随机返回集合中count个成员,count缺省值为1 |
spop key [ count ] | 随机移除并返回集合中count 个成员,count缺省值为1 |
smove source destination member | 将source集合的成员member移动到destination集合 |
srem key member1 [ member2 … ] | 移除集合中一个/多个成员 |
sdiff key1 [ key2 … ] | 差集 key1-key2 … |
sdiffstore destination key1 [ key2 …] | 在sdiff的基础上,将结果保存在集合中(覆盖)。不能保存到其他类型key |
sinter key1 [ key2 … ] | 返回所有集合的交集 |
sinterstore destination key1 [ key2 … ] | 在sinter的基础上,存储结果到集合中,覆盖 |
sunion key1 [ key2 … ] | 返回所有集合的并集 |
sunion destination key1 [ key2 …] | 在sunion的基础上,存储结果到集合中,覆盖 |
sscan key [ match pattern ] [ count count] | 在大数据环境下,使用此命令遍历集合中元素,每次遍历部分 |
4.3 案例
127.0.0.1:6379> sadd myset m1 m2 m3 m4 # 向myset集合中添加多个成员
(integer) 4
127.0.0.1:6379> scard myset # 查看myset中有多少个成员
(integer) 4
127.0.0.1:6379> smembers myset # 查看myset中所有的成员
1) "m1"
2) "m4"
3) "m2"
4) "m3"
127.0.0.1:6379> sismember myset m5 # 查看myset中是否存在m5 0:不存在 1:存在
(integer) 0
127.0.0.1:6379> sismember myset m4
(integer) 1
127.0.0.1:6379> srandmember myset 3 # 随机查看myset中的3个成员
1) "m2"
2) "m4"
3) "m3"
127.0.0.1:6379> srandmember myset # 随机查看myset中的一个成员
"m3"
127.0.0.1:6379> spop myset 2 # 从myset随机中弹出两个成员并显示
1) "m4"
2) "m3"
127.0.0.1:6379> smembers myset
1) "m1"
2) "m2"
127.0.0.1:6379> smove myset newset m2 # 将myset中的m2 弹出 添加到newset中
(integer) 1
127.0.0.1:6379> smembers myset
1) "m1"
127.0.0.1:6379> smembers newset
1) "m2"
127.0.0.1:6379> srem newset m2 # 从newset中移除成员m2
(integer) 1
127.0.0.1:6379> smembers newset
(empty list or set)
127.0.0.1:6379> sadd myset m2 m3
(integer) 2
127.0.0.1:6379> sadd newset m3 m4 m5
(integer) 3
127.0.0.1:6379> smembers myset
1) "m1"
2) "m2"
3) "m3"
127.0.0.1:6379> smembers newset
1) "m4"
2) "m5"
3) "m3"
127.0.0.1:6379> sdiff myset newset # 求差集 myset-newset
1) "m1"
2) "m2"
127.0.0.1:6379> sdiff newset myset
1) "m4"
2) "m5"
127.0.0.1:6379> sinter myset newset # 求交集 myset ∩ newset
1) "m3"
127.0.0.1:6379> sunion myset newset # 求并集 myset ∪ newset
1) "m4"
2) "m2"
3) "m3"
4) "m1"
5) "m5"
4.4 使用场景
redis Set是集合类型的数据结构,那么集合类型就比较适合用于聚合分类。
-
标签:比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
-
共同好友功能
(交集),共同喜好,或者可以引申到二度好友、六度分割理论之类的扩展应用。 -
统计网站的独立IP。利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP。
5. Hash(哈希)
5.1 概念
Redis Hash 是一个 String类型的field和value的映射表,Hash特别适合用于存储对象
Set就是一种简化的Hash,之变动key,而value使用默认值填充。可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。
5.2 命令
命令 | 说明 |
---|---|
hset key field value | 将哈希表key中的字段field的值设置为value。重复设置同一个field会覆盖,返回0 |
hmset key field1 value1 [ field2 value2 … ] | 同时将多个field-value(域-值)对设置到哈希表key中。 |
hsetnx key field value | 只有在字段field 不存在时,设置哈希表字段的值 |
hexists key field | 查看哈希表key中,指定的字段是否存在 |
hget key field value | 获取存储在哈希表中指定字段的值 |
hmget key field1 [ field2 … ] | 获取所有给定字段的值 |
hgetall key | 获取在哈希表key中的所有字段和值 |
hkeys key | 获取哈希表key中的所有字段 |
hlen key | 获取哈希表中字段的数量 |
hvals key | 获取哈希表中所有的值 |
hdel key field1 [ field2 … ] | 删除哈希表key中一个/多个field字段 |
hincrby key field n | 为哈希表key 中的指定字段的整数值加上增量n,并返回增量后结果(只针对数字有效) |
hincrbyfloat key field n | 同上,为浮点数增量n |
hscan key cursor [ match pattern ] [ count count ] | 迭代哈希表中的键值对 |
5.3 案例
127.0.0.1:6379> hset student name zhangsan # 给 student 中 set name-zhangsan
(integer) 1
127.0.0.1:6379> hset student age 20
(integer) 1
127.0.0.1:6379> hmset student sex 1 tel 1234556 # 给 student 中添加多个键值对
OK
127.0.0.1:6379> hsetnx student name lisi # 如果存在name则插入失败
(integer) 0
127.0.0.1:6379> hsetnx student email 123@qq.com # 如果不存在email 则插入成功
(integer) 1
127.0.0.1:6379> hexists student name # 判断student中是否存在name这个键
(integer) 1 # 存在返回1
127.0.0.1:6379> hexists student test # 不存在返回0
(integer) 0
127.0.0.1:6379> hget student name # 获取student中name对应的值
"zhangsan"
127.0.0.1:6379> hmget student name age # 获取多个键对应的值
1) "zhangsan"
2) "20"
127.0.0.1:6379> hgetall student # 获取student中所有的键值对
1) "name"
2) "zhangsan"
3) "age"
4) "20"
5) "sex"
6) "1"
7) "tel"
8) "1234556"
9) "email"
10) "123@qq.com"
127.0.0.1:6379> hkeys student # 获取student中的所有键
1) "name"
2) "age"
3) "sex"
4) "tel"
5) "email"
127.0.0.1:6379> hlen student # 返回student键值对的长度
(integer) 5
127.0.0.1:6379> hvals student # 获取student中所有的值
1) "zhangsan"
2) "20"
3) "1"
4) "1234556"
5) "123@qq.com"
127.0.0.1:6379> hdel student sex tel # 删除student中的sex 和 tel
(integer) 2
127.0.0.1:6379> hkeys student
1) "name"
2) "age"
3) "email"
127.0.0.1:6379> hincrby student age 1 # 给age自增 1 age必须为数字类型
(integer) 21
127.0.0.1:6379> hincrbyfloat student age 1.5# 给age自增 1.5
"22.5"
127.0.0.1:6379>
5.4 使用场景
- Hash变更的数据 user name age,尤其是用户信息之类的,经常变动的信息,Hash更适合于对象的存储
- String 更加适合于字符串存储
- 由于hash数据类型的key-value的特性,用来存储关系型数据库中表记录,是redis中哈希类型最常用的场景。一条记录作为一个key-value,把每列属性值对应成field-value存储在哈希表当中,然后通过key值来区分表当中的主键。
- 经常被用来存储用户相关信息。优化用户信息的获取,不需要重复从数据库当中读取,提高系统性能。
6. Zset(有序集合)
6.1 概念
- Zset(有序集合):不同的是每个元素都会关联到一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序
- score相同:按字典顺序排序
- 有序集合的成员是唯一的,但分数(score)却可以重复
6.2 命令
命令 | 说明 |
---|---|
zadd key score member1 [ score2 member2 ] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
zcard key | 获取有序集合的成员数 |
zcount key min max | 计算在有序集合中指定区间score的成员数 |
zincrby key n member | 有序集合中对指定成员的分数加上增量n |
zscore key member | 返回有序集合中成员的分数值 |
zrank key member | 返回有序集合中指定成员的索引 |
zrange key start end | 通过索引区间返回有序集合中指定区间内的成员 |
zrangebylex key min max | 通过字典区间返回有序集合的成员 |
zrangebyscore key min max | 通过分数返回有序集合指定区间内的成员,-inf和+inf表示负无穷和正无穷 ,只支持开区间 |
zlexcount key min max | 在有序集合中计算指定字典区间内成员数量 |
zrem key member1 [ member2 … ] | 移除有序集合中一个/多个成员 |
zremrangebylex key min max | 移除有序集合中给定的字典区间的所有成员 |
zremrangebyrank key start stop | 移除有序集合中给定的排名区间的所有成员 |
zremrangebyscore key min max | 移除有序集合中给定的分数区间的所有成员 |
zrevrange key start end | 返回有序集合中指定区间内的成员,通过索引,分数从高到低 |
zrevrangebyscore key max min | 返回有序集合中指定分数区间的成员,分数从高到低 |
zrevrangebylex key max min | 返回有序集合中指定字典区间内的成员,按字典顺序倒序 |
zrevrank key member | 返回有序集合中指定成员的排名,有序集合成员按分数值递减(从大到小)排序 |
zinterstore destination numkeys key1 [ key2 … ] | 计算给定的一个或多个有序集合的交集 并将结果存储到新的有序集合key中,numkeys:表示参与运算的集合数,将score相加作为结果的score |
zunionstore destination numkeys key1 [ key2 … ] | 计算给定的一个或多个有序集合的并集 ,将结果存储在新的有序集合key中 |
zscan key cursor [ match pattern ] [ count count ] | 迭代有序集合中的元素(包括元素成员和元素分值) |
6.3 案例
127.0.0.1:6379> zadd myzset 1 m1 2 m2 3 m3 # 给myzset中添加分数和成员(m1-m3)
(integer) 3
127.0.0.1:6379> zcard myzset # 查看有序集合中的成员数
(integer) 3
127.0.0.1:6379> zcount myzset 0 1 # 获取myzset中score在[0,1]区间的成员数
(integer) 1
127.0.0.1:6379> zcount myzset 0 3 # 获取myzset中score在[0,3]区间的成员数
(integer) 3
127.0.0.1:6379> zincrby myzset 5 m2 # 将myzset中的m2 的score +5
"7"
127.0.0.1:6379> zscore myzset m1 # 查看m1的score
"1"
127.0.0.1:6379> zscore myzset m2
"7"
127.0.0.1:6379> zrank myzset m1 # 获取成员m1的下标(下标按照score排序,score相同时按字典排序)
(integer) 0
127.0.0.1:6379> zrank myzset m2
(integer) 2
127.0.0.1:6379> zrank myzset m3
(integer) 1
127.0.0.1:6379> zrange myzset 0 1 # 获取myzset中 0-1的成员
1) "m1"
2) "m3"
127.0.0.1:6379> zrange myzset 0 -1 # 获取myzset中的全部成员
1) "m1"
2) "m3"
3) "m2"
127.0.0.1:6379> zrangebylex myzset - + # 返回素有成员
1) "m1"
2) "m3"
3) "m2"
127.0.0.1:6379> zrangebylex myzset - + limit 0 1 # 分页 ,按索引显示查询结果的0,1条记录
1) "m1"
127.0.0.1:6379> zrangebylex myzset - + limit 1 2 # 分页,从1开始,显示1,2条记录
1) "m3"
2) "m2"
127.0.0.1:6379> zrangebylex myzset (- [m3 # 显示 (-,m3] 内的成员
1) "m1"
2) "m3"
3) "m2"
127.0.0.1:6379> zrangebylex myzset [m2 [m3 # 显示 [m2,m3] 内的成员
1) "m3"
2) "m2"
127.0.0.1:6379> zrangebyscore myzset 1 10 # 返回score在[1,10]之间的成员
1) "m1"
2) "m3"
3) "m2"
127.0.0.1:6379> zrangebyscore myzset 1 5
1) "m1"
2) "m3"
127.0.0.1:6379> zlexcount myzset - + # 统计所有的成员数
(integer) 3
127.0.0.1:6379> zlexcount myzset [m1 [m2 # 统计[m1,m2]之间的成员数
(integer) 1
127.0.0.1:6379> zrem myzset m1 # 移除成员m1
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1
1) "m3"
2) "m2"
127.0.0.1:6379> zadd myzset 4 m4 5 m5 6 m6
(integer) 3
127.0.0.1:6379> zrange myzset 0 -1
1) "m3"
2) "m4"
3) "m5"
4) "m6"
5) "m2"
127.0.0.1:6379> zremrangebylex myzset [m2 [m3 # 移除[m2,m3]之间的成员数
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1
1) "m4"
2) "m5"
3) "m6"
4) "m2"
127.0.0.1:6379> zremrangebyrank myzset 0 1 移除排名0-1的所有成员
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "m6"
2) "m2"
127.0.0.1:6379> zscore myzset m2
"7"
127.0.0.1:6379> zremrangebyscore myzset 0 6 # 移除score在 0-6之间的成员
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1
1) "m2"
127.0.0.1:6379> zadd myzset 1 m1 3 m3 4 m4
(integer) 3
127.0.0.1:6379> zrange myzset 0 -1
1) "m1"
2) "m3"
3) "m4"
4) "m2"
127.0.0.1:6379> zrevrange myzset 0 3 # 按score递减排序,然后按下标,返回结果的0-3条记录
1) "m2"
2) "m4"
3) "m3"
4) "m1"
127.0.0.1:6379> zrevrangebyscore myzset 6 2 # 按score递减排序,返回集合中分数在 [2,6]之间的成员
1) "m4"
2) "m3"
127.0.0.1:6379> zrevrangebylex myzset [m4 (m1 # 按字典倒叙,返回集合中(m1,m4]字典区间的成员
1) "m2"
2) "m4"
3) "m3"
127.0.0.1:6379> zrange myzset 0 -1
1) "m1"
2) "m3"
3) "m4"
4) "m2"
127.0.0.1:6379> zrevrank myzset m4 # 按score递减排序,返回成员m4的下标
(integer) 1
127.0.0.1:6379> zrevrank myzset m2
(integer) 0
127.0.0.1:6379> zadd newzset 6 m6 7 m7 2 m2
(integer) 3
127.0.0.1:6379> zrange myzset 0 -1
1) "m1"
2) "m3"
3) "m4"
4) "m2"
127.0.0.1:6379> zrange newzset 0 -1
1) "m6"
2) "m7"
2) "m2"
127.0.0.1:6379> zinterstore sumzset 2 myzset newzset # 求交集,并将结果存储到sumzset
(integer) 1
127.0.0.1:6379> zrange sumzset 0 -1
1) "m2"
127.0.0.1:6379> zunionstore unionzset 2 myzset newzset aggregate min # 求并集,score按照最小值处理,存储到unionzset中
(integer) 6
127.0.0.1:6379> zrange unionzset 0 -1 withscores
1) "m1"
2) "1"
3) "m2"
4) "2"
5) "m3"
6) "3"
7) "m4"
8) "4"
9) "m6"
10) "6"
11) "m7"
12) "7"
6.4 使用场景
- set排序: 存储班级成绩表,工资表排序
- 普通消息:1 重要消息: 2 , 带权重进行判断
- 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)