Redis 常用命令总结

文章目录

目录

文章目录

1 . 前置内容

1.1 基本全局命令

KEYS

 EXISTS 

​编辑

DEL

 EXPIRE

 TTL

TYPE

1.2 数据结构和内部编码

2. String类型

SET

GET

MGET

MSET

SETNX

INCR

INCRBY

DECR

DECYBY

INCRBYFLOAT

命令小结

内部编码

3 . Hash 哈希类型

HSET

HGET

HEXISTS

HDEL

HKEYS

HVALS

HGETALL

HMGET

HLEN

HSETNX

HINCRBY

 HINCRBYFLOAT

命令小结

内部编码

4 . List列表

LPUSH

LPUSHX

RPUSH

RPUSHX

LRANGE

LPOP

RPOP

LINDEX

LLEN

BLPOP

BRPOP

命令小结

内部编码

5 . Set 集合

SADD

SMEMBERS

SISMEMBER

SCARD

SPOP

SMOVE

SREM

SINTER

SINTERSTORE

SUNION

SUNIONSTORE

 SDIFF

SDIFFSTORE

命令小结

内部编码

6 . Zset 有序集合

ZADD

ZCARD

ZCOUNT

ZRANGE

ZREVRANGE

ZPOPMAX

BZPOPMAX

ZPOPMIN

BZPOPMIN

ZRANK

ZREVRANK

ZSCORE

ZREM

ZINCRBY

ZINTERSTORE

ZUNIONSTORE

命令小结

内部编码

7. 渐进式遍历

8. 数据库命令

总结


1 . 前置内容

1.1 基本全局命令

KEYS

语法

KEYS pattern

用于匹配所有符合模版条件的key


 EXISTS 

EXISTS key [key ...] 

判断某个 key 是否存在。

上面我们添加了三个key 分别是 k1 k2 k3 我们用存在的key和不存在的key来进行测试,看看结果如何


DEL

DEL  key [key ...] 

 删除指定的key

返回值: 删除掉key的个数


 EXPIRE

EXPIRE key seconds

为指定的 key 添加秒级的过期时间(Time To Live TTL)


 TTL

TTL key

获取指定 key 的过期时间,秒级。

返回值:剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在。


TYPE

TYPE key

返回 key 对应的数据类型。

 

1.2 数据结构和内部编码

type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列 表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是 Redis 对外的数据结构,实际上 Redis 针对每种数据结构都有自己的底层内部编码实现,而且是多种实现,这样 Redis 会 在合适的场景选择合适的内部编码。

  1. 字符串(String):Redis 使用简单动态字符串(SDS)来存储字符串数据。SDS 是一种结构化的字符串表示,可以动态调整大小,并且可以在 O(1) 时间内获取字符串长度。

  2. 列表(List):Redis 使用压缩列表(ziplist)或双向循环链表(linkedlist)来存储列表数据。压缩列表是一种紧凑的数据结构,可以在一定程度上节省内存空间。双向循环链表则提供了更好的性能,但会消耗更多的内存。

  3. 哈希表(Hash):Redis 使用压缩列表或哈希表(hashtable)来存储哈希数据。压缩列表适用于小规模的哈希数据,而哈希表则适用于大规模的哈希数据。

  4. 集合(Set):Redis 使用整数集合(intset)或哈希表来存储集合数据。整数集合适用于存储整数类型的数据,而哈希表适用于存储任意类型的数据。

  5. 有序集合(Sorted Set):Redis 使用跳跃表(skiplist)和哈希表来存储有序集合数据。跳跃表提供了快速的查找和插入操作,而哈希表则提供了快速的范围查询操作。

2. String类型

SET

将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]

EX seconds⸺使用秒作为单位设置 key 的过期时间。

PX milliseconds⸺使用毫秒作为单位设置 key 的过期时间。

NX ⸺只在 key 不存在时才进行设置,即如果 key 之前已经存在,设置不执行。

XX ⸺只在 key 存在时才进行设置,即如果 key 之前不存在,设置不执行。

GET

获取 key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是 string,会报错。

GET key

MGET

⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil。

MGET key [key ...]

MSET

⼀次性设置多个 key 的值。

MSET key value [key value ...]

SETNX

设置 key-value 但只允许在 key 之前不存在的情况下。

SETNX key value

INCR

将 key 对应的 string 表示的数字加1。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

INCR key

INCRBY

Increment the integer value of a key by the given amount

增加指定的数字为指定的value

DECR

将 key 对应的 string 表示的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对 应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错

DECYBY

将 key 对应的 string 表示的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如 果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

INCRBYFLOAT

将 key 对应的 string 表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报 错。允许采用科学计数法表示浮点数。

命令小结

命令执行效果时间复杂度

set key value [key value...]

设置key的值为valueO(N) N是键的个数
get key得到key对应的value的值O(1)
del key [key...]删除指定的keyO(N) N是键的个数
mset key value[key value...] 批量设置指定的key和valueO(N) N是键的个数
mget key批量获取 key 的值O(N) N是键的个数
incr key指定的key + 1O(1)
decr key指定的key - 1O(1)
incrby key n指定的key + nO(1)
decrby key n指定的key - nO(1)
incrbyfloat key n指定的key + nO(1)
append key value指定的key追加valueO(1)
strlen key获取指定的key的值的长度

O(1)

setrange key offset value覆盖指定的key从offset开始的部分值O(1)
getrange key start end获取指定的key从start 到end部分的值O(1)

内部编码

字符串类型的内部编码有 3 种:

  • int: 8 个字节的长整型。
  • embstr: 小于等于39个字节的字符串
  • raw: 大于等于39个字节的字符串

3 . Hash 哈希类型

 

哈希类型中的映射关系通常称为 field-value,用于区分 Redis 整体的键值对(key-value), 注意这里的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下 文的作用。

HSET

 设置 hash 中指定的字段(field)的值(value)。

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello

HGET

获取 hash 中指定字段的值。

redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
redis> HGET myhash field2
(nil)

HEXISTS

判断 hash 中是否有指定的字段。

redis> HSET myhash field1 "foo"
(integer) 1
redis> HEXISTS myhash field1
(integer) 1
redis> HEXISTS myhash field2
(integer) 0

HDEL

删除 hash 中指定的字段。

redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0

HKEYS

获取 hash 中的所有字段。

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HKEYS myhash
1) "field1"
2) "field2"

HVALS

获取 hash 中的所有的值。

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HVALS myhash
1) "Hello"
2) "World"

HGETALL

获取 hash 中的所有字段以及对应的值。

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"

HMGET

⼀次获取 hash 中多个字段的值

redis> HSET myhash field1 "Hello"
比特就业课
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HMGET myhash field1 field2 nofield
1) "Hello"
2) "World"
3) (nil)

HLEN

获取 hash 中的所有字段的个数。

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2

HSETNX

在字段不存在的情况下,设置 hash 中的字段和值。

redis> HSETNX myhash field "Hello"
(integer) 1
redis> HSETNX myhash field "World"
(integer) 0
redis> HGET myhash field
"Hello"

HINCRBY

 将 hash 中字段对应的数值添加指定的值。

redis> HSET myhash field 5
(integer) 1
redis> HINCRBY myhash field 1
(integer) 6
redis> HINCRBY myhash field -1
(integer) 5
redis> HINCRBY myhash field -10
(integer) -5

 HINCRBYFLOAT

HINCRBY 的浮点数版本。

redis> HSET mykey field 10.50
(integer) 1
redis> HINCRBYFLOAT mykey field 0.1
"10.6"
redis> HINCRBYFLOAT mykey field -5
"5.6"
redis> HSET mykey field 5.0e3
(integer) 0
redis> HINCRBYFLOAT mykey field 2.0e2
"5200"

命令小结

命令执行效果时间复杂度
hset key field value设置值O(1)
hget key fileld获取值O(1)
hdel key field[field ...]删除fieldO(k) k是field的个数
hlen key计算field的个数O(1)
hgetall key获取所有的field-valueO(k) k是field的个数
hmget field [field ...]批量获取field-valueO(k) k是field的个数
hmset field value[field value ...]批量设置field-valueO(k) k是field的个数
hexists key field判断field是否存在O(1)
hkeys key获取所有的fieldO(k) k是field的个数
hvals key获取所有的valueO(k) k是field的个数
hsetnx key field value设置key 如果field不存在O(1)
hincrby key field n对应的field-value + n

O(1)

hincrbyfloat key field n对应的field-value + nO(1)
hstrlen key field计算value的字符串长度O(1)

内部编码

ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)、 同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈 希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀。

hashtable(哈希表):当哈希类型无法满足 ziplist 的条件时,Redis 会使用hashtable 作为哈希 的内部实现,因为此时 ziplist 的读写效率会下降,而hashtable 的读写时间复杂度为 O(1)。

4 . List列表

列表(List)是一种简单的、可变长度的字符串序列,支持在两端进行插入和删除操作。

LPUSH

将一个或者多个元素从左侧放入(头插)到 list 中

redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"

LPUSHX

在 key 存在时,将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSHX mylist "Hello"
(integer) 2
redis> LPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)

RPUSH

将一个或者多个元素从右侧放入(尾插)到 list 中

redis> RPUSH mylist "world"
(integer) 1
redis> RPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "world"
2) "hello"

RPUSHX

在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。

redis> RPUSH mylist "World"
(integer) 1
redis> RPUSHX mylist "Hello"
(integer) 2
redis> RPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "World"
2) "Hello"
redis> LRANGE myotherlist 0 -1
(empty array)

LRANGE

获取从 start 到 end 区间的所有元素,左闭右闭

redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LRANGE mylist 0 0
1) "one"
redis> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist 5 10
(empty array)

LPOP

从 list 左侧取出元素(即头删)。

redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> LPOP mylist
"one"
redis> LPOP mylist
"two"
redis> LPOP mylist
"three"
redis> LRANGE mylist 0 -1
1) "four"
2) "five"

RPOP

从 list 右侧取出元素(即尾删)。

redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> RPOP mylist
"five"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
4) "four"

LINDEX

获取从左数第 index 位置的元素

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3
(nil)

LLEN

获取 list ⻓度。

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LLEN mylist
(integer) 2

BLPOP

阻塞版本

BRPOP

阻塞版本

命令小结

操作类型命令时间复杂度
添加rpush key value [value...]

O(K), K是元素个数

lpush key value [value ...]O(K), K是元素个数
linsert key before | after pivot valueO(n), n是pivot距离头尾的距离
查找lrange key start endO(s+n),s 是 start 偏移量,n 是 start 到 end 的范 围
lindex key indexO(n),n 是索引的偏移量
llen keyO(1)
删除lpop keyO(1)
rpop keyO(1)
lrem key count valueO(K), K是元素个数
ltrim key dtart endO(K), K是元素个数
修改lset key index valueO(n) , n是索引的偏移量
阻塞操作blpop brpopO(1)

内部编码

Ziplist:

  • 当列表的元素数量较少且每个元素的长度较短时,Redis会使用Ziplist编码。
  • Ziplist是一种紧凑的内存表示方式,可以有效地存储小型列表。
  • 优点:节省内存,适合小型列表。
  • 缺点:在进行插入和删除操作时,性能较低。

Linked List:

  • 当列表的元素数量增加到一定阈值时,Redis会将其转换为双向链表。
  • 链表允许在两端快速插入和删除操作。
  • 优点:支持快速的插入和删除操作。
  • 缺点:相对于Ziplist,内存占用更高。

Quicklist:

  • Redis 3.2引入了Quicklist作为列表的默认实现。
  • Quicklist结合了Ziplist和链表的优点,使用多个Ziplist块来存储元素,并通过链表连接这些块。
  • 优点:在内存使用和性能之间取得了良好的平衡,适合大多数使用场景。

5 . Set 集合

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中

1)元素之间是无序的

2)元素不允许重复。

一个集合中最多可以存储 2^{32}-1个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。

SADD

将⼀个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "Hello"
2) "World"

SMEMBERS

获取⼀个 set 中的所有元素,注意,元素间的顺序是无序的。

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "Hello"
2) "World"

SISMEMBER

判断⼀个元素在不在 set 中。

redis> SADD myset "one"
(integer) 1
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0

SCARD

获取⼀个 set 的基数(cardinality),即 set 中的元素个数。

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2

SPOP

从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。

SMOVE

将一个元素从源 set 取出并放入目标 set 中。

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myotherset "three"
(integer) 1
redis> SMOVE myset myotherset "two"
(integer) 1
redis> SMEMBERS myset
1) "one"
redis> SMEMBERS myotherset
1) "three"
2) "two"

SREM

将指定的元素从 set 中删除。

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
redis> SMEMBERS myset
1) "three"
2) "two"

SINTER

获取给定 set 的交集中的元素。

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTER key1 key2
1) "c"

SINTERSTORE

获取给定 set 的交集中的元素并保存到目标 set 中。

SINTERSTORE destination key [key ...]
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTERSTORE key key1 key2
(integer) 1
redis> SMEMBERS key
1) "c"

SUNION

获取给定 set 的并集中的元素

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNION key1 key2
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

SUNIONSTORE

获取给定 set 的并集中的元素并保存到目标 set 中。

SUNIONSTORE destination key [key ...]
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNIONSTORE key key1 key2
(integer) 5
redis> SMEMBERS key
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

 SDIFF

获取给定 set 的差集中的元素

SDIFF key [key ...]
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"

SDIFFSTORE

获取给定 set 的差集中的元素并保存到目标 set 中

SDIFFSTORE destination key [key ...]
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFFSTORE key key1 key2
(integer) 2
redis> SMEMBERS key
1) "a"
2) "b"

命令小结

命令时间复杂度
sadd key element[element ...]O(K), K是元素个数
srem key element [element ...]O(K), K是元素个数
scard keyO(1)
sismember key elementO(1)
spop key [count]O(n), n是count
smemebers keyO(K), K是元素个数
sinter key [key...] siterstore O(m*k) , k十几个集合中元素最小的个数, m是键个数
sunion key[key ...] sunionstoreO(K), K是多个集合元素个数总和
sdiff key [key ...] sdiffstoreO(K), K是多个集合元素个数总和

内部编码

集合类型的内部编码有两种:

intset(整数集合):当集合中的元素都是整数并且元素的个数小于 set-max-intset-entries 配置 (默认 512 个)时,Redis 会选用intset 来作为集合的内部实现,从而减少内存的使用。 • hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合 的内部实现。

6 . Zset 有序集合

有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌生。它保留了集合不能有重复成员的 特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是用下标作为排序依据而是用这个分数。

ZADD

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。

XX:仅仅⽤于更新已经存在的元素,不会添加新元素。 

NX:仅⽤于添加新元素,不会更新已经存在的元素。 

CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更 新的元素的个数。

INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和 分数。

ZCARD

获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2

ZCOUNT

返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的

ZCOUNT key min max
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZCOUNT myzset -inf +inf
(integer) 3
redis> ZCOUNT myzset 1 3
(integer) 3
redis> ZCOUNT myzset (1 3
(integer) 2
redis> ZCOUNT myzset (1 (3
(integer) 1

ZRANGE

返回指定区间⾥的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"

ZREVRANGE

返回指定区间里的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
3) "two"
4) "2"
5) "one"
6) "1"
redis> ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
redis> ZREVRANGE myzset 2 3
1) "one"
redis> ZREVRANGE myzset -2 -1
1) "two"
2) "one"

ZPOPMAX

删除并返回分数最高的 count 个元素

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMAX myzset
1) "three"
2) "3"

BZPOPMAX

ZPOPMAX 的阻塞版本。

ZPOPMIN

删除并返回分数最低的 count 个元素

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMIN myzset
1) "one"
2) "1"

BZPOPMIN

ZPOPMIN 的阻塞版本。

ZRANK

返回指定元素的排名,升序。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANK myzset "three"
(integer) 2
redis> ZRANK myzset "four"
(nil)

ZREVRANK

返回指定元素的排名,降序。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANK myzset "one"
(integer) 2
redis> ZREVRANK myzset "four"
(nil)

ZSCORE

返回指定元素的分数。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"

ZREM

删除指定的元素。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREM myzset "two"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"

ZINCRBY

为指定的元素的关联分数添加指定的分数值

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"

ZINTERSTORE

求出给定有序集合中元素的交集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元 素对应的分数按照不同的聚合方式和权重得到新的分数。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "two"
4) "10"

ZUNIONSTORE

求出给定有序集合中元素的并集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元 素对应的分数按照不同的聚合方式和权重得到新的分数。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"

命令小结

命令作用时间复杂度
zadd key score member[score member ...]给集合中添加成员

O(K*log(n)),K是添加成员的个数,

n是当前有序集合的元素个数

zcard key获取集合中成员个数O(1)
zscore key member返回指定成员的分数O(1)
zrank key member[member...]返回指定元素的排名,升序O(log(n)), n是当前有序集合的元素个数
zrem key member [member ...]移除成员O(k * log(n)),k 是删除成员的个数,n 是当前有序集合的元 素个数
zincrby key increment member增加指定值O(log(n)),n 是当前有序集合的元素个数

zrange key start end [withscores]

zrevrange key start end

 [withscores]

获取分数在start和end范围类的成员O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元 素个数
zcount获取集合中成员的数量O(log(n)),n 是当前有序集合的元素个数
zinterstore destination numkeys key [key ...]将指定集合取并集并将结果保存入新的集合中O(n * k) + O(m * log(m)),n 是输⼊的集合最⼩的元素个数, k 是集合个数, m 是⽬标集合元素个数
zunionstore destination numkeys key [key ...]将指定集合取交集并奖结果保存入新的集合中O(n) + O(m * log(m)),n 是输⼊集合总元素个数,m 是⽬标 集合元素个数

内部编码

ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认 128 个), 同时每个元素的值都小于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会用 ziplist 来作 为有序集合的内部实现,ziplist 可以有效减少内存的使用。

skiplist(跳表):当 ziplist 条件不满足时,有序集合会使⽤ skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降

7. 渐进式遍历

渐进式遍历(Incremental Traversal)是一种在数据结构中逐步访问元素的方法,通常用于处理大型数据集或流式数据,以避免一次性加载所有数据而导致的内存消耗。

关键概念:

  1. 分批处理:数据被分成多个小批次进行处理,而不是一次性加载所有数据。这种方法可以减少内存使用并提高响应速度。

  2. 懒加载:仅在需要时加载数据,而不是预先加载所有数据。这种方式可以提高性能,尤其是在处理大数据集时。

  3. 迭代器模式:使用迭代器来逐步访问数据结构中的元素。迭代器可以提供一种统一的方式来遍历不同类型的数据结构。

redis 127.0.0.1:6379> scan 0
1) "17"
2) 1) "key:12"2) "key:8"3) "key:4"4) "key:14"5) "key:16"6) "key:17"7) "key:15"8) "key:10"9) "key:3"10) "key:7"11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"2) "key:18"3) "key:0"4) "key:2"5) "key:19"6) "key:13"7) "key:6"8) "key:9"9) "key:11"

8. 数据库命令

切换数据库
select dbIndex
清除数据库
flushdb / flushall  # flushdb 只清除当前数据库,flushall 会清楚所有数
据库。

总结

以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gpt4最新保姆级教程

如何使用 WildCard 服务注册 Claude3 随着 Claude3 的震撼发布&#xff0c;最强 AI 模型的桂冠已不再由 GPT-4 独揽。Claude3 推出了三个备受瞩目的模型&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 以及 Claude 3 Opus&#xff0c;每个模型都展现了卓越的性能与特色。其中&a…

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…

【Vue】pnpm创建Vue3+Vite项目

初始化项目 &#xff08;1&#xff09;cmd切换到指定工作目录&#xff0c;运行pnpm create vue命令&#xff0c;输入项目名称后按需安装组件 &#xff08;2&#xff09;使用vs code打开所创建的项目目录&#xff0c;Ctrl~快捷键打开终端&#xff0c;输入pnpm install下载项目…

[概率论] 随机变量的分布函数 (一)

文章目录 1.随机变量的分布函数2.离散型随机变量的分布函数3.连续性随机变量的分布函数 1.随机变量的分布函数 设X XX是一个随机变量&#xff0c;x xx是任意实数&#xff0c;则函数 几何表示 性质&#xff08;一个函数是分布函数的充要条件&#xff09; 2.离散型随机变量的分布…

数据结构-图-存储-邻接矩阵-邻接表

数据结构-图-存储 邻接矩阵 存储如下图1,图2 图1 对应邻接矩阵 图2 #include<bits/stdc.h> #define MAXN 1005 using namespace std; int n; int v[MAXN][MAXN]; int main(){cin>>n;for(int i1;i<n;i){for(int j1;j<n;j){cin>>v[i][j];}}for(int…

深度解析Unix系统的基本概念及优缺点和原理

介绍 Unix系统是一种多用户、多任务、分时操作系统&#xff0c;起源于20世纪70年代初&#xff0c;由贝尔实验室开发。它具有强大的命令行接口和层次结构的文件系统&#xff0c;支持多种处理器架构&#xff0c;广泛应用于工程应用和科学计算等领域。 基本概念 一、Unix系统的起…

数学建模强化宝典(13)M-K检验法

前言 M-K检验法&#xff0c;全称为Mann-Kendall检验法&#xff0c;是一种非参数的假设检验方法&#xff0c;广泛应用于时间序列数据的趋势性变化检验&#xff0c;特别是气候序列中的趋势分析和突变点检测。以下是对M-K检验法的详细介绍&#xff1a; 一、定义与背景 M-K检验法由…

嵌入式初学-C语言-数据结构--四

栈 1. 基本概念 栈是一种逻辑结构&#xff0c;是特殊的线性表。特殊在&#xff1a; 只能在固定的一端操作 只要满足上述条件&#xff0c;那么这种特殊的线性表就会呈现一种“后进先出”的逻辑&#xff0c;这种逻辑就被称为栈。栈 在生活中到处可见&#xff0c;比如堆叠的盘子…

Kubernetes部署(haproxy+keepalived)高可用环境和办公网络打通

HAProxy Keepalived 部署高可用性入口&#xff1a; 部署两台或多台节点运行 HAProxy 作为负载均衡器。使用 Keepalived 实现 VIP&#xff08;虚拟 IP&#xff09;&#xff0c;为 HAProxy 提供高可用性。Keepalived 会监控 HAProxy 的状态&#xff0c;如果主节点失效&#xff0…

Spring AOP,通知使用,spring事务管理,spring_web搭建

spring AOP AOP概述 AOP面向切面编程是对面向对象编程的延续&#xff08;AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程,AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff09;的一种补充。&#xff09; 面向切面编…

【C++二分查找】1482. 制作 m 束花所需的最少天数

本文涉及的基础知识点 C二分查找 LeetCode1482. 制作 m 束花所需的最少天数 给你一个整数数组 bloomDay&#xff0c;以及两个整数 m 和 k 。 现需要制作 m 束花。制作花束时&#xff0c;需要使用花园中 相邻的 k 朵花 。 花园中有 n 朵花&#xff0c;第 i 朵花会在 bloomDay…

南京网站设计手机用的网站

近年来&#xff0c;随着移动互联网的快速发展&#xff0c;越来越多的用户通过手机浏览网页&#xff0c;这使得网站设计逐渐向移动端倾斜。在南京&#xff0c;网站设计特别注重适配手机端&#xff0c;这不仅是用户体验的提升&#xff0c;也是市场竞争的需要。一个响应式的网站能…

vue3 v-bind=“$attrs“ 的一些理解,透传 Attributes相关说明及事例说明

1、可能小伙伴们经常会在自己的项目中看到v-bind"$attrs"&#xff0c;这个一般是在自定义组件中看到。 比如&#xff1a; <template><BasicModalv-bind"$attrs"register"registerModal":title"getTitle"ok"handleSubm…

Python进程间网络远程通讯方式:socket、pipe、RPC详解!

背景 最近在进行开发工作的时候&#xff0c;遇到了一个场景&#xff1a; pc程序需要和安卓设备进行通讯和接口调用。 此时就需要进行远程调用方法。然而大学时代有关于远程过程调用的知识都还给了老师……所以在此进行一个复习&#xff0c;并进行实战演练&#xff01; 网络…

UE驻网失败问题(三)

这个问题是lab问题&#xff0c;现象如下&#xff1a; 期望UE注册在SA网络下&#xff0c;咋一看没有5G MIB/SIB1打印&#xff0c;好像是没搜到5G小区&#xff0c;而实际上并不是这样。 在查看搜网过程时会发现如下log打印&#xff1a; [I nr5g_rrc_acq.c 3544] RRC ACQ: Band 41…

一个全面、先进、公平且模块化的开源RAG框架

两个关键问题限制了 RAG 的发展&#xff1a; 新型 RAG 算法之间缺乏全面和公平的比较。 像 LlamaIndex 和 LangChain 这样的开源工具使用了高级抽象&#xff0c;这导致了透明度的缺失&#xff0c;并限制了开****发新算法和评估指标的能力。 RAGLAB&#xff1a;是一个模块化的…

QML学习三:qml设计器报错 Line: 0: The Design Mode requires a valid Qt kit

开发环境:Qt 6.5.3 LTS 1、Qt 6.5.3 LTS 2、Pyside6 3、Python 3.11.4 4、win11 默认不打开设计器的时候可以看到我们默认是有Python的环境,而且点击运行是可以运行的。但是当打开qml设计器时提示下面这个错误,提示需要一个可用的套件。 解决办法: 点击+号创建新的套件…

OpenAI官宣ChatGPT用户破2亿,新模型比GPT-4强100倍!

在刚刚召开的“KDDI SUMMIT 2024”大会上&#xff0c;OpenAI日本首席执行官長崎忠雄表示&#xff0c;截止至今年8月底&#xff0c;ChatGPT的月活用户数量突破2亿大关&#xff0c;成为史上最快达到这一成就的软件产品。 同时&#xff0c;ChatGPT企业级用户也获得大幅度增长达到…

Windows自动化程序开发指南

自动化程序的概念 “自动化程序”指的是通过电脑编程来代替人类手工操作的一类程序或软件。这类程序具有智能性高、应用范围广的优点&#xff0c;但是自动化程序的开发难度大、所用技术杂。 本文对自动化程序开发的各个方面进行讲解。 常见的处理对象 自动化程序要处理的对…

STM32关于keil使用过程中遇到的问题

1.设备管理器STlink驱动确认安装完成&#xff0c;但是keil里一直识别不到&#xff0c;换下载器也没用 &#xff08;1&#xff09;问题描述 我的问题是这样产生的&#xff1a;之前用标准库开发STM32的时候&#xff0c;STLink能够正常使用&#xff0c;然后使用HAL库开发的时候出…