不设有的键被忽视,所以在生育蒙受中尽管 red

2020-02-12 02:30 来源:未知
127.0.0.1:6379 KEYS *1) "_kombu.binding.test_queue"2) "a8e620b9-e52e-3498-8a1c-448f35783058"3) "_kombu.binding.celery"

以上这篇redis 用scan指令 代替keys指令(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

DUMP key

可用版本: >=2.6.0
时间复杂度:
查找key的时间复杂度是O(1)
序列化数据时间复杂度是O(NM),其中N是构成值得redis对象的数量,M是平均大小。
对于小的字符串类型,时间复杂度是O(1)+O(1
M),M是字符串长度,M越小,越接近O(1)

序列化的值按照给定的格式,并且返回给用户,可以使用RESTORE命令恢复到Redis系统。
序列化的格式不是标准的,然而有一下几个语义特征:

  • 它包含一个64位校验和,用来检测错误,RESTORE命令在恢复反序列化之前先检查校验和
  • 值得编码方式和RDB是保持一致的
  • RDB的版本会被编码到序列化值当中,所以不同的Redis版本因为RDB格式不兼容的时候,系统会拒绝执行反序列化命令。
    反序列化值不包含任何过期的信息,为了获取值得生命过期时间,应该使用PTTL命令。
    如果key不存在,redis返回一个nil。

返回值
序列化之后的值


实例

  • DUMP一个存在的key
redis dev.baiduwo.com:6379[4]> set name wuhuangdi
OK
redis dev.baiduwo.com:6379[4]> get name
"wuhuangdi"
redis dev.baiduwo.com:6379[4]> dump name
"x00twuhuangdix06x00xdbx11xc5`.n-~"
redis dev.baiduwo.com:6379[4]> get name
"wuhuangdi"
redis dev.baiduwo.com:6379[4]>

这个问题可能看起来很奇怪,但很多 redis 集群会有一个统一的入口,入口会作兼容 redis 命令的代理,一般出于新能考虑是禁止使用 keys 命令来获取键值信息的,但是可以通过 scan 命令来代替 keys

127.0.0.1:6379 scan 0 count 100

RESTORE key ttl serialized-value [REPLACE]

可用版本: >=2.6.0
时间复杂度:
创建一个key是O(1),反序列化值是O(NM),N是构建redis对象的数量,M是它们的平均大小。对于小字符串时间复杂度是O(1)+O(1M),M要比较小的时候,接近O(1)。可是对于sorted set时间复杂度是O(NMlong(N)),因为向sorted set插入一个值的时间复杂度是O(long(N)).

使用DUMP序列化得到的值,经过反序列化,可以创建键值对。
如果创建的时候没有指定有效期,ttl是0,那么只能指定有效期。
RESTORE命令执行后,如果key已经存在,将返回“Target key name is busy”错误,除非你使用REPLACE修改(Redis 3.0版本)
RESTORE会检查RDB的版本和校验和,如果不匹配,会返回错误。


返回值
如果成功返回“OK”,否则返回相应的错误


实例

redis dev.baiduwo.com:6379[4]> lpush name wuhuangdi chs aaa
(integer) 3
redis dev.baiduwo.com:6379[4]> get name
(error) WRONGTYPE Operation against a key holding the wrong kind of value
redis dev.baiduwo.com:6379[4]> dump name
"n  x00x00x00x14x00x00x00x03x00x00x03aaax05x03chsx05twuhuangdixffx06x00x99xccTxaex04xdb_x9e"
redis dev.baiduwo.com:6379[4]> del name
(integer) 1
redis dev.baiduwo.com:6379[4]> restore name1 0 "n  x00x00x00x14x00x00x00x03x00x00x03aaax05x03chsx05twuhuangdixffx06x00x99xccTxaex04xdb_x9e"
(error) BUSYKEY Target key name already exists.
redis dev.baiduwo.com:6379[4]> restore name_1 0 "n  x00x00x00x14x00x00x00x03x00x00x03aaax05x03chsx05twuhuangdixffx06x00x99xccTxaex04xdb_x9e"
OK
redis dev.baiduwo.com:6379[4]>

所以在生产环境中即便 redis 服务支持 keys 命令,也应该用 scan 来代替

1) "81920"2) 1) "CMD:1000004739:4" 2) "CMD:1000010475:2" 3) "CMD:380071400001208:766" 4) "CMD:1000006866:LIST" 5) "CMD:380071400001208:20415" 6) "CMD:380071400001231:21530" 7) "CMD:380071400001208:21780" 8) "CMD:7485630165:LIST" 9) "CMD:1000001545:2" 10) "CMD:380071400001231:4387"

附录:Redis有效期

  • 带有效期的key
    正常情况,redis创建key的时候,这个key是永久存在的,除非人为显示的使用DEL类似的命令删除了。
    EXPIRE相关的命令都能更新key的有效期,需要额外的内存,一旦key被设置了有效期,redis必须能够在设定的时间之后,能够移除key。
    可以使用EXPIRE更新key的有效期,使用PERSIST命令删除key的有效期限制。
  • 有效期精度
    redis 2.4有效期不是很精确,精确度在0-1秒之间,而2.6版本之后,精确度能达到0-1毫秒。
  • 有效期的key持久化
    key的有效期信息是采用绝对的Unix时间戳存储的(2.6版本或者更高是毫秒级别的),这就意味着,即使redis实例不是激活,时间也会在流逝。
    所以要有效期机制工作的非常好,要求系统时间保证稳定,如果你在两台时钟差异很大的电脑上移动,最后有趣的事情发生了(例如所有的key加载的时候都过期了)
    例如,如果你设置一个key有效期是1000秒,然后设置你的电脑时间是未来的2000秒,即使运行的实例总是检查系统的时钟,那么这个key也会理解过期。
  • Redis怎样让key到期
    redis处理key的过期,采取两种方式:被动的和主动的方式。
    当有客户端访问这个key,如果这个key过期了,那么直接主动让这个key失效。
    当然,这种方式对于从来不被访问的key是不够的,不管怎么样,过期的key必须要处理,所以redis会定时随机在有有效期的key中测试是否过期,所有过期的key会被删除。
    redis每秒做10次,具体工作如下:
  1. 从有效期的key中随机抽取20个key。
  2. 删除所有过期的key。
  3. 如果25%的key是过期的,再重复执行第1步骤。
    这采用的是普通的概率算法,基本可以假设这个样本能代表整个key的空间,而且我们会继续淘汰key,直到失效的key低于25%。
    这意味着,在任何给定的时刻,使用内存的最大数量的key的使用达到最大,等于每秒1/4的写入操作的最大量。
  • 在复制和AOF文件中,有效期怎么处理的
    为了不牺牲一致性,保证正确的结果,如果一个key失效了,会在AOF文件里写入一个DEL的操作命令。相关的从实例都能获得。有效期的处理都是集中在主实例处理的,所以不会发生一致性的错误。
    无论如何,从实例不能独立执行key的有效期操作(除非等待主实例的删除命令),他们会坚持把过期的key的完整状态保持在数据中,当从实例选举出主实例的时候,主实例才能独立的执行key的有效期工作。

参考:

ZSCAN 命令用于迭代有序集合中的元素。

OBJECT subcommand [arguments [arguments...]]

可用版本: >1.0.0
时间复杂度: 当前所有的实现的子命令都是O(1).
OBJECT命令允许你查看key的内部对象。去debug或者了解为了节约空间,key使用了特定的编码。当使用redis作为缓存的时候,你可以通过OBJECT命令来决定应用应该怎么配置key的淘汰策略。
OBJECT目前支持多种子命令:

  • OBJECT REFCOUNT <key> 返回指定key关联的值的数量,一般用来debug。
  • OBJECT ENCODING <key> 返回指定key关联的值的内部存储结构。
  • OBJECT IDLETIME <key> 返回key存取你以来的空余时间(没有读取,也没有写入),单位是秒.
    对象可以多种方式编码:
  • 字符串可以被编码为 raw (一般字符串)或 int (用字符串表示64位数字是为了节约空间)。
  • 列表可以编码为 ziplist或linkedlist 。 ziplist 是为节约大小较小的列表空间而作的特殊结构
  • 集合可以被编码为 intset或hashtable 。 intset 是只储存数字的小集合的特殊结构。
  • 哈希表可以编码为 zipmap或hashtable 。 zipmap 是小哈希表的特殊结构。
  • 有序集合可以被编码为 ziplist或skiplist 格式。 ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。
    假如你做了一个什么操作让redis不能为了节省空间而使用编码,那么左右特定的编码会自动转换成一般编码。

返回值
不同的子命令有不同返回值:

  • refcount 和 idletime返回数字。
  • encoding返回相应编码类型。
    如果检查的key不存在,返回null。

实例

redis dev.baiduwo.com:6379[4]> set name wuhuangdi
OK
redis dev.baiduwo.com:6379[4]> object refcount name
(integer) 1
redis dev.baiduwo.com:6379[4]> object idltime name
(error) ERR Syntax error. Try OBJECT (refcount|encoding|idletime)
redis dev.baiduwo.com:6379[4]> object idletime name
(integer) 20
redis dev.baiduwo.com:6379[4]> object encoding name
"embstr"
redis dev.baiduwo.com:6379[4]> lpush namelist 1
(integer) 1
redis dev.baiduwo.com:6379[4]> lpush namelist 2
(integer) 2
redis dev.baiduwo.com:6379[4]> lpush namelist 2
(integer) 3
redis dev.baiduwo.com:6379[4]> obj
(error) ERR unknown command 'obj'
redis dev.baiduwo.com:6379[4]> object refcount namelist
(integer) 1
redis dev.baiduwo.com:6379[4]> object refcount namelist
(integer) 1
redis dev.baiduwo.com:6379[4]> object encoding namelist

下面这个例子当redis不在使用节约空间的编码,编码能自动转换。

redis dev.baiduwo.com:6379[4]> set age 100
OK
redis dev.baiduwo.com:6379[4]> object encoding age
"int"
redis dev.baiduwo.com:6379[4]> append age abc
(integer) 6
redis dev.baiduwo.com:6379[4]> object encoding age

简单说明

HSCAN 命令用于迭代哈希键中的键值对。

PERSIST key

可用版本: >=2.2.0
时间复杂度: O(1)
移除key的有效期,将一个key从临时状态转换成持久化状态。

返回值

  • 移除成功返回 1.
  • 如果key不存在或者操作失败,返回 0.

实例

redis dev.baiduwo.com:6379[4]> set name wuhuangdi
OK
redis dev.baiduwo.com:6379[4]> expire name 100
(integer) 1
redis dev.baiduwo.com:6379[4]> ttl name
(integer) 97
redis dev.baiduwo.com:6379[4]> persist name
(integer) 1
redis dev.baiduwo.com:6379[4]> ttl name
(integer) -1

总结

可以用count 参数指定返回数据量:

TYPE key

可用版本: >=1.0.0
时间复杂度: O(1)
返回存储在redis中key的类型,返回类型有字符串,列表,集合,有序集合和哈希


返回值

  • key存在,返回key的类型
  • key不存在,返回none

实例

redis dev.baiduwo.com:6379[4]> set name wuhuangdi
OK
redis dev.baiduwo.com:6379[4]> lpush name1 wuhuangdi
(integer) 1
redis dev.baiduwo.com:6379[4]> sadd name2 wuhuangdi
(integer) 1
redis dev.baiduwo.com:6379[4]> type name
string
redis dev.baiduwo.com:6379[4]> type name1
list
redis dev.baiduwo.com:6379[4]> type name2
set
redis dev.baiduwo.com:6379[4]>

1. 问题来源

以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS命令、 SMEMBERS 命令带来的问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

PEXPIRE key milliseconds

可用版本: >=2.6.0
时间复杂度: O(1)
这个命令和EXPIRE是差不多的,参数支持的是毫秒,不是秒。


返回值

  • 设置成功返回 1.
  • key不存在或者失败返回 0.

实例

redis dev.baiduwo.com:6379[4]> set name wuhuangdi
OK
redis dev.baiduwo.com:6379[4]> pexpire name 3500
(integer) 1
redis dev.baiduwo.com:6379[4]> ttl name
(integer) 2
redis dev.baiduwo.com:6379[4]> ttl name
(integer) 0
  1. #!topic/redis-db/zZeI_PjHF_M 2.

使用match 参数来匹配模式:

PEXPIREAT key milliseconds-timestamp

可用版本: >=2.6.0
时间复杂度: O(1)
PEXPIREAT命令和EXPIREAT的作用是一样的,不过PEXPIREAT过期的精度能精确到毫秒。


返回值

  • 设置成功返回 1.
  • key不存在或者失败返回 0.

实例
参见EXPIREAT

TAG标签:
版权声明:本文由www.129028.com-澳门金沙唯一官网www129028com发布于编程新闻,转载请注明出处:不设有的键被忽视,所以在生育蒙受中尽管 red