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-value)型数据库,数据以键值对形式存储在内存中,keyvalue一一对应。key被形象地称为“密钥”,Redis提供了操作key的命令来管理数据。 关键点: 1. key是Redis数据存储的基本单元,所有读写操作都基于key(如GET、SET等命令)。 2. key是二进制安全的字符串,可以包含任何字符(包括空格、非ASCII字符等),但通常建议使用可读字符(字母、数字、下划线、冒号等)以便于管理。 3. key的命名推荐采用模块化方式(命名空间),例如用冒号分隔的不同部分:`user:1001:name`,这样便于分组和监控分析。 4. 所有数据结构(如字符串、哈希、列表等)的key都是字符串,区别在于value的数据结构不同。 因此,我们可以这样总结:Redis中的key是一个用于唯一标识和访问存储在Redis中某个value的字符串。它是Redis组织数据的基础,通过key可以快速定位到对应的value。 另外,引用中还提到了一些关于key的操作和管理: - 可以使用`EXPIRE`命令为key设置过期时间。 - 可以使用`KEYS`命令(生产环境慎用)或`SCAN`命令来查找key。 - 可以使用`DEBUG OBJECT key`等命令来查看key的详细信息。 现在,我们根据用户的问题“Redis中的key是什么”来组织回答。 注意:用户要求理解key的概念,所以回答应该以概念解释为主,辅以示例说明。 结构建议: 1. 定义key:说明key在Redis中的作用。 2. key的特性:二进制安全、命名规则建议。 3. keyvalue的关系:key是访问value的唯一标识。 4. 示例:展示几个key的命名示例。 5. 相关命令:简单列举几个操作key的常用命令(如SET, GET, EXPIRE等)。 同时,根据要求,我们需要在回答末尾生成相关问题。 注意:引用标识的使用,我们在回答中如果引用了参考内容,需要在引用内容的末尾加上引用标识,例如[^1]。</think>### Redis中的Key详解 在Redis中,**Key是数据存储的核心标识符**,它作为访问数据的唯一凭证,具有以下核心特性: #### 🔑 1. Key的本质 - **数据访问的钥匙**:每个Key唯一对应一个存储值(Value),形成键值对结构 - **二进制安全字符串**:Key可以是任意二进制序列(支持空格、非ASCII字符等) - **内存存储基础**:所有数据通过Key-Value形式存储在内存中[^1] #### 📝 2. Key的命名规范(最佳实践) | 类型 | 推荐格式 | 示例 | 优势 | |------|----------|------|------| | 模块化命名 | `模块:实体:属性` | `user:1001:profile` | 逻辑分组清晰 | | 带类型标识 | `类型_实体` | `hash_product:2024` | 快速识别数据结构 | | 带环境前缀 | `环境_模块` | `prod_order_status` | 多环境隔离 | ```bash # 标准命名示例 SET user:1001:name "Lisa" # 用户模块 HSET order:2024:items "product_id" 305 # 订单模块 EXPIRE cache:homepage 300 # 缓存模块 ``` #### ⚙️ 3. Key的核心特性 1. **唯一性** 同一数据库Key必须唯一,重复设置会覆盖旧值: ```bash SET counter 1 SET counter 5 # 覆盖原有值 GET counter # 返回"5" ``` 2. **自动过期** 通过`EXPIRE`/`SETEX`设置生存时间(TTL): ```bash SETEX session:abc123 3600 "user_data" # 1小时后自动删除 TTL session:abc123 # 查看剩余时间(秒) ``` 3. **数据类型无关** 相同命名规则支持不同数据结构: ```bash SET config:timeout "30s" # 字符串类型 SADD admin_users "user1" "user2" # 集合类型 ``` #### 🛠 4. Key操作命令速查 | 命令 | 作用 | 示例 | 返回值 | |------|------|------|--------| | `EXISTS` | 检查Key是否存在 | `EXISTS user:1001` | 1(存在)/0(不存在) | | `TYPE` | 获取Value数据类型 | `TYPE order:2024` | string/hash/list等 | | `SCAN` | 安全遍历Key | `SCAN 0 MATCH user:*` | 分批返回匹配Key | | `DEL` | 删除Key | `DEL temp:cache` | 成功删除数量 | | `RENAME` | 重命名Key | `RENAME old_key new_key` | OK/错误提示 | | `TTL` | 查看剩余生存时间 | `TTL session:id` | -1(永久)/-2(已过期) | #### ⚠️ 5. 使用注意事项 1. **避免阻塞操作** 生产环境禁用`KEYS *`(用`SCAN`替代),防止服务阻塞[^3] 2. **内存控制** 监控大Key(通过`redis-cli --bigkeys`),防止内存溢出: ```bash redis-cli --bigkeys # 扫描各数据类型最大Key ``` 3. **命名冲突防护** - 使用命名空间分隔(如`项目缩写:模块`) - 重要Key添加校验后缀(如`payment:txn:2024_sha256`) 4. **过期策略** Redis采用**惰性删除+定期删除**组合策略: - 访问时检查过期(惰性删除) - 定时随机抽查过期Key(定期删除) > 通过合理的Key设计,如`env:prod:cache:homepage`,可实现: > - 环境隔离(env:prod) > - 功能分类(cache) > - 业务标识(homepage) > - 自动管理(设置TTL)[^2][^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值