目录
前言
上篇文章详细介绍了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中非常关键的知识点.在项目中也是频繁使用,应用非常广泛.