【Redis】数据类型介绍
一、字符 string
Redis常用基本类型之一,存入Redis的所有key都是字符类型,常用于保存Session信息
| 命令 | 含义 | 复杂度 |
| set <key> <value> | 设置 key value | o (1) |
| get <key> | 获取 key 对应的 value 值 | o (1) |
| del <key> | 删除 key | o (1) |
| setnx <key> <value> | key 不存在时创建 key | o (1) |
| senxx <key> <value> | key 存在时更新 key 值 | o (1) |
| incr <key> | 计数加操作 | o (1) |
| decr <key> | 计数减操作 | o (1) |
| mset <key> <value> <key> <value> <key> <value> | 批量设置 key value | o (n) |
| mget <key> <key> <key> | 批量获取 key 对应的 value 值 | o (n) |
1、SET 创建字符类型的 key
SET key value [EX seconds] [PX milliseconds] [NX|XX]
可用版本: >= 1.0.0时间复杂度: O(1)将字符串值
value关联到key。如果
key已经持有其他值,SET就覆写旧值, 无视类型。当
SET命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。可选参数
从 Redis 2.6.12 版本开始,
SET命令的行为可以通过一系列参数来修改:
EX seconds: 将键的过期时间设置为seconds秒。 执行SET key value EX seconds的效果等同于执行SETEX key seconds value。
PX milliseconds: 将键的过期时间设置为milliseconds毫秒。 执行SET key value PX milliseconds的效果等同于执行PSETEX key milliseconds value。
NX: 只在键不存在时, 才对键进行设置操作。 执行SET key value NX的效果等同于执行SETNX key value。
XX: 只在键已经存在时, 才对键进行设置操作。
127.0.0.1:6379> set key1 value1 #设置key value 值,无论是否存在都执行
OK
127.0.0.1:6379> type key1 #查看key的数据类型
string
127.0.0.1:6379> set key2 value2 ex 3 #设置有效期为3s的key
OK
127.0.0.1:6379> set key3 value3 nx #当key值不存在时创建key,相当于新增key
OK
127.0.0.1:6379> set key3 value3 nx
(nil)
127.0.0.1:6379> set key4 value4 xx #当key值存在时对key的值进行更新,相当于更新key
(nil)
127.0.0.1:6379> set key4 value4 nx
OK
127.0.0.1:6379> set key4 value_4 xx
OK
2、GET 获取一个key的内容
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key3
"value3"
3、DEL 删除一个和多个key
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> del key1 key2
(integer) 2
127.0.0.1:6379> keys *
1) "key3"
127.0.0.1:6379> del key3
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
4、MSET 批量创建多个key
127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK
5、MGET 批量获取多个key
127.0.0.1:6379> mget key1 key2 key3 #获取多个key对应的value值
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379> keys ke* #获取ke开头的所有key
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> keys * #获取所有key
1) "key3"
2) "key2"
3) "key1"
6、APPEND 追加内容
127.0.0.1:6379> append key1 " this is append"
(integer) 21
127.0.0.1:6379> get key1
"value1 this is append"
127.0.0.1:6379>
7、GETSET 设置新值并返回旧值
127.0.0.1:6379> set key4 value4
OK
127.0.0.1:6379> getset key4 newdata4
"value4"
127.0.0.1:6379> get key4
"newdata4"
8、STRLEN 返回字符串key对应的字符数
127.0.0.1:6379> set name janzen.qiu
OK
127.0.0.1:6379> get name
"janzen.qiu"
127.0.0.1:6379> strlen name
(integer) 10
127.0.0.1:6379> set addr 深圳市¸
OK
127.0.0.1:6379> get addr
"\xe6\xb7\xb1\xe5\x9c\xb3\xe5\xb8\x82\xb8\x82"
127.0.0.1:6379> strlen addr
(integer) 11
9、EXISTS 判断key是否存在
127.0.0.1:6379> keys *
1) "key3"
2) "key4"
3) "name"
4) "addr"
5) "key2"
6) "key1"
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> exists key1 key2
(integer) 2
10、TTL 查看key值过期时间
#TTL <key> 可以查看key剩余有效期单位为s,过期后的key会被自动删除
#-1:表示永不过期,默认key的有效期都为永不过期
#-2:表示指定key不存在
127.0.0.1:6379> ttl keytemp
(integer) 54
127.0.0.1:6379> ttl keytemp
(integer) 52
127.0.0.1:6379> ttl keytemp
(integer) 51
127.0.0.1:6379> ttl key1
(integer) -1
127.0.0.1:6379> ttl key
(integer) -2
127.0.0.1:6379>
11、EXPIRE 重新设置key过期时间
127.0.0.1:6379> ttl keytemp
(integer) 196
127.0.0.1:6379> expire keytemp 800 #expire 命令结果为重置过期时间
(integer) 1
127.0.0.1:6379> ttl keytemp
(integer) 799
127.0.0.1:6379> ttl keytemp
(integer) 793
127.0.0.1:6379> expire keytemp 400
(integer) 1
127.0.0.1:6379> ttl keytemp
(integer) 399
127.0.0.1:6379>
12、PERSIST 取消key值过期时间
127.0.0.1:6379> ttl keytemp
(integer) 333
127.0.0.1:6379> persist keytemp
(integer) 1
127.0.0.1:6379> ttl keytemp
(integer) -1
13、INCR 数值加计算
可利用INCR命令簇(INCR、INCRBY、INCRBYFLOAT)对可转化为数值的字符类型进行加计算
INCR <key> :对可转化为整形的字符进行递增加1(效果等同于 INCRBY KEY 1),如果key不存在则初始化key为0后进行处理
INCRBY <key> <int>:对可转化为整形的字符进行增加 int ,如果key不存在则初始化key为0后进行处理
INCRBYFLOAT <key> <float>:对可转化为 整形或浮点数 的字符进行增加 float ,如果key不存在则初始化key为0后进行处理
127.0.0.1:6379> set num 100
OK
#递增+1
127.0.0.1:6379> incr num
(integer) 101
127.0.0.1:6379> incr num
(integer) 102
#初始化key之后递增+1
127.0.0.1:6379> incr num1
(integer) 1
#数值加计算
127.0.0.1:6379> incrby num 20
(integer) 122
127.0.0.1:6379> incrby num -15
(integer) 107
#初始化key后,进行加计算
127.0.0.1:6379> incrby num2 24
(integer) 24
#初始化key,进行浮点数加计算
127.0.0.1:6379> incrbyfloat numf 20.1
"20.1"
#浮点数加计算
127.0.0.1:6379> incrbyfloat numf 2.8
"22.9"
127.0.0.1:6379> incrbyfloat numf -3.4
"19.5"
127.0.0.1:6379> incrbyfloat numf -10
"9.5"
127.0.0.1:6379> incrbyfloat numf 20
"29.5"
14、DECR 数值减计算
可利用DECR命令簇(DECR、DECRBY)对可转化为整形的字符类型进行加计算(不可处理浮点型内容)
DECR <key> :对可转化为整形的字符进行递减1(效果等同于 DECRBY KEY 1),如果key不存在则初始化key为0后进行处理
DECRBY <key> <int>:对可转化为整形的字符减 int ,如果key不存在则初始化key为0后进行处理
#初始化key,进行递减-1
127.0.0.1:6379> decr num3
(integer) -1
#递减-1
127.0.0.1:6379> decr num3
(integer) -2
#初始化key,进行减计算
127.0.0.1:6379> decrby num4 20
(integer) -20 #减计算
127.0.0.1:6379> decrby num3 10
(integer) -12
127.0.0.1:6379> decrby num3 -20
(integer) 8 #不可处理浮点型内容
127.0.0.1:6379> get numf
"29.5"
127.0.0.1:6379> decr numf
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decrby numf 10
(error) ERR value is not an integer or out of range
二、列表 list

列表类型本质上是一个可双向读写的的管道,头部为左侧,尾部为右侧。一个列表最多可包含 2^32-1(4294967295)个元素,0为初始下标表示第一个元素,也可使用-1 表示最后一个元素的下标,元素值可以重复。
常用于日志和队列场景。
列表特点:
- 有序性
- 元素可重复
- 左右双向可操作
1、LPUSH RPUSH 生成列表并插入数据
LPUSH key value [value …]
可用版本: >= 1.0.0
时间复杂度: O(1)
将一个或多个值
value插入到列表key的表头如果有多个
value值,那么各个value值按从左到右的顺序依次插入到表头: 比如说,对空列表mylist执行命令LPUSH mylist a b c,列表的值将是c b a,这等同于原子性地执行LPUSH mylist a、LPUSH mylist b和LPUSH mylist c三个命令。如果
key不存在,一个空列表会被创建并执行 LPUSH 操作,当key存在但不是列表类型时,返回一个错误。LPUSHX key value
可用版本: >= 2.2.0
时间复杂度: O(1)
将值
value插入到列表key的表头,当且仅当key存在并且是一个列表。和 LPUSH key value [value …] 命令相反,当
key不存在时, LPUSHX 命令什么也不做。
RPUSH key value [value …]
可用版本: >= 1.0.0时间复杂度: O(1)将一个或多个值value插入到列表key的表尾(最右边)。如果有多个value值,那么各个value值按从左到右的顺序依次插入到表尾:比如对一个空列表mylist执行RPUSH mylist a b c,得出的结果列表为a b c,等同于执行命令RPUSH mylist a、RPUSH mylist b、RPUSH mylist c。如果key不存在,一个空列表会被创建并执行 RPUSH 操作。当key存在但不是列表类型时,返回一个错误。RPUSHX key value
可用版本: >= 2.2.0时间复杂度: O(1)将值value插入到列表key的表尾,当且仅当key存在并且是一个列表。和 RPUSH key value [value …] 命令相反,当key不存在时, RPUSHX 命令什么也不做。
127.0.0.1:6379> lpush list1 a b c d e
(integer) 5
127.0.0.1:6379> rpush list2 a b c d e
(integer) 5
2、LPUSH RPUSH 向列表追加数据
127.0.0.1:6379> lpush list1 f
(integer) 6
#从右边添加元素,其余元素将向左移动
127.0.0.1:6379> rpush list2 f
(integer) 6
3、获取列表长度
LLEN key
可用版本: >= 1.0.0时间复杂度: O(1)返回列表
key的长度。如果
key不存在,则key被解释为一个空列表,返回0.如果
key不是列表类型,返回一个错误。
127.0.0.1:6379> llen list1
(integer) 6
127.0.0.1:6379> llen list2
(integer) 6
4、获取列表指定位置数据
LRANGE key start stop
可用版本: >= 1.0.0时间复杂度: O(S+N),S为偏移量start,N为指定区间内元素的数量。返回列表
key中指定区间内的元素,区间以偏移量start和stop指定。下标(index)参数
start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用负数下标,以
-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
LINDEX key index
可用版本: >= 1.0.0时间复杂度:O(N),N为到达下标index过程中经过的元素数量。因此,对列表的头元素和尾元素执行 LINDEX 命令,复杂度为O(1)。返回列表
key中,下标为index的元素。下标(index)参数
start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用负数下标,以
-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。如果
key不是列表类型,返回一个错误。
127.0.0.1:6379> rpush list a b c d e
(integer) 5
#查看单个指定位置的元素
127.0.0.1:6379> lindex list 0
"a"
127.0.0.1:6379> lindex list 1
"b"
127.0.0.1:6379> lindex list 2
"c"
127.0.0.1:6379> lindex list 3
"d"
127.0.0.1:6379> lindex list 4
"e"
#查看指定范围的元素
127.0.0.1:6379> lrange list 0 4
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lrange list 2 4
1) "c"
2) "d"
3) "e" 127.0.0.1:6379> lrange list 0 -1 #未知列表长度时,查看所有元素
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
#起始下标位置必须位于结束下标左侧
127.0.0.1:6379> lrange list -1 0
(empty list or set)
127.0.0.1:6379> lrange list -1 2
(empty list or set)
127.0.0.1:6379> lrange list 2 -5
(empty list or set)
5、修改列表指定索引值的元素
LSET key index value
可用版本: >= 1.0.0时间复杂度:对头元素或尾元素进行 LSET 操作,复杂度为 O(1)。其他情况下,为 O(N),N为列表的长度。将列表
key下标为index的元素的值设置为value。当
index参数超出范围,或对一个空列表(key不存在)进行 LSET 时,返回一个错误。
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lset list 2 n
OK
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "n"
4) "d"
5) "e"
6、移除列表数据
LPOP key
可用版本: >= 1.0.0
时间复杂度: O(1)移除并返回列表
key的头元素。
RPOP key
可用版本: >= 1.0.0
时间复杂度: O(1)
移除并返回列表
key的尾元素。
127.0.0.1:6379> rpush list a b c d e
(integer) 5 #删除列表头元素
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lpop list
"a"
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
4) "e" #删除列表尾元素
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpop list
"e"
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
LREM key count value
可用版本: >= 1.0.0时间复杂度: O(N),N为列表的长度。根据参数
count的值,移除列表中与参数value相等的元素。
count的值可以是以下几种:
count > 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count。
count < 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
count = 0: 移除表中所有与value相等的值。
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "c"
5) "a"
6) "d"
7) "e"
8) "a"
9) "b"
10) "a"
11) "e"
12) "c"
13) "c"
14) "c"
15) "b"
127.0.0.1:6379> lrem list -3 c #从列表尾部开始删除3个为 c 的元素
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "c"
5) "a"
6) "d"
7) "e"
8) "a"
9) "b"
10) "a"
11) "e"
12) "b" 127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "c"
5) "a"
6) "d"
7) "e"
8) "a"
9) "b"
10) "a"
11) "e"
12) "b"
127.0.0.1:6379> lrem list 2 a #从列表头部开始删除2个为 a 的元素
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "c"
4) "d"
5) "e"
6) "a"
7) "b"
8) "a"
9) "e"
10) "b" 127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "c"
4) "d"
5) "e"
6) "a"
7) "b"
8) "a"
9) "e"
10) "b"
127.0.0.1:6379> lrem list 0 b #删除列表中所有为 b 的元素
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "c"
3) "d"
4) "e"
5) "a"
6) "a"
7) "e"
RPOPLPUSH source destination
可用版本: >= 1.2.0时间复杂度: O(1)命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
将列表
source中的最后一个元素(尾元素)弹出,并返回给客户端。将
source弹出的元素插入到列表destination,作为destination列表的的头元素。举个例子,你有两个列表
source和destination,source列表有元素a, b, c,destination列表有元素x, y, z,执行RPOPLPUSH source destination之后,source列表包含元素a, b,destination列表包含元素c, x, y, z,并且元素c会被返回给客户端。如果
source不存在,值nil被返回,并且不执行其他动作。如果
source和destination相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
# source destination 为两个不同的列表
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpoplpush list1 list2
"e"
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> lrange list2 0 -1
1) "e"
2) "a"
3) "b"
4) "c"
5) "d"
6) "e"
#source destination 为同一个列表
127.0.0.1:6379> rpush list1 a b c d e
(integer) 5
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpoplpush list1 list1
"e"
127.0.0.1:6379> lrange list1 0 -1
1) "e"
2) "a"
3) "b"
4) "c"
5) "d"
#destination 列表不存在
127.0.0.1:6379> lrange list2 0 -1
1) "e"
2) "a"
3) "b"
4) "c"
5) "d"
6) "e"
127.0.0.1:6379> EXISTS list3
(integer) 0
127.0.0.1:6379> rpoplpush list2 list3
"e"
127.0.0.1:6379> lrange list2 0 -1
1) "e"
2) "a"
3) "b"
4) "c"
5) "d"
127.0.0.1:6379> lrange list3 0 -1
1) "e"
LTRIM key start stop
可用版本: >= 1.0.0时间复杂度: O(N),N为被移除的元素的数量。对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
举个例子,执行命令
LTRIM list 0 2,表示只保留列表list的前三个元素,其余元素全部删除。下标(index)参数
start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用负数下标,以
-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。当
key不是列表类型时,返回一个错误。LTRIM 命令通常和 LPUSH key value [value …] 命令或 RPUSH key value [value …] 命令配合使用,举个例子:
LPUSH log newest_log
LTRIM log 0 99这个例子模拟了一个日志程序,每次将最新日志
newest_log放到log列表中,并且只保留最新的100项。注意当这样使用LTRIM命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。
超出范围的下标
超出范围的下标值不会引起错误。
如果
start下标比列表的最大下标end(LLEN list减去1)还要大,或者start>stop, LTRIM 返回一个空列表(因为 LTRIM 已经将整个列表清空)。如果
stop下标比end下标还要大,Redis将stop的值设置为end
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ltrim list 1 3
OK
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
#起始下标大于end
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
4) "a"
5) "b"
6) "c"
7) "d"
8) "e"
127.0.0.1:6379> ltrim list 8 10
OK
127.0.0.1:6379> lrange list 0 -1
(empty list or set) #终止下标大于起始下标
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ltrim list 3 0
OK
127.0.0.1:6379> lrange list 0 -1
(empty list or set)
使用DEL命令直接删除key
127.0.0.1:6379> rpush list a b c d e
(integer) 5
127.0.0.1:6379> rpush list2 a b c d e
(integer) 5
127.0.0.1:6379> keys *
1) "list"
2) "list2"
127.0.0.1:6379> del list
(integer) 1
127.0.0.1:6379> del lisst2
(integer) 0
127.0.0.1:6379>
7、指定元素前后插入新元素
LINSERT key BEFORE|AFTER pivot value
可用版本: >= 2.2.0时间复杂度: O(N),N为寻找pivot过程中经过的元素数量。将值
value插入到列表key当中,位于值pivot之前或之后。当
pivot不存在于列表key时,不执行任何操作。当
key不存在时,key被视为空列表,不执行任何操作。
127.0.0.1:6379> rpush list a b c d e
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert list before d test
(integer) 6
127.0.0.1:6379> LRANGE list 0 -1
1) "a"
2) "b"
3) "c"
4) "test"
5) "d"
6) "e" 127.0.0.1:6379> rpush list1 a b c d e
(integer) 5
127.0.0.1:6379> LRANGE list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert list after c test
(integer) 7
127.0.0.1:6379> LRANGE list1 0 -1
1) "a"
2) "b"
3) "c"
4) "test"
5) "d"
6) "e"
127.0.0.1:6379>
三、集合 set

集合Set 是字符String的无序集合,集合中的成员具有唯一性,可以在两个不同的集合中进行比较取值,常用于取值判断、统计、交集等场景,
集合特点:
- 无序性
- 元素唯一性
- 多集合处理
1、生成集合key
SADD key member [member …]
可用版本: >= 1.0.0时间复杂度: O(N),N是被添加的元素的数量。将一个或多个
member元素加入到集合key当中,已经存在于集合的member元素将被忽略。假如
key不存在,则创建一个只包含member元素作成员的集合
127.0.0.1:6379> sadd set1 item1 item2 item3
(integer) 3
127.0.0.1:6379> type set1
set
2、集合追加元素
#追加集合内容是只能追加集合中不存在的元素,已存在的元素将被忽略
127.0.0.1:6379> sadd set1 item3 item4 item5
(integer) 2
3、查看集合元素
SMEMBERS key
可用版本: >= 1.0.0时间复杂度: O(N),N为集合的基数。返回集合
key中的所有成员。
127.0.0.1:6379> smembers set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
SISMEMBER key member
可用版本: >= 1.0.0时间复杂度: O(1)判断
member元素是否集合key的成员。返回值
如果
member元素是集合的成员,返回1。 如果member元素不是集合的成员,或key不存在,返回0。
127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
#item2元素存在于列表set1
127.0.0.1:6379> sismember set1 item2
(integer) 1
#item9元素不存在与列表set1
127.0.0.1:6379> sismember set1 item9
(integer) 0
SRANDMEMBER key [count]
可用版本: >= 1.0.0时间复杂度: 只提供key参数时为 O(1) 。如果提供了count参数,那么为 O(N) ,N 为返回数组的元素个数。如果命令执行时,只提供了
key参数,那么返回集合中的一个随机元素。从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的
count参数:
如果
count为正数,且小于集合基数,那么命令返回一个包含count个元素的数组,数组中的元素各不相同。如果count大于等于集合基数,那么返回整个集合。如果
count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值。该操作和 SPOP key 相似,但 SPOP key 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
返回值
只提供
key参数时,返回一个元素;如果集合为空,返回nil。 如果提供了count参数,那么返回一个数组;如果集合为空,返回空数组。
127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
#未输入count值,默认随机返回1个元素
127.0.0.1:6379> srandmember set1
"item4"
#count<0,返回3个元素,允许出现重复值
127.0.0.1:6379> srandmember set1 -3
1) "item4"
2) "item3"
3) "item4"
#count>0,返回3个元素,结果允许出现重复值
127.0.0.1:6379> srandmember set1 3
1) "item2"
2) "item5"
3) "item3"
#count 大于列表中的元素个数,返回当前列表
127.0.0.1:6379> srandmember set1 9
1) "item3"
2) "item2"
3) "item5"
4) "item1"
5) "item4"
SCARD key
可用版本: >= 1.0.0时间复杂度: O(1)返回集合
key的基数(集合中元素的数量)。返回值
集合的基数。 当
key不存在时,返回0
127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> scard set1
(integer) 5
127.0.0.1:6379> scard set2
(integer) 6
SSCAN cursor [MATCH pattern] [COUNT count]
可用版本: >= 2.8.0时间复杂度:增量式迭代命令每次执行的复杂度为 O(1) , 对数据集进行一次完整迭代的复杂度为 O(N) , 其中 N 为数据集中的元素数量。
SCAN命令及其相关的SSCAN命令、HSCAN命令和ZSCAN命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements)
127.0.0.1:6379> smembers set1
1) "item5"
2) "item1"
3) "item231"
4) "item132"
5) "item3"
6) "item13"
7) "item4"
8) "item2"
9) "item121"
10) "item81" #使用sscan筛选集合内元素
127.0.0.1:6379> sscan set1 0 match item??
1) "7"
2) 1) "item81"
2) "item13"
127.0.0.1:6379> sscan set1 0 match item???
1) "7"
2) 1) "item231"
2) "item132"
3) "item121"
127.0.0.1:6379> sscan set1 0 match item??1
1) "7"
2) 1) "item231"
2) "item121"
127.0.0.1:6379> sscan set1 0 match item*1
1) "7"
2) 1) "item231"
2) "item121"
3) "item81"
4) "item1"
4、删除集合中的元素
SREM key member [member …]
可用版本: >= 1.0.0时间复杂度: O(N),N为给定member元素的数量。移除集合
key中的一个或多个member元素,不存在的member元素会被忽略。
127.0.0.1:6379> smembers set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> srem set1 item1 item2
(integer) 2
127.0.0.1:6379> smembers set1
1) "item5"
2) "item3"
3) "item4" #删除不存在的元素,错误的元素会被忽略
127.0.0.1:6379> srem set1 item3 item6 item7
(integer) 1
127.0.0.1:6379> smembers set1
1) "item5"
2) "item4"
SPOP key
可用版本: >= 1.0.0时间复杂度: O(1)移除并返回集合中的一个随机元素。
如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER key [count] 命令。
返回值
被移除的随机元素。 当
key不存在或key是空集时,返回nil。
127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> spop set2
"item4"
127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
127.0.0.1:6379> spop set2
"item6"
127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
SMOVE source destination member
可用版本: >= 1.0.0时间复杂度: O(1)将
member元素从source集合移动到destination集合。SMOVE 是原子性操作。
如果
source集合不存在或不包含指定的member元素,则 SMOVE 命令不执行任何操作,仅返回0。否则,member元素从source集合中被移除,并添加到destination集合中去。当
destination集合已经包含member元素时, SMOVE 命令只是简单地将source集合中的member元素删除。当
source或destination不是集合类型时,返回一个错误。返回值
如果
member元素被成功移除,返回1。 如果member元素不是source集合的成员,并且没有任何操作对destination集合执行,那么返回0
127.0.0.1:6379> smembers set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> smembers set2
1) "item4"
2) "item1"
3) "item9"
4) "item2"
5) "item7"
6) "item6" #destination不存在时,自动创建set3集合,并将item5添加至set3
127.0.0.1:6379> smove set1 set3 item5
(integer) 1
127.0.0.1:6379> smembers set1
1) "item4"
2) "item1"
3) "item2"
4) "item3"
127.0.0.1:6379> smembers set3
1) "item5" #item6不存在于source
127.0.0.1:6379> smove set1 set2 item6
(integer) 0
127.0.0.1:6379> smembers set1
1) "item1"
2) "item2"
3) "item5"
4) "item3"
5) "item4"
127.0.0.1:6379> smembers set2
1) "item4"
2) "item1"
3) "item9"
4) "item2"
5) "item7"
6) "item6" #将item5从set1 移动至 set2
127.0.0.1:6379> smove set1 set2 item5
(integer) 1
127.0.0.1:6379> smembers set1
1) "item2"
2) "item1"
3) "item3"
4) "item4"
127.0.0.1:6379> smembers set2
1) "item1"
2) "item9"
3) "item2"
4) "item5"
5) "item7"
6) "item6"
7) "item4" #item1 同时存在于set1 set2时,仅删除 set1 中的 item1
127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
127.0.0.1:6379> smembers set2
1) "item9"
2) "item2"
3) "item1"
4) "item7"
5) "item6"
6) "item4"
127.0.0.1:6379> smove set1 set2 item1
(integer) 1
127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item3"
4) "item4"
127.0.0.1:6379> smembers set2
1) "item9"
2) "item2"
3) "item1"
4) "item7"
5) "item6"
6) "item4"
5、获取集合交集
SINTER key [key …]
可用版本: >= 1.0.0时间复杂度: O(N * M),N为给定集合当中基数最小的集合,M为给定集合的个数。返回一个集合的全部成员,该集合是所有给定集合的交集。
不存在的
key被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> sinter set1 set2
1) "item2"
2) "item4"
3) "item1"
SINTERSTORE destination key [key …]
可用版本: >= 1.0.0时间复杂度: O(N * M),N为给定集合当中基数最小的集合,M为给定集合的个数。这个命令类似于 SINTER key [key …] 命令,但它将结果保存到
destination集合,而不是简单地返回结果集。如果
destination集合已经存在,则将其覆盖。
destination可以是key本身。
127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4" #将set1 与 set2 的交集保存到 sinter_set
127.0.0.1:6379> sinterstore sinter_set set1 set2
(integer) 3
127.0.0.1:6379> SMEMBERS sinter_set
1) "item2"
2) "item4"
3) "item1"
6、获取集合并集
SUNION key [key …]
可用版本: >= 1.0.0时间复杂度: O(N),N是所有给定集合的成员数量之和。返回一个集合的全部成员,该集合是所有给定集合的并集。
不存在的
key被视为空集。
127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> sunion set1 set2
1) "item9"
2) "item2"
3) "item5"
4) "item7"
5) "item1"
6) "item6"
7) "item3"
8) "item4"
SUNIONSTORE destination key [key …]
可用版本: >= 1.0.0时间复杂度: O(N),N是所有给定集合的成员数量之和。这个命令类似于 SUNION key [key …] 命令,但它将结果保存到
destination集合,而不是简单地返回结果集。如果
destination已经存在,则将其覆盖。
destination可以是key本身
127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> sunionstore sunion_set set1 set2
(integer) 8
127.0.0.1:6379> SMEMBERS sunion_set
1) "item9"
2) "item2"
3) "item5"
4) "item7"
5) "item1"
6) "item6"
7) "item3"
8) "item4"
7、获取集合差集
SDIFF key [key …]
可用版本: >= 1.0.0时间复杂度: O(N),N是所有给定集合的成员数量之和。返回一个集合的全部成员,该集合是所有给定集合之间的差集。
不存在的
key被视为空集。
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
#set1 与 set2 的差值
127.0.0.1:6379> sdiff set1 set2
1) "item3"
2) "item5"
#set2 与 set1 的差值
127.0.0.1:6379> sdiff set2 set1
1) "item6"
2) "item9"
3) "item7"
SDIFFSTORE destination key [key …]
可用版本: >= 1.0.0时间复杂度: O(N),N是所有给定集合的成员数量之和。这个命令的作用和 SDIFF key [key …] 类似,但它将结果保存到
destination集合,而不是简单地返回结果集。如果
destination集合已经存在,则将其覆盖。
destination可以是key本身
127.0.0.1:6379> SMEMBERS set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
#set1 与 set2 的差值结果保存到 sdiff_set1
127.0.0.1:6379> sdiffstore sdiff_set1 set1 set2
(integer) 2
127.0.0.1:6379> SMEMBERS sdiff_set1
1) "item3"
2) "item5"
#set2 与 set1 的差值结果保存到 sdiff_set2
127.0.0.1:6379> sdiffstore sdiff_set2 set2 set1
(integer) 3
127.0.0.1:6379> SMEMBERS sdiff_set2
1) "item6"
2) "item9"
3) "item7"
四、有序集合 sorted set

Sorted Set 有序集合也是一个由String字符类型元素组成的集合,且不允许内部元素value 重复出现。但是与Set集合不同的是,每个value元素都会关联一个double(双精度浮点型)类型的Score分散,Redis正是通过该Score分数为集合中的成员从小到大进行排序,有序集合成员value都是唯一的,但是Score分数允许出现重复情况。集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1),集合中最大成员数为 2^32-1,每个集合可容纳约40亿个成员,常用于实现排行榜或者浏览量统计等场景。
有序集合特点:
- 有序性
- 元素唯一性
- 每个元素通过score进行排序
- value不可以重复,score可以重复
1、生成有序集合
ZADD key score member [[score member] [score member] …]
可用版本: >= 1.2.0时间复杂度: O(M*log(N)),N是有序集的基数,M为成功添加的新成员的数量。将一个或多个
member元素及其score值加入到有序集key当中。如果某个
member已经是有序集的成员,那么更新这个member的score值,并通过重新插入这个member元素,来保证该member在正确的位置上。
score值可以是整数值或双精度浮点数。如果
key不存在,则创建一个空的有序集并执行 ZADD 操作。当
key存在但不是有序集类型时,返回一个错误。
#添加一个元素到有序列表
127.0.0.1:6379> zadd zset1 100 centos
(integer) 1
#添加多个元素包含已存在的元素到有序列表
127.0.0.1:6379> zadd zset1 150 centos 160 ubuntu 170 alpine 900 windows10
(integer) 3
#添加多个新元素到有序列表
127.0.0.1:6379> zadd zset1 90 windows7 198 windows11
(integer) 2 127.0.0.1:6379> type zset1
zset
2、有序集合实现排行榜
ZRANGE key start stop [WITHSCORES]
可用版本: >= 1.2.0时间复杂度: O(log(N)+M),N为有序集的基数,而M为结果集的基数。返回有序集
key中,指定区间内的成员。其中成员的位置按
score值递增(从小到大)来排序。具有相同
score值的成员按字典序(lexicographical order )来排列。下标参数
start和stop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。 你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。超出范围的下标并不会引起错误。 比如说,当
start的值比有序集的最大下标还要大,或是start > stop时, ZRANGE 命令只是简单地返回一个空列表。 另一方面,假如stop参数的值比有序集的最大下标还要大,那么 Redis 将stop当作最大下标来处理。可以通过使用
WITHSCORES选项,来让成员和它的score值一并返回,返回列表以value1,score1, ..., valueN,scoreN的格式表示。 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
#根据元素score值从小到大递增排序,并展示所有元素
127.0.0.1:6379> zrange zset1 0 -1
1) "windows7"
2) "centos"
3) "ubuntu"
4) "alpine"
5) "windows11"
6) "windows10"
#根据元素score从小到大递增排序,并展示从第4位到最后一位的元素
127.0.0.1:6379> zrange zset1 3 -1
1) "alpine"
2) "windows11"
3) "windows10"
#根据元素score从小到大递减排序,并展示所有元素及score信息
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows7"
2) "90"
3) "centos"
4) "150"
5) "ubuntu"
6) "160"
7) "alpine"
8) "170"
9) "windows11"
10) "198"
11) "windows10"
12) "900"
#根据元素score从小到大递增排序,并展示从第4位到最后一位的元素及score信息
127.0.0.1:6379> zrange zset1 3 -1 withscores
1) "alpine"
2) "170"
3) "windows11"
4) "198"
5) "windows10"
6) "900"
ZREVRANGE key start stop [WITHSCORES]
可用版本: >= 1.2.0时间复杂度: O(log(N)+M),N为有序集的基数,而M为结果集的基数。返回有序集
key中,指定区间内的成员。其中成员的位置按
score值递减(从大到小)来排列。 具有相同score值的成员按字典序的逆序(reverse lexicographical order)排列。
#根据score从大到小递减排序,并展示所有元素
127.0.0.1:6379> zrevrange zset1 0 -1
1) "windows10"
2) "windows11"
3) "alpine"
4) "ubuntu"
5) "centos"
6) "windows7"
#根据score从大到小递减排序,并展示第2位到倒数第2位元素
127.0.0.1:6379> zrevrange zset1 1 -2
1) "windows11"
2) "alpine"
3) "ubuntu"
4) "centos"
#根据score从大到小递减排序,并展示所有元素及score信息
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
1) "windows10"
2) "900"
3) "windows11"
4) "198"
5) "alpine"
6) "170"
7) "ubuntu"
8) "160"
9) "centos"
10) "150"
11) "windows7"
12) "90"
#根据score从大到小递减排序,并展示第2位到倒数第2位元素及score信息
127.0.0.1:6379> zrevrange zset1 1 -2 withscores
1) "windows11"
2) "198"
3) "alpine"
4) "170"
5) "ubuntu"
6) "160"
7) "centos"
8) "150"
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
可用版本: >= 1.0.5时间复杂度: O(log(N)+M),N为有序集的基数,M为被结果集的基数。返回有序集
key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列。具有相同
score值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。可选的
LIMIT参数指定返回结果的数量及区间(就像SQL中的SELECT LIMIT offset, count),注意当offset很大时,定位offset的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。可选的
WITHSCORES参数决定结果集是单单返回有序集的成员,还是将有序集成员及其score值一起返回。 该选项自 Redis 2.0 版本起可用。区间及无限
min和max可以是-inf和+inf,这样一来,你就可以在不知道有序集的最低和最高score值的情况下,使用 ZRANGEBYSCORE 这类命令。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加
(符号来使用可选的开区间 (小于或大于)。举个例子:
ZRANGEBYSCORE zset (1 5返回所有符合条件
1 < score <= 5的成员,而ZRANGEBYSCORE zset (5 (10则返回所有符合条件
5 < score < 10的成员。
#将score分数在区间 150 >= score >=198 之间的元素按照从小到大递增次序排列并展示
127.0.0.1:6379> zrangebyscore zset1 150 198
1) "centos"
2) "ubuntu"
3) "alpine"
4) "windows11"
#将score分数在区间 150 > score >198 之间的元素及score信息按照从小到大递增次序排列并展示
127.0.0.1:6379> zrangebyscore zset1 (150 (198 withscores
1) "ubuntu"
2) "160"
3) "alpine"
4) "170"
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
可用版本: >= 2.2.0时间复杂度: O(log(N)+M),N为有序集的基数,M为结果集的基数。返回有序集
key中,score值介于max和min之间(默认包括等于max或min)的所有的成员。有序集成员按score值递减(从大到小)的次序排列。具有相同
score值的成员按字典序的逆序(reverse lexicographical order )排列。除了成员按
score值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令一样。
#展示所有score分数低于900的元素,并按照从大到小递增排序
127.0.0.1:6379> zrevrangebyscore zset1 (900 -inf
1) "windows11"
2) "alpine"
3) "ubuntu"
4) "centos"
5) "windows7"
#展示所有score分数不低于170的元素及score信息,按照从大到小递增排序
127.0.0.1:6379> zrevrangebyscore zset1 +inf 170 withscores
1) "windows10"
2) "900"
3) "windows11"
4) "198"
5) "alpine"
6) "170"
3、获取集合个数
ZCARD key
可用版本: >= 1.2.0时间复杂度: O(1)返回有序集
key的基数。
127.0.0.1:6379> zrange zset1 0 -1
1) "windows7"
2) "centos"
3) "ubuntu"
4) "alpine"
5) "windows11"
6) "windows10"
127.0.0.1:6379> zcard zset1
(integer) 6
ZCOUNT key min max
可用版本: >= 2.0.0时间复杂度: O(log(N)),N为有序集的基数。返回有序集
key中,score值在min和max之间(默认包括score值等于min或max)的成员的数量。
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows7"
2) "90"
3) "centos"
4) "150"
5) "ubuntu"
6) "160"
7) "alpine"
8) "170"
9) "windows11"
10) "198"
11) "windows10"
12) "900"
127.0.0.1:6379> zcount zset1 100 900
(integer) 5
127.0.0.1:6379> zcount zset1 -inf +inf
(integer) 6
4、返回某个数值的索引
ZRANK key member
可用版本: >= 2.0.0时间复杂度: O(log(N))返回有序集
key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列。排名以
0为底,也就是说,score值最小的成员排名为0
127.0.0.1:6379> zrank zset1 windows11
(integer) 4
127.0.0.1:6379> zrank zset1 centos
(integer) 1
ZREVRANK key member
可用版本: >= 2.0.0时间复杂度: O(log(N))返回有序集
key中成员member的排名。其中有序集成员按score值递减(从大到小)排序。排名以
0为底,也就是说,score值最大的成员排名为0。
127.0.0.1:6379> zrevrank zset1 centos
(integer) 4
127.0.0.1:6379> zrevrank zset1 windows11
(integer) 1
5、获取分数
ZSCORE key member
可用版本: >= 1.2.0时间复杂度: O(1)返回有序集
key中,成员member的score值。
127.0.0.1:6379> zscore zset1 centos
"150"
127.0.0.1:6379> zscore zset1 windows10
"900"
6、增加指定元素的分数值
ZINCRBY key increment member
可用版本: >= 1.2.0时间复杂度: O(log(N))为有序集
key的成员member的score值加上增量increment。可以通过传递一个负数值
increment,让score减去相应的值,比如ZINCRBY key -5 member,就是让member的score值减去5。当
key不存在,或member不是key的成员时,ZINCRBY key increment member等同于ZADD key increment member
#对指定元素的分数加
127.0.0.1:6379> zscore zset1 centos
"300"
127.0.0.1:6379> zincrby zset1 32 centos
"332"
127.0.0.1:6379> zscore zset1 centos
"332" #对指定元素的分数减
127.0.0.1:6379> zscore zset1 centos
"332"
127.0.0.1:6379> zincrby zset1 -87 centos
"245"
127.0.0.1:6379> zscore zset1 centos
"245" #对不存在的元素进行score分数增
127.0.0.1:6379> zrange zset1 0 -1
1) "windows7"
2) "ubuntu"
3) "alpine"
4) "windows11"
5) "centos"
6) "windows10"
127.0.0.1:6379> zincrby zset1 324 unix
"324"
127.0.0.1:6379> zrange zset1 0 -1
1) "windows7"
2) "ubuntu"
3) "alpine"
4) "windows11"
5) "centos"
6) "unix"
7) "windows10"
7、删除元素
ZREM key member [member …]
可用版本: >= 1.2.0时间复杂度: O(M*log(N)),N为有序集的基数,M为被成功移除的成员的数量。移除有序集
key中的一个或多个成员,不存在的成员将被忽略。
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows7"
2) "90"
3) "ubuntu"
4) "160"
5) "alpine"
6) "170"
7) "windows11"
8) "198"
9) "centos"
10) "245"
11) "unix"
12) "324"
13) "windows10"
14) "900"
127.0.0.1:6379> zrem zset1 unix ios
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows7"
2) "90"
3) "ubuntu"
4) "160"
5) "alpine"
6) "170"
7) "windows11"
8) "198"
9) "centos"
10) "245"
11) "windows10"
12) "900"
ZREMRANGEBYRANK key start stop
可用版本: >= 2.0.0时间复杂度: O(log(N)+M),N为有序集的基数,而M为被移除成员的数量。移除有序集
key中,指定排名(rank)区间内的所有成员。区间分别以下标参数
start和stop指出,包含start和stop在内。下标参数
start和stop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。 你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows7"
2) "90"
3) "ubuntu"
4) "160"
5) "alpine"
6) "170"
7) "windows11"
8) "198"
9) "centos"
10) "245"
11) "windows10"
12) "900"
127.0.0.1:6379> zremrangebyrank zset1 0 2
(integer) 3
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows11"
2) "198"
3) "centos"
4) "245"
5) "windows10"
6) "900"
ZREMRANGEBYSCORE key min max
可用版本: >= 1.2.0时间复杂度: O(log(N)+M),N为有序集的基数,而M为被移除成员的数量。移除有序集
key中,所有score值介于min和max之间(包括等于min或max)的成员。
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows11"
2) "198"
3) "centos"
4) "245"
5) "windows10"
6) "900"
127.0.0.1:6379> zremrangebyscore zset1 -inf 300
(integer) 2
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows10"
2) "900"
使用DEL删除有序集合key
127.0.0.1:6379> del zset1
(integer) 1
五、哈希 hash

Hash哈希是一个字符类型String(field)与 值(value)的映射表,Redis中的每个哈希Hash可以存储 2^32-1 键值对,类似于字典作用,特别适用于存储对象场景。
1、生成hash key
HSET hash field value
可用版本: >= 2.0.0时间复杂度: O(1)将哈希表
hash中域field的值设置为value。如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行
HSET操作。如果域
field已经存在于哈希表中, 那么它的旧值将被新值value覆盖。
127.0.0.1:6379> hset hash1 id 1 name janzen age 18 sex man number 159159
(integer) 5
127.0.0.1:6379> type hash1
hash
HSETNX hash field value
可用版本: >= 2.0.0时间复杂度: O(1)当且仅当域
field尚未存在于哈希表的情况下, 将它的值设置为value。如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。
如果哈希表
hash不存在, 那么一个新的哈希表将被创建并执行HSETNX命令。返回值
HSETNX命令在设置成功时返回1, 在给定域已经存在而放弃执行设置操作时返回0
127.0.0.1:6379> exists hash2
(integer) 0
#hash 不存在
127.0.0.1:6379> hsetnx hash2 id 2
(integer) 1 #同时修改多个参数
127.0.0.1:6379> hsetnx hash2 id 2 name qiu
(error) ERR wrong number of arguments for 'hsetnx' command
#field 不存在
127.0.0.1:6379> hsetnx hash2 name qiu
(integer) 1 #field已存在
127.0.0.1:6379> hsetnx hash2 id 3
(integer) 0
127.0.0.1:6379>
2、获取hash key 对应字段的值
HGET hash field
可用版本: >= 2.0.0时间复杂度: O(1)返回哈希表中给定域的值。
127.0.0.1:6379> hget hash1 id
"1"
127.0.0.1:6379> hget hash1 name
"janzen"
127.0.0.1:6379> hget hash1 age
"18"
127.0.0.1:6379> hget hash2 id
"2"
127.0.0.1:6379> hget hash2 name
"qiu"
3、删除一个hash key的对应字段
HDEL key field [field …]
删除哈希表
key中的一个或多个指定域,不存在的域将被忽略。
127.0.0.1:6379> hdel hash2 id
(integer) 1
127.0.0.1:6379> hdel hash2 id name
(integer) 1
4、批量设置hash key 的多个filed和value
HMSET key field value [field value …]
同时将多个
field-value(域-值)对设置到哈希表key中。此命令会覆盖哈希表中已存在的域。
如果
key不存在,一个空哈希表被创建并执行 HMSET 操作
127.0.0.1:6379> hmset hash2 id 2 name qiu age 20 sex man number 970203
OK
5、获取hash中指定字段的值
HMGET key field [field …]
返回哈希表
key中,一个或多个给定域的值。如果给定的域不存在于哈希表,那么返回一个
nil值。因为不存在的
key被当作一个空哈希表来处理,所以对一个不存在的key进行 HMGET 操作将返回一个只带有nil值的表。
127.0.0.1:6379> hmget hash2 id name number
1) "2"
2) "qiu"
3) "970203"
127.0.0.1:6379> hmget hash1 id name number
1) "1"
2) "janzen"
3) "159159"
6、获取hash中的所有字段名field
HKEYS key
返回哈希表
key中的所有field
127.0.0.1:6379> hkeys hash1
1) "id"
2) "name"
3) "age"
4) "sex"
5) "number"
127.0.0.1:6379> hkeys hash2
1) "id"
2) "name"
3) "age"
4) "sex"
5) "number"
7、获取指定hash所有的value
HVALS key
返回哈希表
key中所有field的值。
127.0.0.1:6379> hvals hash1
1) "1"
2) "janzen"
3) "18"
4) "man"
5) "159159"
127.0.0.1:6379> hvals hash2
1) "2"
2) "qiu"
3) "20"
4) "man"
5) "970203"
8、获取指定hash的所有field和value值
HGETALL key
返回哈希表
key中,所有的域和值。
127.0.0.1:6379> hgetall hash1
1) "id"
2) "1"
3) "name"
4) "janzen"
5) "age"
6) "18"
7) "sex"
8) "man"
9) "number"
10) "159159"
127.0.0.1:6379> hgetall hash2
1) "id"
2) "2"
3) "name"
4) "qiu"
5) "age"
6) "20"
7) "sex"
8) "man"
9) "number"
10) "970203"
9、删除hash
HDEL key field [field …]
删除哈希表
key中的一个或多个指定域,不存在的域将被忽略。
127.0.0.1:6379> hgetall hash2
1) "id"
2) "2"
3) "name"
4) "qiu"
5) "age"
6) "20"
7) "sex"
8) "man"
9) "number"
10) "970203"
127.0.0.1:6379> hdel hash2 id
(integer) 1
127.0.0.1:6379> hgetall hash2
1) "name"
2) "qiu"
3) "age"
4) "20"
5) "sex"
6) "man"
7) "number"
8) "970203"
127.0.0.1:6379> hdel hash2 name age addr
(integer) 2
127.0.0.1:6379> hgetall hash2
1) "sex"
2) "man"
3) "number"
4) "970203"
使用DEL删除hash key
127.0.0.1:6379> hgetall hash2
1) "sex"
2) "man"
3) "number"
4) "970203"
127.0.0.1:6379> del hash2
(integer) 1
127.0.0.1:6379> hgetall hash2
(empty list or set)
127.0.0.1:6379> exists hash2
(integer) 0
127.0.0.1:6379>
【Redis】数据类型介绍的更多相关文章
- Redis数据类型介绍
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- Redis 数据类型介绍
http://qifuguang.me/2015/09/29/Redis%E4%BA%94%E7%A7%8D%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%BB%8B% ...
- Redis常用数据类型介绍、使用场景及其操作命令
Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...
- redis介绍、安装、redis持久化、redis数据类型
1.redis介绍 2.安装管网:https://redis.io/下载:wget -c http://download.redis.io/releases/redis-4.0.11.tar.gz解 ...
- Redis基本数据类型介绍笔记
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- redis数据类型的使用及介绍
Redis数据类型 1.Sting类型 set命令 设置键值,存在则覆盖,不存在则新建 set key value EX 秒 设置有效时长为秒 nx 如果键不存在则新建,如果存在返回nil xx 只有 ...
- Redis-cluster集群【第一篇】:redis安装及redis数据类型
Redis介绍: 一.介绍 redis 是一个开源的.使用C语言编写的.支持网络交互的.可以基于内存也可以持久化的Key-Value数据库. redis的源码非常简单,只要有时间看看谭浩强的C语言,在 ...
- [转] Redis系统性介绍
Redis系统性介绍 http://blog.nosqlfan.com/html/3139.html?ref=rediszt 虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了 ...
- Redis全面介绍
最近重新认识了一下Redis,借着这个机会,也整理一篇算是比较详尽和全面的文章吧. 缓存 缓存就是数据交换的缓冲区(称作Cache)——摘自百度百科.无论是在计算机硬件体系结构还是软件体系结构中, ...
- redis数据类型-散列类型
Redis数据类型 散列类型 Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他 ...
随机推荐
- Windows下fmt库的链接与使用
下载源码. 使用mingw编译源码.注意设置cmake文件的产生路径.pkgconfig文件的产生路径(windows下用不到产生的pc文件).库的安装路径. make -j8 install. 新建 ...
- Promise和await、同步和异步
1.同步和异步是什么: ①同步:同步是指如果一个进程在执行某个请求的时候,如果该请求需要等待一段时间,那么该进程会一直等待下去,直到收到返回信息才继续执行下去 ②异步: 指一个请求在执行某个请 ...
- Konga-Kong网关的权限控制指定消费者
刚开始陷入了误区了,网上很多参考例子都是如何实现身份证验证,而且看到konga上面配置身份插件的地方基本都有consumer一个配置项,一直纠结在这个如何通过key-auth实现指定的route或者s ...
- 文件上传 upload-labs Pass-18 条件竞争
Pass-18 条件竞争 审计源码 $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $ext_arr = array('jp ...
- JUC源码学习笔记8——ConcurrentHashMap源码分析1 如何实现低粒度锁的插入,如何实现统计元素个数,如何实现并发扩容迁移
源码基于jdk1.8 这一片主要讲述ConcurrentHashMap如何实现低粒度锁的插入,如何实现统计元素个数,如何实现并发扩容迁移 系列文章目录和关于我 一丶ConcurrentHashMap概 ...
- 全网最详细中英文ChatGPT-GPT-4示例文档-官网推荐的48种最佳应用场景——从0到1快速入门AI智能问答应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...
- IDEA编写JSP无代码提示
网上的版本 网上的版本 网上的我试了 但是未能解决 我自己解决的方法是 File => Poject Struct=>Modules=>"+"=>找到自己系 ...
- Windows10一劳永逸的禁止更新/恢复更新
之前发表过一篇文章Windows10彻底关闭自动更新,这篇文章相对复杂了些.而且还是有一定几率会触发从而自动打开更新.下面讲的就是怎么一次性永久关闭更新,即使触发了更新,也不能下载更新,从而达到真正的 ...
- Rainbond的 Gateway API 插件制作实践
Gateway API 作为新一代的流量管理标准,对原有 Ingress 的扩展不规范.移植性差等问题做出了改进.从兼容K8s生态和优化网关体验出发,Rainbond 支持以插件的形式扩展平台网关能力 ...
- VUE零碎小技巧1
1.回顾 创建项目 vue create myapp 准备 scss 库 修改了页面的主结构 App.vue 构建页面的基本结构 分离页面主结构,创建各个页面组件 views views/home/i ...


























