[转帖]Redis命令详解:Keys
https://jackeyzhe.github.io/2018/09/22/Redis%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3%EF%BC%9AKeys/
介绍完Redis连接相关命令后,再来介绍一下与Key相关的命令,Redis作为一个key-value数据库,对Key进行操作是无法避免的。
DEL
最早可用版本1.0.0
删除指定的键值对,如果指定的key不存在,则忽略。DEL命令的时间复杂度是O(N),对于除字符串外的其他数据类型,命令的时间复杂度为O(M),M是值的元素的个数。所以,在生产环境尽量避免一次性删除过多复杂数据类型的操作。
1 |
127.0.0.1:6379> SET key1 "jackey" |
DUMP
最早可用版本2.6.0
使用一种Redis的格式序列化指定键存储的值。可用使用RESTORE命令将这个值反序列化。
这种序列化格式有以下3个特点:
- 它包含有64位的校验和,用于错误检查,RESTORE命令在反序列化之前会先检查校验和
- 值的编码格式和RDB文件的编码格式相同
- RDB的版本会被序列化到值中,因此,不同版本的Redis可能会因为不兼容RDB版本而拒绝反序列化
序列化的值不包含过期时间的相关信息,可以使用PTTL命令获取当前值的存活时间。如果值不存在则会返回nil
1 |
127.0.0.1:6379> SET key1 "jackey" |
DUMP时间复杂度分为两部分:访问key值的时间复杂度为O(1),而序列化值的时间复杂度为O(N*M),N是组成值的元素的数量,M是元素的平均大小。如果序列化比较短的字符串,则该命令的时间复杂度可以看做O(1)。
EXISTS
最早可用版本1.0.0
用于判断key是否存在。3.0.3版本以后支持多参数,即可以一次性判断多个key,返回值是存在的key的数量。对于判断单个key是否存在,会返回1或者0,因此,该命令是向后兼容的。
需要注意的是:如果参数中有重复的存在命令,则返回结果不会去重。
1 |
127.0.0.1:6379> SET key1 "jackey" |
EXPIRE
最早可用版本1.0.0
为指定的key设置存活时间。存活时间会被DEL,SET,GETSET和所有的STORE命令删除或者覆盖。如果我们只修改key的值而不修改存活时间或者保存到一个新的key中,则原来的key的存活时间保持不变。如果使用RENAME对一个key重命名,那么原有key的存活时间会赋给新的key。
如果想要清除存活时间,使指定的key成为一个永久的key,则可以使用PERSIST命令,我们稍后会详细介绍这个命令。
如果使用EXPIRE/PEXPIRE为某个key设置的存活时间为非正数,或者使用EXPIREAT/PEXPIREAT设置了一个过去的时间,则这个key会直接被删除。
1 |
127.0.0.1:6379> EXPIRE key1 -1 |
对一个已经有存活时间的key再次使用EXPIRE设置存活时间,则将key的存活时间更新,在许多应用中我们都会用到这一点。
注意:在Redis的2.1.3版本之前,如果修改一个带有存活时间的key的值,则会删除整个key。
关于时间精度,Redis2.4版本中,一个key过期的一秒内仍可以访问,而到了2.6版本,这一时间已经被精确到了1毫秒。因为从2.6版本开始,存活时间保存的是绝对时间(Unix的时间戳),而这就意味着,你的计算机的时间需要保证可靠,如果你将RDB文件放到另一台机器上加载,当这两台机器的时间差距较大时,你就会发现可能有些key被删除了或者有些key的存活时间被延长了。
下面我们在来讨论一下Redis究竟是如何使key过期的,Redis的过期策略有两种:一种是被动的,一种是主动的。
被动过期就是当客户端访问某个key,服务端会去检查这个key的存活时间,判断是否过期。当然,这种过期策略存在一定的问题,如果某个key一直都不访问,就不会被发现它过期了,那么它将永远“苟活”在内存中。所以Redis会定期随机的查看被设置过存活时间的key,看它们是否过期,如果过期了,就会及时清理掉。Redis每秒会做10次下面的操作:
- 随机查看20个设置过存活时间的key(从设置存活时间的set中取)
- 删除所有过期的key
- 如果过期的key超过25%,那么会从第一步开始再执行一次
EXPIREAT
最早可用版本1.2.0
此命令和EXPIRE的作用相同,不同之处是它的参数需要传Unix时间戳(即从1970年1月1日起的毫秒数)。
1 |
127.0.0.1:6379> GET key2 |
KEYS
最早可用版本1.0.0
这个命令会返回匹配到的所有key,时间复杂度为O(N)。在官方文档中说,在入门级的笔记本电脑上,Redis扫描100万条key只需要40毫秒,但是我们仍然要避免在生产环境使用这个命令。特别是千万不要使用KEYS *这样的命令,因为你不知道生产环境存在多少key,这样的命令有可能使你的生产环境的Redis陷入很长一段时间的不可用状态。所以,请马上删除应用层代码中的KEYS命令或者抓紧时间更新自己的简历。
如果需要查找key,可以使用SCAN命令或者sets命令。
虽然我们非常不建议使用KEYS命令,但是它的匹配策略还是要介绍一下的:
?是单个字符的通配符,*是任意个数的通配符,[ae]会匹配到a或e,^e表示不匹配e,a-c表示匹配a或b或c,特殊符号使用\隔开。
1 |
127.0.0.1:6379> MSET key1hello jackey key2hello zhe age 3 |
MIGRATE
最早可用版本2.6.0
这个命令用来将源实例的key以原子操作传输到目标实例,然后将源实例的key删除。相当于在源实例执行了DUMP+DEL操作,在目标实例执行了RESTORE操作。这一操作会阻塞进行传输的两个实例,在传输过程中,key总会存在于一个实例中,除非发生超时错误。在3.2版本以后,MIGRATE可以将多个key作为管线一次性传输。
在执行MIGRATE命令时,必须要设置一个超时时间,如果到了超时时间命令仍未执行完,则会抛出一个IOERR。但返回这个错误时,两个实例的状态可能有两种:要么两个实例都存在指定的key,要么只有源实例存在指定的key。总之,key是不会丢失的。
从3.0.6版本开始,MIGRATE支持一次传输多个key,为了保证不过载或者出现环形操作,MIGRATE需要使用KEYS参数,而原来指定的key的参数要被设置为空字符串。
1 |
MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3 |
这里还有两个选填参数需要介绍:一个是COPY,加上这个参数的话,传输完成后不会删除源实例中的key。另一个是REPLACE,这个参数的作用是替换目标实例已存在的key。这两个参数在3.0版本以后才可以使用。
MOVE
最早可用版本1.0.0
不知道大家还记不记得前文中我们提到过的SELECT命令,SELECT用来切换数据库。使用MOVE命令就是将当前数据库的key移动到指定的数据库中,如果指定库中已经存在这个key或者当前库不存在这个key,那么这个命令什么也不做。
1 |
127.0.0.1:6379> KEYS * |
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:返回帮助信息
对象的编码格式也有很多种:
- Strings会被编码为raw或int
- Lists会被编码为ziplist或linkedlist
- Sets会被编码为intset或hashtable
- Hashs会被编码为ziplist或hashtable
- Sorted Sets会被编码为ziplist或skiplist
1 |
127.0.0.1:6379> OBJECT REFCOUNT key1hello |
PERSIST
最早可用版本2.2.0
删除指定key的过期时间,使之变成永久的key。
PEXPIRE
最早可用版本2.6.0
PEXPIRE的作用和EXPIRE一样,只不过参数中的时间单位是毫秒。
PEXPIREAT
最早可用版本2.6.0
作用和EXPIREAT相同,参数同样是毫秒。
PTTL
最早可用版本2.6.0
返回指定key的剩余存活时间的毫秒数。2.8以后的版本返回值有些变化,如果key不存在,则返回-2;如果key是永久的,则返回-1。
RANDOMKEY
最早可用版本1.0.0
此命令用于从当前数据库返回一个随机的key。
RENAME
最早可用版本1.0.0
重命名一个key。如果key不存在,则会返回错误。而如果新的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,则key是永久的。在Redis3.0版本以后,如果不使用REPLACE参数并且key已经存在,则会返回一个错误“Target key name is busy”。
SCAN
最早可用版本2.8.0
用法:SCAN cursor MATCH pattern COUNT count
其中cursor为游标,MATCH和COUNT为可选参数。
SCAN命令和SSCAN、HSCAN、ZSCAN命令都用于增量的迭代元素集,它每次返回小部分数据,不会像KEYS那样阻塞Redis。SCAN命令是基于游标的,每次调用后,都会返回一个游标,用于下一次迭代。当游标返回0时,表示迭代结束。
SCAN每次返回的数量并不固定,也有可能返回数据为空。另外,SCAN命令和KEYS命令一样支持匹配。
我们在Redis里存入10000个key用于测试。
结果如下:
1 |
127.0.0.1:6379> scan 0 match key24* count 1000 |
可以看到虽然我们设置的count为1000,但Redis每次返回的数值只有10个左右。
SORT
最早可用版本1.0.0
当有N个元素需要排序,并且要返回M个元素时,SORT命令的时间复杂度为O(N+M*log(M))
此命令用于返回或保存list,set和sorted set的键,默认将数字或者可排序的key进行排序,Redis会将其视为双精度浮点数。
如果想要对字符串按字典顺序排序,可以使用ALPHA参数。
如果想要按照外部字段进行排序,可以使用BY参数。
TOUCH
最早可用版本3.2.1
修改某一个或多个key的最后访问时间,如果key不存在,则忽略。
TTL
最早可用版本1.0.0
返回指定key的剩余存活时间,单位为秒。
在2.6版本及以前,如果key不存在或者是永久key,都会返回-1。从2.8版本开始,如果key不存在,则返回-2,如果key为永久key,则返回-1。
TYPE
最早可用版本1.0.0
返回key存储的值的类型。类型即为我们在Redis基础数据结构一文中描述的5中数据类型。
UNLINK
最早可用版本4.0.0
这个命令和DEL类似,会删除指定的key。所不同的是,此命令的时间复杂度为O(1),它先将key从keyspace中删除,此时指定的key已经删除,但是内存没有释放。所以,这个命令会在另一个线程中做释放内存的操作。这一步的操作时间复杂度为O(N)。
WAIT
最早可用版本3.0.0
这个命令会阻塞客户端,直到前面所有的写操作都完成并且保存了指定数量的副本。该命令总会返回副本数量或者超时。
[转帖]Redis命令详解:Keys的更多相关文章
- [转帖]xargs命令详解,xargs与管道的区别
xargs命令详解,xargs与管道的区别 https://www.cnblogs.com/wangqiguo/p/6464234.html 之前一直说要学习一下 xargs 到现在为止也没学习.. ...
- [转帖]dd命令详解
dd命令详解 https://czmmiao.iteye.com/blog/1748748 之前一直对linux的命令很恐惧 现在发现 其实不是那么复杂 要仔细学习就可以了 比如 dd = disk ...
- [转帖]pidstat 命令详解
pidstat 命令详解 https://www.jianshu.com/p/3991c0dba094 pidstat -r -u -d -p 各种参数非常好用. pidstat 概述 pidstat ...
- [转帖]ps 命令详解
ps 命令详解 https://www.jianshu.com/p/cba22cce2f97 ps 概述 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那 ...
- [转帖]iostat 命令详解
iostat 命令详解 https://www.jianshu.com/p/5fed8be1b6e8 概述 iostat 主要用于输出磁盘IO 和 CPU的统计信息. iostat属于sysstat软 ...
- redis命令详解
redis中添加key value元素:set key value; 获取元素:get key ; redis中添加集合:lpush key value1 value2 value ...
- NoSQL之Redis高级实用命令详解--安全和主从复制
Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...
- Python操作redis系列以 哈希(Hash)命令详解(四)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1. Hset 命令用于 ...
- [转帖]Linux的wget命令详解
Linux的wget命令详解 来源不明 找到的也是转帖的 https://www.cnblogs.com/cindy-cindy/p/6847502.html Linux wget是一个下载文件的工具 ...
- 【转帖】Linux定时任务Crontab命令详解
Linux定时任务Crontab命令详解 https://www.cnblogs.com/intval/p/5763929.html 知道有crontab 以及 at 命令 改天仔细学习一下 讲sys ...
随机推荐
- 看图学NumPy:掌握n维数组基础知识点,看这一篇就够了
摘要:NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具.国外有位程序员讲NumPy的基本运算以图解的方式写下来,让学习过程变得轻松有趣. NumPy是Python的最重 ...
- 开抢| 华为开发者大会2021(Cloud)早鸟票来了!
他们,是技术的引领者 他们,是科学的追随者 他们用代码守护蓝色星球的生态 破解宇宙深处的密码 化解城市生活的不畅 捉摸自然气候的脾性 ...... 这些改变世界的成果背后 每一个开发者都了不起 --那 ...
- 带你认识MindSpore量子机器学习库MindQuantum
摘要:MindSpore在3.28日正式开源了量子机器学习库MindQuantum,本文介绍MindQuantum的关键技术. 本文分享自华为云社区<MindSpore量子机器学习库MindQu ...
- IDEA画图神器 PlantUML
PlantUML 是一款开源的UML图绘制工具,支持通过文本来生成图形,使用起来非常高效.可以支持时序图.类图.对象图.活动图.思维导图等图形的绘制. 下面使用PlantUML来绘制一张流程图,可以实 ...
- Android RxJava 异常时堆栈信息显示不全(不准确),解决方案都在这里了
现象 大家好,我是徐公,今天为大家带来的是 RxJava 的一个血案,一行代码 return null 引发的. 前阵子,组内的同事反馈说 RxJava 在 debug 包 crash 了,捕获到的异 ...
- 悲报, GIF 之父因新冠去世
今天下午二狗子照常上班摸鱼的时候,突然看到了一则消息,消息说 GIF 的发明人因新冠去世了.作为一个自诩理性的互联网人,二狗子第一反应是看到了一个离谱谣言,可是查看了多方消息后,二狗子难过地发现这是真 ...
- 0.o?让我看看怎么个事儿之SpringBoot自动配置
学习 SpringBoot 自动配置之前我们需要一些前置知识点: Java注解,看完就会用 学会@ConfigurationProperties月薪过三千 不是银趴~是@Import! @Condit ...
- [Docker] Mac M2 – no such file or directory: /var/lib/docker/volumes ,找不到var/lib/docker/volumes (已解決)
Mac M2 Pro Docker 24.0.6 $ docker volume inspect 14dfdb65fb7075d91b2004c979a3591df54bcc1303ff3ca96a3 ...
- 0x42 数据结构进阶-树状数组
A题 楼兰图腾 链接:https://ac.nowcoder.com/acm/contest/1032/A 树状数组 + 逆序对 #include<bits/stdc++.h> using ...
- Spark SQL 字段血缘在 vivo 互联网的实践
作者:vivo互联网服务器团队-Hao Guangshi 一.背景 字段血缘是在表处理的过程中将字段的处理过程保留下来.为什么会需要字段血缘呢? 有了字段间的血缘关系,便可以知道数据的来源去处,以及字 ...