Redis键(Keys)

前言

在 Redis 中,键(Keys)是非常重要的概念,它们代表了存储在数据库中的数据的标识符。对键的有效管理和操作是使用 Redis 数据库的关键一环,它直接影响到数据的存取效率、系统的稳定性和开发的便利性。

本文将深入探讨 Redis 中键的管理和操作,包括键的命名规范、常用的键操作命令以及一些最佳实践。我们将详细介绍如何合理命名键、如何使用键的过期和持久化特性、如何批量删除键等技巧,旨在帮助读者更好地理解并灵活运用 Redis 中的键,从而提高数据管理和操作的效率和可靠性。

Redis键是二进制安全的,这意味着你可以使用任何二进制序列作为键,从像"foo" 这样的字符串到一个 JPEG文件的内容。空字符串也是合法的键。

一、键的一些设计规则

  • 不要使用太长的键。例如,不要使用一个1024字节的键,不仅是因为占用内存,而且在数据集中查找key时需要多次耗时的key比较。

  • 不要使用太短的key。例如,user:1001比u1001更具有实际意义,相对于key本身以及value对象来说,增加的空间微乎其微。当然,短的键会消耗少的内存,需要找到平衡点。

  • 规范一种模式 (schema)。用冒号或者下横线来连接多单词字段,例如:"user:1001"或者"user_1001"。

二、Key的常用API

1、KEYS 返回指定pattern的所有key
java 复制代码
语法:keys pattern
MSET user:1001 user1 user:1002 user2 addr:1001 guangzhou addr:1002 zhuhai

这条命令将会把以下键值对设置到 Redis 中:

  1. 键 "user:1001" 对应的值为 "user1"
  2. 键 "user:1002" 对应的值为 "user2"
  3. 键 "addr:1001" 对应的值为 "guangzhou"
  4. 键 "addr:1002" 对应的值为 "zhuhai"

通过这样的方式,你可以一次性地设置多个键值对,这在某些场景下可以提高效率。
"KEYS" 命令用于搜索并返回与给定模式匹配的键名列表。在你的例子中,你使用了以下命令:

  1. "KEYS user*":返回所有以 "user" 开头的键名列表。
  2. "KEYS addr*":返回所有以 "addr" 开头的键名列表。
  3. "KEYS *":返回所有键名的列表。

需要注意的是,"KEYS" 命令在 Redis 中是一个相对较慢的操作,特别是当 Redis 有大量键时。它会遍历整个键空间来匹配模式,并返回匹配的键名列表。因此,在生产环境中使用 "KEYS" 命令要谨慎,以免对 Redis 性能造成影响。

2、EXISTS 判断一个key是否存在。存在返回后1,否则返回0。
java 复制代码
语法:exists key

"EXISTS user:1001" 命令用于检查键名为 "user:1001" 的键是否存在。

执行该命令后,如果键 "user:1001" 存在,命令将返回 1;如果键不存在,命令将返回 0。

这个命令通常用于检查某个键是否存在,以便进行相应的处理或判断条件。

3、RENAME 重命名key
java 复制代码
语法:rename key newkey

"RENAME user:1001 user_1001" 命令的作用是将键名为 "user:1001" 的键重命名为 "user_1001"。

执行该命令后,原来的键名 "user:1001" 将被修改为 "user_1001",但是键的值不会发生变化。这样可以通过修改键名来更好地组织和管理键的集合。

需要注意的是,如果在执行重命名操作时,新的键名已经存在,则新的键名对应的值将被覆盖。所以请确保新的键名不会与其他键名冲突。

4、TYPE 根据key返回value的类型。
java 复制代码
语法:type key

"TYPE user:1002" 命令用于获取键名为 "user:1002" 的键存储的值的数据类型。

该命令返回的结果可能是以下几种数据类型之一:

  • "string":表示存储的值是字符串类型。
  • "list":表示存储的值是列表类型。
  • "set":表示存储的值是集合类型。
  • "zset":表示存储的值是有序集合类型。
  • "hash":表示存储的值是哈希类型。
  • "none":表示键不存在。

执行 "TYPE user:1002" 命令后,返回的结果将是上述数据类型之一,指示键存储值的类型。如果键不存在,则返回 "none"。

5、EXPIRE
java 复制代码
语法:expire key seconds

设置key的生存时间。Redis的数据是缓存在内存中的,然后很多时候数据一般都会设置一个过期时间(即到期后销毁数据,从而释放更多的内存)。过期时间默认以秒为单位,默认值为-1,表示永不过期。

"EXPIRE user:1002 3600" 命令的意思是将键名为 "user:1002" 的键设置为具有过期时间。该键将在 3600 秒(即 1 小时)后自动过期并被删除。

这条命令用于设置键的过期时间,让键在一定时间后自动失效。在上述例子中,执行命令后,键 "user:1002" 将在 1 小时后自动过期。

当键过期时,它将从 Redis 中自动删除,这可以用于在缓存数据或临时数据中设置一个固定的有效期。

也可以在设值的时候指定过期时间(秒)

  1. SET user:1001 user1 EX 1000" 命令的意思是将键名为 "user:1001" 的键设置为值 "user1",并设置其过期时间为 1000 秒。这意味着在 1000 秒后,Redis 将自动删除这个键。

  2. "TTL user:1001" 命令用于获取键名为 "user:1001" 的键的剩余过期时间(Time To Live,以秒为单位)。如果键存在且具有设置的过期时间,命令返回键的剩余过期时间;如果键不存在或者没有设置过期时间,命令返回 -1。如果键已经过期,命令返回 -2。

因此,执行完 "SET user:1001 user1 EX 1000" 后,可以通过 "TTL user:1001" 命令来查询键 "user:1001" 的剩余过期时间,以了解该键距离过期还有多长时间。

这些命令通常用于对某些数据进行临时性存储或缓存,并检查该数据是否已经过期。

6、TTL 查看key剩余的过期时间。
java 复制代码
语法:ttl key

"TTL user:1001" 命令用于获取键名为 "user:1001" 的键的剩余过期时间(Time To Live,以秒为单位)。

如果键存在且具有设置的过期时间,命令返回键的剩余过期时间;如果键不存在或者没有设置过期时间,命令返回 -1。如果键已经过期,命令返回 -2。

这个命令通常用于检查某个键是否还有剩余的过期时间,以及了解数据的实效性。

7、PERSIST 清除key的过期时间。
java 复制代码
语法:persist key

"PERSIST user:1002" 这条命令的意思是将键名为 "user:1002" 的键的过期时间移除,使其永久保存在 Redis 中,不再具有过期时间。

"TTL user:1002" 命令用于获取键名为 "user:1002" 的键的剩余过期时间(Time To Live,以秒为单位),与之前提到的功能相同。

如果键存在且具有设置的过期时间,"TTL user:1002" 命令返回键的剩余过期时间;如果键不存在或者没有设置过期时间,命令返回 -1。如果键已经过期,命令返回 -2。

因此,当你执行 "PERSIST user:1002" 命令后,键 "user:1002" 将不再具有过期时间,成为永久保存的键,除非你手动删除它。

8、PEXPIRE 以毫秒为单位设置key的过期时间。
java 复制代码
语法:pexpire key

设置键名为 "user:1002" 的键在 60 毫秒后过期。换句话说,60 毫秒后 Redis 将自动删除这个键。

也可以在设值的时候指定过期的时间(毫秒)

"SET user:1001 user1 PX 10000" 这条命令的意思是将键名为 "user:1001" 的键设置为值 "user1",并设置其过期时间为 10000 毫秒(即 10 秒)。在 10 秒后,Redis 将自动删除这个键。

"TTL user:1001" 命令用于获取键名为 "user:1001" 的键的剩余过期时间(Time To Live,以秒为单位)。如果键存在且具有设置的过期时间,命令返回键的剩余过期时间;如果键不存在或者没有设置过期时间,命令返回 -1。如果键已经过期,命令返回 -2。

三、使用 redis keys有什么好处

使用 Redis 的 KEYS 命令有以下几个好处:

  1. 模式匹配:KEYS 命令可以根据指定的模式来搜索并返回与之匹配的键名列表。这对于需要按照特定模式进行键名查询或操作的情况非常有用。例如,你可以使用 KEYS user:* 来获取所有以 "user:" 开头的键。

  2. 批量操作:通过获取符合特定模式的键名列表,你可以方便地对这些键进行批量操作。例如,你可以使用 DEL 命令删除匹配的键,或者使用 GET 命令获取匹配的键的值。

  3. 快速检索:当你需要快速检索某个特定模式的键时,KEYS 命令可以提供一个简单的方式。你可以使用通配符来匹配键名,以获取所需的键列表。

需要注意的是,KEYS 命令在处理大量键时可能会对 Redis 服务器的性能产生影响。因此,在生产环境中,如果只需要获取匹配的键名数量或者进行遍历操作,更好的选择是使用 SCAN 命令,它以游标方式逐步迭代键空间,避免对服务器性能造成负担。

总体而言,KEYS 命令在特定的使用场景下是非常方便的,但需要谨慎使用以避免对 Redis 性能产生不利影响。

相关推荐
运维小文26 分钟前
服务器硬件介绍
运维·服务器·计算机网络·缓存·硬件架构
李少兄36 分钟前
解决Spring Boot整合Redis时的连接问题
spring boot·redis·后端
日里安1 小时前
8. 基于 Redis 实现限流
数据库·redis·缓存
EasyCVR1 小时前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
Elastic 中国社区官方博客1 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
明月与玄武2 小时前
关于性能测试:数据库的 SQL 性能优化实战
数据库·sql·性能优化
PGCCC4 小时前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China5 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功7 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
jerry6097 小时前
7天用Go从零实现分布式缓存GeeCache(改进)(未完待续)
分布式·缓存·golang