目录
前言
String字符串
常见命令
set
get
mget
mset
setnx
incr
incrby
decr
decyby
append
Hash哈希
常见命令
hset
hget
hexists
hdel
hkeys
hvals
hgetall
hmget
hlen
hsetnx
List 列表
常见命令
lpush
lrange
lpushx
rpush
rpushhx
lpop
rpop
lindex
linsert
llen
Set 集合
常用命令
sadd
smembers
sismember
scard
spop
smove
srem
集合间的操作
集合操作命令
sinter
sinterstore
sunion
sunionstore
sdiff
sdiffstore
Zset 有序集合
常用命令
zadd
zcard
zcount
zrange
zrevrange
zpopmax
zpopmin
zrank
zrevrank
zscore
zrem
zincrby
总结
前言
Redis基础(数据结构和内部编码)-CSDN博客文章浏览阅读752次,点赞9次,收藏11次。string是redis中最基本的数据结构,也是使用最频繁的一个数据结构,不仅可以存储普通字符串,还可以存储二进制数据(序列化对象,图片)等数据,redis也是针对string在不同场景进行不同编码和优化.https://blog.csdn.net/qq_63525426/article/details/142375440?spm=1001.2014.3001.5502
上篇文章详细介绍了redis的数据结构和对应的编码.接下来我们将从这5中数据结构开始,学习redis的基础命令.
String字符串
String类型是redis中基础的数据类型.关于字符串我们需要注意以下几点:
- 在redis中所有的键都是String类型,而且其他几种数据类型都是基础String构建的.例如列表和集合的元素类型都是String类型.
- String类型的值可以是字符串,也可以是整数,浮点数,甚至是二进制数据.
- 一个字符串的大小不能超过512MB
常见命令
set
将string类型的value设置到key中,如何key之前存在,无论之前的数据类型是什么,都覆盖掉.
之前关于此key的ttl也失效.
语法格式: SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
时间复杂度: O(1)
选项:
EX: 使用秒作为单位为key设置过期时间
PX: 使用毫秒作为单位为key设置过期时间
NX: 只有key不存在时才进行设置,如果存在,则不执行
XX: 只有key存在时才进行设置,如果key之前不存在,则不执行
注意:带选项的 SET 命令可以被 SETNX 、 SETEX 、 PSETEX 等命令代替
返回值: 如果设置成功,则返回ok
127.0.0.1:6379> set mykey "hello"
OK
127.0.0.1:6379> get mykey
"hello"
127.0.0.1:6379> set mykey "he" ex 10 # 设置过期时间10s
OK
127.0.0.1:6379> get mykey #未到10s
"he"
127.0.0.1:6379> get mykey # 10s之后
(nil)
127.0.0.1:6379>
127.0.0.1:6379> set num "int"
OK
127.0.0.1:6379> get num
"int"
127.0.0.1:6379> del num # 删除key
(integer) 1
127.0.0.1:6379>
get
获取对应key的value,如果不存在,返回nil.如果value的数据类型不是string,会报错
语法: get key
时间复杂度: O(1)
返回值:
返回key对应的value.如果不存在则返回nil
127.0.0.1:6379> get heiil
(nil)
127.0.0.1:6379> set heiil "123"
OK
127.0.0.1:6379> get heiil
"123"
127.0.0.1:6379> del deiil
(integer) 1
127.0.0.1:6379> exists heiil
(integer) 0
127.0.0.1:6379> hset heiil name Bob
(integer) 1
127.0.0.1:6379> get heiil
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
mget
一次获取多个key的值,如果对应的数据类型不是string或者key不存在,返回nil
语法: MGET key [key ...]
时间复杂度: O(N) N是key的数量
返回值: 返回对应的value
127.0.0.1:6379> set user1 "zhangsan"
OK
127.0.0.1:6379> set user2 "lisi"
OK
127.0.0.1:6379> mget user1 user2 heiil
1) "zhangsan"
2) "lisi"
3) (nil)
127.0.0.1:6379>
mset
一次设置多个key的value
语法:MSET key value [key value ...]
时间复杂度: O(N) N是key的个数
返回值: ok
127.0.0.1:6379> mset user3 "sfd" user4 "ksdf" user5 "lihjsid"
OK
127.0.0.1:6379>
setnx
设置 key-value 但只允许在 key 之前不存在的情况下。
语法: SETNX key value
时间复杂度:O(1)
返回值:1 设置成功。0 没有设置。
127.0.0.1:6379> setnx key1 "123"
(integer) 1
127.0.0.1:6379> setnx key2 "hello"
(integer) 1
127.0.0.1:6379>
incr
将 key 对应的 string 表示的数字加1。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对 应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
语法:INCR key
时间复杂度:O(1)
返回值:integer 类型的加完后的数值。
127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
127.0.0.1:6379> get num
"3"
127.0.0.1:6379>
127.0.0.1:6379> incr k # 这个key之前不存在
(integer) 1
127.0.0.1:6379> get k
"1"
127.0.0.1:6379>
127.0.0.1:6379> set k1 "sdkfjhasdlkfhjaslkdfs"
OK
127.0.0.1:6379> incr k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set k2 "1238917283912745192874331298757981237394285"
OK
127.0.0.1:6379> incr k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
incrby
将 key 对应的 string 表示的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如 果 key 对应的 string 不是个整型或者范围超过了 64 位有符号整型,则报错。
语法: INCRBY key decrement
时间复杂度:O(1)
返回值:integer 类型的加完后的数值。
127.0.0.1:6379> incr k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incrby k 100
(integer) 101
127.0.0.1:6379> incrby k1 1
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
decr
将 key 对应的 string 表示的数字减1。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对 应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
语法: DECR key
时间复杂度: O(1)
返回值: integer 类型的减完后的数值。
127.0.0.1:6379> decr k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr k
(integer) 100
127.0.0.1:6379> decr k
(integer) 99
127.0.0.1:6379>
decyby
将 key 对应的 string 表示的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如 果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
语法: DECRBY key decrement
时间复杂度:O(1)
返回值:integer 类型的减完后的数值。
127.0.0.1:6379> decrby k 10
(integer) 89
127.0.0.1:6379> decrby k 100
(integer) -11
127.0.0.1:6379>
append
如果 key 已经存在并且是一个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在, 则效果等同于 SET 命令。
语法: APPEND KEY VALUE
时间复杂度:O(1). 追加的字符串一般较短, 可以视为 O(1).
返回值:追加完成之后 string 的长度。
127.0.0.1:6379> append k hello
(integer) 8
127.0.0.1:6379> get k
"-11hello"
127.0.0.1:6379>
Hash哈希
几乎所有的主流编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数 组、映射。在 Redis 中,哈希类型是指值本身是个键值对结构,形如 key = "key",value = { { field1, value1 }, ..., {fieldN, valueN } }
hash类型的key是个字符串,而value则是一个个的键值对结构
常见命令
hset
设置hash中指定的字段(filed)的值(value)
语法: HSET key field value [field value ...]
时间复杂度:插入一组 field 为 O(1), 插入 N 组 field 为 O(N)
返回值:添加的字段的个数
127.0.0.1:6379> select 1 #切换到1数据库
OK
127.0.0.1:6379[1]> hset myhash name zhangsan
(integer) 1
127.0.0.1:6379[1]> hget myhash name
"zhangsan"
127.0.0.1:6379[1]>
hget
获取hash中key的指定字段的值
语法: HGET key field
时间复杂度: O(1)
返回值: 字段对应的值或nil
127.0.0.1:6379[1]> hget myhash name
"zhangsan"
127.0.0.1:6379[1]>
hexists
判断hash中是否有指定字段
语法: HEXISTS key field
时间复杂度:O(1)
返回值:1 存在,0 不存在。
127.0.0.1:6379[1]> hexists myhash name
(integer) 1
127.0.0.1:6379[1]> hexists myhash age
(integer) 0
127.0.0.1:6379[1]>
hdel
删除 hash 中指定的字段。
语法: HDEL key field [field ...]
时间复杂度: 删除一个元素为O(1),删除N个元素为O(N)
返回值: 本次操作所删除的个数
127.0.0.1:6379[1]> hset myhash1 name "zhangsan" age 18 password 123
(integer) 3
127.0.0.1:6379[1]> hdel myhash1 name
(integer) 1
127.0.0.1:6379[1]> hdel myhash1 name
(integer) 0
127.0.0.1:6379[1]>
hkeys
获取 hash 中的所有字段。
语法: HKEYS key
时间复杂度:O(N), N 为 field 的个数.
返回值:字段列表。
127.0.0.1:6379[1]> hkeys myhash1
1) "age"
2) "password"
127.0.0.1:6379[1]>
hvals
获取 hash 中的所有的值。
语法: HVALS key
时间复杂度:O(N), N 为 field 的个数.
返回值:所有的值。
127.0.0.1:6379[1]> hvals myhash1
1) "18"
2) "123"
127.0.0.1:6379[1]>
hgetall
获取 hash 中的所有字段以及对应的值。
语法: HGETALL key
时间复杂度: O(N)
返回值: 字段和对应的值
127.0.0.1:6379[1]> hgetall myhash1
1) "age"
2) "18"
3) "password"
4) "123"
127.0.0.1:6379[1]>
hmget
一次获取 hash 中多个字段的值
语法: HMGET key field [field ...]
时间复杂度:只查询一个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.
返回值:字段对应的值或者 nil。
127.0.0.1:6379[1]> hmget myhash1 age password
1) "18"
2) "123"
127.0.0.1:6379[1]>
在使用hgetall时,如果哈希元素个数较多,会存在阻塞 Redis 的可能。如果开发人员只需要获取部分 field,可以使用户hmget
hlen
获取 hash 中的所有字段的个数。
语法: HLEN key
时间复杂度:O(1)
返回值:字段个数。
127.0.0.1:6379[1]> hlen myhash1
(integer) 2
127.0.0.1:6379[1]>
hsetnx
在字段不存在的情况下,设置 hash 中的字段和值。
语法: HSETNX key field value
时间复杂度:O(1)
返回值:1 设置成功,0 失败。
127.0.0.1:6379[1]> hsetnx myhash1 name 123
(integer) 1
127.0.0.1:6379[1]> hgetall myhash1
1) "age"
2) "18"
3) "password"
4) "123"
5) "name"
6) "123"
127.0.0.1:6379[1]> hsetnx myhash1 name 123
(integer) 0
127.0.0.1:6379[1]> hgetall myhash1
1) "age"
2) "18"
3) "password"
4) "123"
5) "name"
6) "123"
127.0.0.1:6379[1]>
List 列表
列表类型是来存储多个有序的字符串, a、b、c、d、e 五个元素从左到右组成了个有序的列表,列表中的每个字符串称为元素(element),列表最多可以存储2的32次方-1个元素。在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。列表是灵活的数据结构,它可以充当栈和队列的⻆色.
列表两端的插入和弹出操作
注意: List内部的编码方式不是一个简单的数组,而是更接近于双端队列
列表的元素也是可以重复的.
常见命令
lpush
将一个或者多个元素从左侧放入(头插)到 list 中。
语法: LPUSH key element [element ...]
时间复杂度:只插入一个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数.
返回值:插入后 list 的长度
127.0.0.1:6379[1]> lpush mylist "helo"
(integer) 1
127.0.0.1:6379[1]> lpush mylist "llo"
(integer) 2
127.0.0.1:6379[1]> lpush mylist 1 2 3 4 # 理解头插,按照顺序进行插入 先插入1,2,3 最后是4,所以4就是list的第一个元素
(integer) 6
lrange
获取从 start 到 end 区间的所有元素,左闭右闭。
语法: LRANGE key start stop
时间复杂度:O(N)
返回值:指定区间的元素。
127.0.0.1:6379[1]> lrange mylist 0 1
1) "4"
2) "3"
127.0.0.1:6379[1]> lrange mylist 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "llo"
6) "helo"
127.0.0.1:6379[1]>
lpushx
在 key 存在时,将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回
语法: LPUSHX key element [element ...]
时间复杂度:只插入一个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数.
返回值:插入后 list 的长度。
127.0.0.1:6379[1]> lpushx mylist 123
(integer) 7
127.0.0.1:6379[1]> lpushx my 1
(integer) 0
127.0.0.1:6379[1]>
rpush
将 一个或者多个元素从右侧放入(尾插)到 list 中。
语法: RPUSH key element [element ...]
时间复杂度:只插入一个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数.
返回值:插入后 list 的长度。
127.0.0.1:6379[1]> rpush mylist 1
(integer) 8
127.0.0.1:6379[1]> rpush mylist 6 7 8 9
(integer) 12
127.0.0.1:6379[1]> lrange mylist 0 -1
1) "123"
2) "4"
3) "3"
4) "2"
5) "1"
6) "llo"
7) "helo"
8) "1"
9) "6"
10) "7"
11) "8"
12) "9"
127.0.0.1:6379[1]>
rpushhx
在 key 存在时,将一个或者多个元素从右侧放入(尾插)到 list 中。
语法: RPUSHX key element [element ...]
时间复杂度:只插入一个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数.
返回值:插入后 list 的长度。
127.0.0.1:6379[1]> rpushx mylist 567
(integer) 14
127.0.0.1:6379[1]> rpushx 1 1
(integer) 0
127.0.0.1:6379[1]>
lpop
从 list 左侧取出元素(即头删)。
语法: LPOP key [count]
时间复杂度:O(1)
返回值:取出的元素或者 nil。
127.0.0.1:6379[1]> lpop mylist 1 # 从mylist这个list的左边开始删除,删除1个元素
1) "123" # 删除的值
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> lpop mylist 5
1) "4"
2) "3"
3) "2"
4) "1"
5) "llo"
rpop
从 list 右侧取出元素(即尾删)。
语法: RPOP key [count]
时间复杂度:O(1)
返回值:取出的元素或者 nil。
127.0.0.1:6379[1]> rpop mylist 5 # 从右边删除5个元素
1) "567"
2) "123"
3) "9"
4) "8"
5) "7"
lindex
获取从左数第 index 位置的元素。
语法: LINDEX key index
时间复杂度:O(N)
返回值:取出的元素或者 nil。
127.0.0.1:6379[1]> lindex mylist 2
"6"
127.0.0.1:6379[1]>
linsert
在特定位置插入元素。
语法: LINSERT key pivot element
时间复杂度:O(N)
返回值:插入后的 list 长度
127.0.0.1:6379[1]> lrange mylist 0 -1
1) "helo"
2) "1"
3) "6"
127.0.0.1:6379[1]> linsert mylist before 1 2
(integer) 4
127.0.0.1:6379[1]> lrange mylist 0 -1
1) "helo"
2) "2"
3) "1"
4) "6"
127.0.0.1:6379[1]>
llen
获取 list 的长度。
语法: LLEN key
时间复杂度:O(1)
返回值:list 的长度。
127.0.0.1:6379[1]> llen mylist
(integer) 4
127.0.0.1:6379[1]>
Set 集合
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合元素之间是无序的,元素不允许重复。一个集合中最多可以存储2的32次方-1个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题
常用命令
sadd
将一个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中。
语法:SADD key member [member ...]
时间复杂度:O(1)
返回值:本次添加成功的元素个数
127.0.0.1:6379[1]> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379[1]> sadd myset 1
(integer) 0
127.0.0.1:6379[1]>
smembers
获取一个 set 中的所有元素,注意,元素间的顺序是无序的。
语法: SMEMBERS key
时间复杂度:O(N)
返回值:所有元素的列表。
127.0.0.1:6379[1]> smembers myset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379[1]>
sismember
判断一个元素在不在 set 中。
语法:SISMEMBER key member
时间复杂度:O(1)
返回值:1 表失元素在 set 中。0 表示元素不在 set 中或者 key 不存在。
127.0.0.1:6379[1]> sismember myset 2
(integer) 1
127.0.0.1:6379[1]> sismember myset 54
(integer) 0
127.0.0.1:6379[1]>
scard
获取一个set的基数,即为set中元素的个数
语法: SCARD key
时间复杂度:O(1)
返回值:set 内的元素个数.
127.0.0.1:6379[1]> scard myset
(integer) 3
127.0.0.1:6379[1]>
spop
从 set 中删除并返回一个或者多个元素。注意,由于 set 内的元素是无序的,所以取出哪个元素实际是 未定义行为,即可以看作随机的。
语法:SPOP key [count]
时间复杂度:O(N), n 是 count
返回值:取出的元素。
127.0.0.1:6379[1]> spop myset 1
1) "3"
127.0.0.1:6379[1]> spop myset 1
1) "1"
127.0.0.1:6379[1]> spop myset 1
1) "2"
127.0.0.1:6379[1]>
smove
将一个元素从源 set 取出并放入目标 set 中。
语法: SMOVE source destination member
时间复杂度:O(1)
返回值:1 表示移动成功,0 表示失败
127.0.0.1:6379[1]> smembers myset1
1) "e"
2) "n"
3) "l"
127.0.0.1:6379[1]> smembers myset2
1) "h"
2) "hel"
127.0.0.1:6379[1]> smove myset1 myset2 "n"
(integer) 1
127.0.0.1:6379[1]> smembers myset2
1) "h"
2) "n"
3) "hel"
127.0.0.1:6379[1]> smembers myset1
1) "e"
2) "l"
127.0.0.1:6379[1]>
srem
将指定的元素从 set 中删除
语法: SREM key member [member ...]
时间复杂度:O(N), N 是要删除的元素个数.
返回值:本次操作删除的元素个数。
127.0.0.1:6379[1]> srem myset2 "h"
(integer) 1
127.0.0.1:6379[1]> srem myset2 "n" "hel"
(integer) 2
127.0.0.1:6379[1]> smembers myset2
(empty array)
127.0.0.1:6379[1]>
集合间的操作
交集(inter)、并集(union)、差集(diff)
我们先来了解一下交集 并集 差集的概念
交集: 最终的结果同时出现在两个集合中 3 4
并集: 把多个集合的数据放在一起,如果有重复的,最终保留一份 1 2 3 4 5 6
差集: A和B做差集,就是找出那些元素,在A中存在,在B中不存在 1 2
B和A做差集,就是找出那些元素,在B中存在,在A中不存在 5 6
集合操作命令
sinter
获取给定 set 的交集中的元素
语法: SINTER key [key ...]
时间复杂度:O(N * M), N 是最小的集合元素个数. M 是最大的集合元素个数.
返回值:交集的元素。
127.0.0.1:6379[1]> sadd k1 1 2
(integer) 2
127.0.0.1:6379[1]> sadd k2 1 3 4
(integer) 2
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> sinter k1 k2
1) "1"
127.0.0.1:6379[1]>
sinterstore
获取给定 set 的交集中的元素并保存到目标 set 中。
语法:SINTERSTORE destination key [key ...]
时间复杂度:O(N * M), N 是最小的集合元素个数. M 是最大的集合元素个数.
返回值:交集的元素个数。
127.0.0.1:6379[1]> sinter k1 k2
1) "1"
127.0.0.1:6379[1]> sinterstore k3 k1 k2
(integer) 1
127.0.0.1:6379[1]> smembers k3
1) "1"
127.0.0.1:6379[1]>
sunion
获取给定set中并集的元素
语法: SUNION key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素
127.0.0.1:6379[1]> sunion k1 k2 k3
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379[1]>
sunionstore
获取给定 set 的并集中的元素并保存到目标 set 中。
语法: SUNIONSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素个数。
127.0.0.1:6379[1]> sunionstore k4 k1 k2 k3
(integer) 4
127.0.0.1:6379[1]> smembers k4
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379[1]>
sdiff
获取给定 set 的差集中的元素
语法:SDIFF key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素
127.0.0.1:6379[1]> smembers k4
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379[1]> sadd k4 "a"
(integer) 1
127.0.0.1:6379[1]> sadd k4 "b"
(integer) 1
127.0.0.1:6379[1]> sadd k4 "c"
(integer) 1
127.0.0.1:6379[1]> sadd k5 "c"
(integer) 1
127.0.0.1:6379[1]> sadd k5 "d"
(integer) 1
127.0.0.1:6379[1]> sadd k5 "e"
(integer) 1
127.0.0.1:6379[1]> sdiff k4 k5
1) "b"
2) "a"
3) "4"
4) "1"
5) "3"
6) "2"
127.0.0.1:6379[1]>
sdiffstore
获取给定 set 的差集中的元素并保存到目标 set 中。
语法:SDIFFSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素个数。
127.0.0.1:6379[1]> sdiffstore k6 k4 k5
(integer) 6
127.0.0.1:6379[1]> smembers k6
1) "b"
2) "a"
3) "4"
4) "1"
5) "3"
6) "2"
127.0.0.1:6379[1]>
Zset 有序集合
有序集合相对于字符串、列表、哈希、集合来说会有些陌生。它保留了集合不能有重复成员的 特点,但与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关 联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是用下标作为排序依据而是用这个分数。如图所示,该有序集合显示了三国中的武将的武力.
常用命令
zadd
添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负 极限也是合法的
zadd的相关选项:
XX: 仅仅用于更新已存在的用户
NX: 仅用于添加新元素,不会更新已存在的元素
CH: 默认情况下,zadd命令返回的是本次添加的元素个数,但是指定这个选项之后,就会包含本次更新的元素个数
INCR: 将元素的分数加上指定的分数,只能指定一个元素和分数
语法: zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
时间复杂度:O(log(N))
返回值:本次添加成功的元素个数。
127.0.0.1:6379[1]> zadd myzset 1 "one"
(integer) 1
127.0.0.1:6379[1]> zadd myzset 1 "uno"
(integer) 1
127.0.0.1:6379[1]> zadd myzset 2 "two" 3 "three"
(integer) 2
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> zrange myzset 0 -1 # 查看zset中的值
1) "one"
2) "uno"
3) "two"
4) "three"
127.0.0.1:6379[1]> zrange myzset 0 -1 withscores # 查看zset中的值和分数
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
127.0.0.1:6379[1]>
zcard
获取一个 zset 的基数(cardinality),即 zset 中的元素个数。
语法: ZCARD key
时间复杂度:O(1)
返回值:zset 内的元素个数。
127.0.0.1:6379[1]> zcard myzset
(integer) 4
127.0.0.1:6379[1]>
zcount
返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过他添加括号排除
语法: ZCOUNT key min max
时间复杂度:O(log(N))
返回值:满足条件的元素列表个数。
127.0.0.1:6379[1]> zcount myzset 1 2 # 闭区间 包含 1 2
(integer) 3
127.0.0.1:6379[1]> zcount myzset (1 (4 # 开区间,不包含 1 4
(integer) 2
127.0.0.1:6379[1]>
zrange
返回指定区间的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。
语法: ZRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
127.0.0.1:6379[1]> zrange myzset 0 -1 # 查看zset中的值
1) "one"
2) "uno"
3) "two"
4) "three"
127.0.0.1:6379[1]> zrange myzset 0 -1 withscores # 查看zset中的值和分数
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
127.0.0.1:6379[1]>
zrevrange
返回指定区间的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表
语法: ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379[1]> zrevrange myzset 0 -1
1) "three"
2) "two"
3) "uno"
4) "one"
127.0.0.1:6379[1]> zrevrange myzset 0 -1 withscores
1) "three"
2) "3"
3) "two"
4) "2"
5) "uno"
6) "1"
7) "one"
8) "1"
127.0.0.1:6379[1]>
zpopmax
删除并返回分数最高的 count 个元素
语法: ZPOPMAX key [count]
时间复杂度:O(log(N) * M)
返回值:分数和元素列表。
127.0.0.1:6379[1]> zpopmax myzset 1
1) "three"
2) "3"
127.0.0.1:6379[1]> zpopmax myzset # 这里个1是同样的效果
1) "two"
2) "2"
127.0.0.1:6379[1]> zpopmax myzset 2
1) "uno"
2) "1"
3) "one"
4) "1"
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> zcard myzset
(integer) 0
127.0.0.1:6379[1]>
zpopmin
删除并返回分数最低的 count 个元素。
语法: ZPOPMIN key [count]
时间复杂度:O(log(N) * M)
返回值:分数和元素列表
127.0.0.1:6379[1]> zadd myzset 1 "one" 1 "uno" 2 "two" 3 "three"
(integer) 4
127.0.0.1:6379[1]> zpopmin myzset 2
1) "one"
2) "1"
3) "uno"
4) "1"
127.0.0.1:6379[1]>
zrank
返回指定元素的排名,升序。
语法: ZRANK key member
时间复杂度:O(log(N))
返回值:排名。
127.0.0.1:6379[1]> zrank myzset one
(nil)
127.0.0.1:6379[1]> zrank myzset three
(integer) 1
127.0.0.1:6379[1]>
zrevrank
语法: ZREVRANK key member
时间复杂度:O(log(N))
返回值:排名。
127.0.0.1:6379[1]> zrevrank myzset three
(integer) 0
127.0.0.1:6379[1]>
zscore
返回指定元素的分数
语法:ZSCORE key member
时间复杂度:O(1)
返回值:分数。
127.0.0.1:6379[1]> zscore myzset three
"3"
127.0.0.1:6379[1]>
zrem
删除指定元素
语法: ZREM key member [member ...]
时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数。
127.0.0.1:6379[1]> zrem myzset three
(integer) 1
127.0.0.1:6379[1]>
zincrby
为指定的元素的关联分数添加指定的分数值
语法: ZINCRBY key increment member
时间复杂度:O(log(N))
返回值:增加后元素的分数。
127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
1) "two"
2) "2"
127.0.0.1:6379[1]> zincrby myzset 2 two
"4"
127.0.0.1:6379[1]> zrange myzset 0 -1 withscores
1) "two"
2) "4"
127.0.0.1:6379[1]>
总结
本文详细的介绍了redis中针对5种不同数据类型所操作的基本命令,这5种数据类型是redis中非常关键的知识点.在项目中也是频繁使用,应用非常广泛.