keys、scan、bigkeys、key的存储方式

keys、scan、bigkeys、key的存储方式

keys

keys 正则表达式 来找到所有符合要求的key,但是这个指令有几个缺点,首先就是没有限制参数,可能查出超多的数据,还有就是它是遍历算法,复杂度是ON,因为redis是单线程,如果数据多的话会导致redis卡顿。

所以代替keys 指令的就是新的指令:scan

scan

它有一些特点:

1、复杂度也是ON。但是他是游标分步进行的,不会阻塞线程。

2、提供limit参数,可以模糊的控制返回的最大条数

3、游标的唯一状态就是命令的返回值

4、遍历的结果可能用重复

5、遍历过程中的数据修改可能不会被遍历到

使用:

scan 0 match 正则表达式 count 1000

此时会返回一个数:游标的状态和一个集合

然后把游标的状态取出放到第二个位置的参数再次执行,直至返回状态为0,返回空集合不代表遍历结束。

scan指令的第一个参数代表一维数组的位置索引,最后一个参数代表此次访问的槽数

(redis内部全部数据都存在一个巨大的字典中,数组加链表)

scan不是从第1个位置遍历到最后一个位置,而是用高位进位加法来选择遍历顺序,这是因为这样的顺序可以在字典的扩容缩容时避免重复和遗漏。

字典在扩容时会扩容到现在大小的两倍,如果8位扩容到16位,对于原来在槽位3的会分大约一半到槽位11,这个顺序正是遍历顺序,可以保证即使扩容了也不会重复遍历,如果缩容的话会进行一些重复遍历,因为原来多个位置的数据现在合并到了一起。

这个扩容缩容会有rehash,java是非渐进式的,redis用的是渐进式的rehash,同时保留新旧数组,在后续的定时任务中慢慢转移,scan命令同时在新旧数组中查找。

大key的查找

如果单个key过大,给集群数据的迁移造成了很大的困难,扩容缩容时也是。大key是redis卡顿最常见的原因,有一个指令可以找到大key:

redis-cll –h 127.0.0.1 –p 701 –bigkeys

还可以加休眠参数,避免占用资源过多。

查看key的存储方式

用debug object key可以观察对应key的属性,其中encoding是它的存储方式,存储编码方式不同,不同类型的数据结构采用的存储位数不同。

转载于:https://www.cnblogs.com/shizhuoping/p/11522419.html

<think>好的,我现在需要回答用户关于Redis查看key命令的问题。首先,我得回忆一下Redis中常用的key相关的命令。用户可能指的是如何查看存在的key,或者是查看key的数据类型、剩余过期时间等信息。我需要分清楚不同的命令用途,避免混淆。 首先,KEYS命令应该是一个基础,它用来匹配符合模式的key。但记得这个命令在生产环境要谨慎使用,因为当数据量大时会影响性能。SCAN命令作为替代方案,可以分批次遍历,减少阻塞,这点需要提到。 然后是TYPE命令,用来查看key的数据类型,比如string、hash、list等,用户可能需要知道某个key的类型才能进一步操作。 接下来,TTL和PTTL这两个命令分别返回剩余过期时间的秒数和毫秒数,对于设置了过期时间的key来说很重要。如果没有设置过期时间,应该返回-1,而如果key不存在则返回-2,这些细节需要说明清楚。 还有EXISTS命令,用于检查一个或多个key是否存在,返回存在的数量。DEL则是删除key,虽然用户没问删除,但可能相关的命令可以稍微提一下,不过还是以查看为主。 另外,像DUMP和RESTORE这样的命令可能属于更高级的操作,用于序列化和反序列化key,用户如果只是查看可能不需要,但可以简要提及。 需要确保每个命令的语法和示例都正确,比如KEYS pattern,TYPE key等。还要注意可能出现的错误情况,比如使用KEYS命令导致性能问题,这时候应该建议使用SCAN。 可能需要提醒用户权限问题,比如某些命令是否需要特殊权限。此外,数据持久化和备份相关的命令可能不在本次讨论范围内,但如果有相关的查看命令也需要考虑。 最后,组织这些信息时,应该先介绍最常用的命令,如KEYS、TYPE、TTL、EXISTS,然后再介绍其他相关命令,如SCAN、PTTL、DEL、DUMP等。每个命令给出简要说明、语法示例和注意事项,帮助用户理解不同场景下的使用。 检查是否有遗漏的命令,比如OBJECT命令可以查看key的内部信息,但可能不太常用。或者STRLEN等针对特定数据类型的命令,但用户的问题是关于查看key本身,而不是key的值,所以可能不需要涉及。 确认每个命令的语法正确,比如TTL的正确用法是TTL key,示例部分需要正确展示。同时,注意区分大小写,Redis命令通常是大写的,但参数如key名是大小写敏感的。 总结一下,回答的结构应该分为常用命令和其他相关命令,每个部分列举命令名称、语法、示例和注意事项,确保用户能够清晰理解如何查看Redis中的key信息,并正确使用这些命令。</think>Redis查看Key的相关命令主要有以下几种,按使用频率和场景分类说明: 一、常用核心命令 1. KEYS(模糊匹配) - 命令格式:`KEYS pattern` - 示例:`KEYS user:*`(匹配所有user开头的key) - 注意:生产环境慎用,数据量大时会阻塞服务,推荐使用SCAN代替 2. TYPE(查看数据类型) - 命令格式:`TYPE key` - 示例:`TYPE session:123` → 返回 string/hash/list等类型 3. TTL(剩余过期时间) - 命令格式:`TTL key` - 返回值: - 正整数:剩余生存时间(秒) - -1:永久有效 - -2:key不存在 4. EXISTS(存在性检查) - 命令格式:`EXISTS key [key ...]` - 示例:`EXISTS cart:456` → 返回1存在,0不存在 二、进阶命令 1. SCAN(安全遍历) - 命令格式:`SCAN cursor [MATCH pattern] [COUNT number]` - 示例:`SCAN 0 MATCH product:* COUNT 100` - 特点:分批次遍历,避免阻塞 2. PTTL(毫秒级TTL) - 命令格式:`PTTL key` - 示例:`PTTL temp:token` → 返回毫秒级剩余时间 3. OBJECT(内部信息) - 命令格式:`OBJECT subcommand key` - 常用子命令: - `OBJECT REFCOUNT key` 查看引用计数 - `OBJECT ENCODING key` 查看存储编码 - `OBJECT IDLETIME key` 查看空闲时间 三、数据操作相关 1. DUMP(序列化) - 命令格式:`DUMP key` - 输出:RDB格式的序列化值 2. MEMORY USAGE(内存占用) - 命令格式:`MEMORY USAGE key` - 示例:`MEMORY USAGE bigdata:key` → 返回字节数 四、使用建议 1. 生产环境优先使用SCAN代替KEYS 2. 批量操作时使用Pipline提升效率 3. 监控工具推荐:redis-cli + --bigkeys参数分析大Key 4. 危险操作前建议先执行`EXISTS`检查 示例组合用法: ```bash # 检查用户会话状态 127.0.0.1:6379> EXISTS user:1001:session (integer) 1 127.0.0.1:6379> TTL user:1001:session (integer) 1800 127.0.0.1:6379> TYPE user:1001:session string ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值