如何在 Redis 命令中使用 Key

分类:编程技术 时间:2024-02-20 15:24 浏览:0 评论:0
0
本文介绍如何在Redis命令中使用Keys。内容非常详细。有兴趣的朋友可以参考一下。希望对大家有所帮助。

DEL

删除指定的键值对。如果指定的键不存在,它将被忽略。 DEL命令的时间复杂度为O(N)。对于字符串以外的数据类型,命令的时间复杂度为 O(M),其中 M 是值的元素数量。因此,在生产环境中,尽量避免一次性删除过多的复杂数据类型。

127.0.0.1:6379> SET key1 "jackey"OK127.0.0.1:6379> SET key2 "zhe"OK127.0.0.1:6379> DEL key1 key2 key3(integer) 2

DUMP

最早可用的版本是2.6.0

使用Redis格式序列化指定键存储的值。可以使用 RESTORE 命令反序列化该值。

这种序列化格式有以下3个特点:

p>

它包含用于错误检查的 64 位校验和。 RESTORE 命令将在反序列化之前对其进行检查。校验和的编码格式

值的编码格式与RDB文件的编码格式相同

RDB版本会序列化到值中,因此不同Redis版本可能不兼容 RDB版本拒绝反序列化

序列化值不包含过期时间相关信息。您可以使用PTTL命令获取当前值的生存时间。如果值不存在,则返回 nil

127.0.0.1:6379> SET key1 "jackey"OK127.0.0.1:6379> DUMP key1"\x00 \x06jackey\ b\x00\xec\x89'G'X\xfc:"127.0.0.1:6379> DUMP not-exist-key(nil)

DUMP时间复杂度分为两部分:访问键值的时间复杂度为 O(1),而序列化值的时间复杂度为 O(N*M),N 为组成该值的元素数量,M is 元素平均大小。如果序列化一个相对较短的字符串,则该命令的时间复杂度可以视为 O(1)。

EXISTS

最早可用的版本1.0.0

用于判断key是否存在。 3.0.3及以后版本支持多参数,即可以一次确定多个key,返回值为已有key的个数。判断单个key是否存在,返回1或0。因此,该命令是向后兼容的。

需要注意的是,如果参数中有重复的命令,则返回的结果不会进行去重。

127.0.0.1:6379> SET key1 "jackey"OK127.0.0.1:6379> SET key2 "zhe"OK127.0.0.1:6379> EXISTS key1(整数) 1127.0.0.1:6379> 存在不存在键(整数) 0127.0.0.1:6379> 存在 key1 key2 不存在键(整数) 2127.0.0.1:6379> 存在 key1 key1 key1(整数) 3

过期

T最早可用的版本是1.0.0

设置指定key的生存时间。生存时间将被DEL、SET、GETSET和所有STORE命令删除或覆盖。如果我们只修改key的值而不修改生存时间或者保存到新的key中,那么原key的生存时间保持不变。如果使用 RENAME 重命名密钥,则原密钥的生存时间将分配给新密钥。

如果想清除生存时间并使指定的密钥成为永久密钥,可以使用PERSIST命令。稍后我们将详细介绍该命令。

如果使用EXPIRE/PEXPIRE为某个key设置的生存时间为非正数,或者使用EXPIREAT/PEXPIREAT设置了过去的时间,则该key将被直接删除。

127.0.0.1:6379> EXPIRE key1 -1(integer) 1127.0.0.1:6379> EXISTS key1(integer) 0

对于已经如果一个有生存时间的key使用EXPIRE重新设置生存时间,密钥的生存时间将被更新。我们将在许多应用中使用它。

注意:在Redis 2.1.3版本之前,如果修改一个有生存时间的key的值,整个key将会被删除。

关于时间精度,在Redis 2.4版本中,key过期后1秒内仍然可以被访问,但在2.6版本中,这个时间已经精确到1毫秒。因为从2.6版本开始,生存时间保存的是绝对时间(Unix时间戳),这意味着你的计算机的时间需要可靠。如果你在另一台机器上加载RDB文件,当两台机器的时间差较大时,你会发现有些key可能被删除了或者有些key的生存时间被延长了。

让我们讨论一下 Redis 如何使密钥过期。 Redis有两种过期策略:一种是被动的,一种是主动的。

被动过期是指当客户端访问某个key时,服务器会检查该keykey的生存时间来判断它是否已经过期。当然,这种过期策略存在一定的问题。如果一个密钥从未被访问过,就不会发现它已过期,并且它将永远“活”在内存中。因此,Redis会定期随机检查已经设置了生存时间的key,看看它们是否已经过期。如果过期了,会及时清理。 Redis 每秒会执行以下操作 10 次:

随机检查 20 个具有设定生存时间的键(从具有设定生存时间的集合中取出)

删除所有过期的键< /p>

如果过期密钥超过25%,则会从第一步开始重新执行

EXPIREAT

最早可用版本1.2.0

该命令与EXPIRE功能相同,只不过其参数需要传递Unix时间戳(即从70年1月1日起19毫秒起)。

127.0.0.1:6379> 获取 key2"zhe"127.0.0.1:6379> EXPIREAT key2 1537733374(整数) 1127.0.0.1:6379> TTL key2(整数) 12960 

密钥

最早可用版本1.0.0

该命令会返回所有匹配的key,时间复杂度为O(N)。根据官方文档,在入门级笔记本电脑上,Redis 扫描 100 万个键只需要 40 毫秒,但我们仍然需要在生产环境中避免使用该命令。特别是千万不要使用KEYS *之类的命令,因为你不知道生产环境中存在多少个key。此类命令可能会导致生产环境中的Redis长时间不可用。因此,请立即删除应用层代码中的KEYS命令或者花时间更新你的简历。

如果需要查找密钥,可以使用SCAN命令或sets命令。

虽然我们强烈反对使用KEYS命令,但它的匹配策略仍然需要引入:

?是单个字符通配符,* 是任意数量的通配符,[ae] 将匹配 a 或 e,^e 表示不匹配 e,a-c 表示匹配 a、b 或 c,特殊符号以 \ 分隔。

127.0.0.1:6379> MSET key1hello jackey key2hello zhe 年龄 3OK127.0.0.1:6379> KEYS key?hello1) "key1hello"2) "key2hello"127.0. 0.1:6379> 键 k*1) "key1hello"2) "key2hello"127.0.0.1:6379> 键 *age*1) "age"127.0.0.1:6379> 键 *1) "age"2) "key1hello" 3)“key2hello”

MIGRATE

最早可用的版本是2.6.0

使用此命令以原子操作将源实例的密钥传输到目标实例,然后删除源实例的密钥。相当于对源实例执行DUMP+DEL操作,对目标实例执行RESTORE操作。此操作将阻止两个传输实例。在传输过程中,密钥将始终存在于一个实例中,除非有特殊情况发生 eout 错误。 3.2版本之后,MIGRATE可以作为管道一次传输多个密钥。

执行MIGRATE命令时,必须设置超时时间。如果超时后未执行该命令,则会抛出IOERR。但当返回这个错误时,两个实例可能有两种状态:要么指定的key在两个实例中都存在,要么指定的key仅在源实例中存在。总之,钥匙不会丢失。

从3.0.6版本开始,MIGRATE支持一次传输多个密钥。为了保证不发生重载或环操作,MIGRATE需要使用KEYS参数,并且原来指定的key的参数必须设置为空字符。细绳。

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

需要引入两个可选参数:一个是COPY,添加该参数后,源实例中的key不会被删除r 传输完成。另一个是替换。该参数的作用是替换目标实例已有的key。这两个参数只有3.0版本以后才能使用。

MOVE

最早可用的版本是1.0.0

不知道你是否还记得我们在上一篇文章中提到过的 SELECT 命令之前已经使用过,SELECT 是用来切换数据库的。使用MOVE命令是将当前数据库的key移动到指定数据库。如果指定库中已经存在该密钥或者当前库中不存在该密钥,那么该命令会做什么?什么也不做。

127.0.0.1:6379> 键 *1) "age"2) "key1hello"3) "key2hello"127.0.0.1:6379> 移动年龄 1(整数) 1127.0.0.1:6379> 密钥 *1) "key1hello"2) "key2hello"127.0.0.1:6379> 选择 1OK127.0.0.1:6379[1]> 密钥 *1) "年龄"

OBJECT

最早可用的版本是2.2.3

OBJECT用于查看Redis对象内部的相关信息。该命令在调试时经常使用。下面介绍一下OBJECT命令的具体用法:

OBJECT REFCOUNT key:返回指定key的值的引用次数

OBJECT ENCODING key:返回使用的编码格式指定key的内部存储

OBJECT IDLETIME key:返回指定key的空闲时间(多长时间没有被读写)。当前的最小精度为 10 秒。该命令常用于Redis淘汰机制(淘汰策略为LRU或noeviction)

OBJECT FREQ key:返回指定key的访问频率的对数。当淘汰策略为LFU时,会使用该命令

OBJECT HELP:返回帮助信息

对象的编码格式也有很多种:

字符串会被编码为 raw 或 int

列表将被编码为 ziplist 或 linkedlist

< p>Sets 将被编码为 intset 或 hashtable

Hash 将被编码为 ziplist 或 hashtable

Sorted Sets 将被编码为 ziplist 或 Skiplist

127.0.0.1:6379> 对象引用 key1hello(integer) 1127.0.0.1:6379> 对象 IDLETIME key2hello(integer) 3637127.0.0.1:6379> 对象编码年龄“int”

PERSIST

最早可用版本为2.2.0

删除指定密钥的过期时间,使其成为永久密钥。

PEXPIRE

最早可用版本是2.6.0

PEXPIRE与EXPIRE功能相同,只是时间单位不同参数中为毫秒。

PEXPIREAT

最早可用版本为2.6.0

函数为与EXPIREAT相同,参数也是毫秒。

PTTL

最早可用版本是2.6.0

返回指定键i的剩余生存时间n毫秒。2.8以后的版本返回值有一些变化。如果key不存在,则返回-2;如果密钥是永久的,则返回 -1。

RANDOMKEY

最早可用版本 1.0.0

该命令用于从当前数据库返回一个随机密钥。

RENAME

最早可用的版本是1.0.0

重命名键。如果key不存在,则会返回错误。如果新密钥已经存在,此命令将覆盖它。原始key(它实际上执行了隐式DEL命令,因此如果原始key中存储的对象很大,则删除操作延迟会很高)。 3.2版本之前,如果源key和目标key相同,会报错。

RENAMENX

如果新的key不存在,重命名该key,如果存在则返回0,成功返回1。

RESTORE

最早可用版本2.6.0

用法:RESTORE key ttl serialized-value [REPLACE]

该命令是反序列化一组数据并保存到key中。如果 ttl 为 0,则密钥是永久的。 Redis 3.0版本之后,如果不使用REPLACE参数且key已经存在,会返回“Target key name is busy”错误。

SCAN

最早可用版本2.8.0

用法:SCAN光标匹配模式COUNT计数

>

其中cursor为光标,MATCH和COUNT为可选参数。

SCAN命令和SSCAN、HSCAN、ZSCAN命令都用于增量迭代元素集。它每次返回少量数据,不会像KEYS那样阻塞Redis。 SCAN 命令基于游标。每次调用后,将为下一次迭代返回一个游标。当光标返回0时,表示迭代结束。

SCAN每次返回的数字并不固定,返回的数据也可能为空。此外,扫描命令支持像 KEYS 命令一样的匹配。

我们在 Redis 中存储了 10,000 个密钥用于测试。

结果如下:

127.0.0.1:6379> scan 0 match key24* count 10001) "1688"2) 1) " key2411" 2) "key2475" 3) "key2494" 4) "key2406" 5) "key2478"127.0.0.1:6379> 扫描 1688 匹配 key24* 计数 10001) "2444"2) 1) "key2458" 2) "key249 " 3) "key2407" 4) "key2434" 5) "key241" 6) "key2497" 7) "key2435" 8) "key2413" 9) "key2421" 10) "key248"127.0.0.1 :6379> 扫描 2444 匹配key24* 计数 10001) "818"2) 1) "key2459" 2) "key2462" 3) "key2409" 4) "key2454" 5) "key2431" 6) "key2423" 7) "key2476 " 8) "key2428" 9) "key2493" 10) "key2420"127.0.0.1:6379> 扫描 818 匹配 key24* 计数 10001) "9190"2) 1) "key2402" 2) "key2415" 3) "key2429" 4) "key2424" 5 ) “key2425” 6) “key2400” 7) “key2472” 8) “key2479” 9) “key2448” 10) “key245” 11) “key2487” 12) “key2430” 13) “key2405”127.0.0.1:6379>扫描 9190 匹配 key24* 计数 10001) "12161"2) 1) "key2488" 2) "key2437" 3) "key2404" 4) "key2440" 5) "key2461" 6) "key2416" 7) "key2436" 8) "key2403 " 9) "key2460" 10) "key2452" 11) "key2449" 12) "key2482"127.0.0.1: 6379> 扫描 12161 匹配 key24* 计数 10001) "11993"2) 1) "key2483" 2) "key2491" 3) "key242" 4)"key2466" 5) "key2446" 6) "key2465" 7) "key243" 8) "key2438" 9) "key2457" 10) "key246" 11) "key2422" 12) "key2418"127.0.0.1:6379> 扫描 扫描 7853 匹配 key24* 计数 10001) "5875"2) 1) "key2486" 2) “key2490” 3) “key244” 4) “key2401” 5) “key2463” 6) “key2481” 7) “key2477” 8) “key2468” 9) “key2433” 10) “key2489” 11) “key2455” 12) “key2426” 13) “key24” 14) “key2450” 15) “key2414” 16) “key2442” 17) “key2473” 18) “key2467” 19) “key2469” 20) “key2456”127.0.0.1:6379 > 扫描 5875 匹配 key24* 计数 10001) "14311"2) 1) "key2453" 2) "key2492" 3) "key2480" 4) "key2427" 5) "key2443" 6) "key2417" 7) "key2432" 8 ) "key240" 9) "key2445" 10) "key2484" 11) "key2444" 12) "key247" 13) "key2485"127.0.0.1:6379> 扫描 14311 匹配 key24 * 计数 10001) "16383"2) 1) “key2441”2)“密钥2474" 3) "key2447" 4) "key2471" 5) "key2470" 6) "key2464" 7) "key2412" 8) "key2419" 9) "key2499" 10) "key2496"127.0.0.1:6379> 扫描 16383 match key24* count 10001) "0"2) (空列表或设置)

可以看到,虽然我们设置的count是1000,但是Redis每次只返回10个左右的值。

p>

SORT

最早可用版本1.0.0

当有N个元素需要排序并返回时有M个元素,SORT命令的时间复杂度为O(N+M*log(M))

该命令用于返回或保存列表、集合和排序集合的键。默认情况下,数字或可排序键会进行排序,Redis 将它们视为双精度浮点数。

如果要按字典顺序对字符串进行排序,可以使用 ALPHA 参数。

如果想按外部字段排序,可以使用BY参数。

TOUCH

最早可用的版本是3.2.1

修改最后一个ac一个或多个key的访问时间,如果key不存在,则忽略。

TTL

最早可用版本1.0.0

返回指定key的剩余生存时间,单位为秒。

在2.6及之前的版本中,如果密钥不存在或者是永久密钥,将返回-1。从2.8版本开始,如果密钥不存在,则返回-2,如果密钥是永久密钥,则返回-1。

TYPE

最早可用版本1.0.0

返回存储在键中的值的类型。这些类型是我们在 Redis 基础数据结构一文中描述的 5 种数据类型。

String

String是最基本也是最常用的类型。它是二进制安全的,也就是说,我们可以将对象序列化为json字符串,并将其作为值存储在Redis中。 Redis在分配内存时,会为字符串分配一些冗余空间,以避免因t的变化而频繁进行内存分配操作。字符串的值。当字符串长度小于1M时,每次扩容都会使现有空间增加一倍。当长度大于1M时,每次扩展都会增加1M。 Redis字符串的最大长度为512M。

Hash

Hash是键值对的集合,相当于Java中的HashMap。实际结构和HashMap一样,都是数组+链表的结构。区别在于扩展方式不同。 HashMap执行重新散列,Redis将创建一个新数组以免阻塞服务。查询时会同时查询两个Hash,然后逐渐将旧的Hash内容转移到新的Hash中。进去吧。一个Hash最多可以存储232-1个键值对。

List

List相当于Java中的LinkedList。其插入和删除操作的时间复杂度为O(1)。查询操作的时间复杂度为O(n)。我们可以使用List的rpush、rpop、lpush 和 lpop 命令用于构建队列或堆栈。列表最多可以存储 232-1 个元素。

Set

Set是一个具有唯一元素的String类型的无序集合,相当于Java中的HashSet。其插入、删除和查询操作的时间复杂度均为O(1)。其最大元素数也是232-1。

zset

Zset可以看作Java中SortedSet和HashMap的组合。一方面,它不允许元素重复;另一方面,它不允许元素重复。 ,按分数对每个元素进行排序。

UNLINK

最早可用的版本是4.0.0

该命令与DEL类似,会删除指定的键。不同的是这个命令的时间复杂度是O(1)。它首先从键空间中删除该键。此时指定的key已经被删除,但是内存还没有释放。因此,这个命令将释放另一个线程中的内存。该步骤的运算时间复杂度为O(N)。

等待

最早可用版本3.0.0

此命令将阻止客户端,直到所有先前的写入已完成并保存指定份数。此命令始终返回副本数或超时。

这是关于如何在Redis命令中使用Keys。希望以上内容能够对大家有所帮助,可以学到更多的知识。如果您觉得文章不错,可以分享出去,让更多的人看到。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何在 Redis 命令中使用 Key

用户评论