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
语法: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。
语法:exists key

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

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

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

 

3、RENAME 重命名key
语法:rename key newkey

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

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

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

4、TYPE  根据key返回value的类型。
语法:type key

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

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

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

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

 

5、EXPIRE
语法: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剩余的过期时间。
语法:ttl key

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

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

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

7、PERSIST 清除key的过期时间。
语法: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的过期时间。
语法: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 性能产生不利影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/140297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android开发中自定义圆盘中的加速器的表盘

话不多说先上最终的效果图: 本篇文章主要介绍怎么自定义一个带刻度的圆盘,主要包含绘制内外圆环以及刻度的绘制。具体的实现如下: package com.dz.common.view;import android.animation.ValueAnimator; import android.content.Context; im…

在报错中学python something

这里写目录标题 动手学深度学习pandas完整代码数据处理TypeError: can only concatenate str (not "int") to str(fillna填补缺失值) 创建文件夹学习这个数据分组get_dummies实现one hot encode 动手学深度学习pandas完整代码 import osimpor…

Camtasia2024全新中文版电脑录屏工具

在这个视频的大舞台上,每一帧都是你炫耀的机会,每一秒都是让观众瞪大眼睛的瞬间。现在,让我们一起飞跃时空,用更少的时间创作更多的惊喜吧! 就算你是个小白,毫无经验,别担心,Camtas…

记录C# WinForm项目调用Rust生成的dll库

一、开发环境 1.RustRover (version:2023.3 EAP) 2.Visual Studio 2019 (version:16.11.30) 3.Windows 10 64位 OS 4.WinR:控制台程序,cmd.exe 二、使用RustRover编译Rust脚本为dll 1.下载安装Rust,https://www.…

Vue3封装自定义指令+h()

官方install介绍 directive/myDir/index.js 定义指令 import { h, render, ref } from "vue"; const vMyDir {mounted(el, binding) {renderElement(el, binding);}, }; // inserted是Vue2的生命周期钩子,所以在Vue3项目中要使用mounted const renderEl…

Android Rxjava架构原理与使用的详解解答

简单介绍 Rxjava这个名字,其中java代表java语言,而Rx是什么意思呢?Rx是Reactive Extensions的简写,翻译过来就是,响应式拓展。所以Rxjava的名字的含义就是,对java语言的拓展,让其可以实现对数据…

从头开始的卷积神经网络

VGG-16 卷积神经网络。来源:LearnOpenCV 参考资料:这篇文章可以在 Kaggle Notebook 🧠 Convolutional Neural Network From Scratch上更好地阅读。路易斯费尔南多托雷斯 一、说明 本文详细介绍在tf2.0上,使用ceras实现基本的神经…

「NLP+网安」相关顶级会议期刊 投稿注意事项+会议等级+DDL+提交格式

「NLP网安」相关顶级会议&期刊投稿注意事项 写在最前面一、会议ACL (The Annual Meeting of the Association for Computational Linguistics)IH&MMSec (The ACM Workshop on Information Hiding, Multimedia and Security)CCS (The ACM Conference on Computer and Co…

16 _ 二分查找(下):如何快速定位IP对应的省份地址?

通过IP地址来查找IP归属地的功能,不知道你有没有用过?没用过也没关系,你现在可以打开百度,在搜索框里随便输一个IP地址,就会看到它的归属地。 这个功能并不复杂,它是通过维护一个很大的IP地址库来实现的。地址库中包括IP地址范围和归属地的对应关系。 当我们想要查询202…

Golang源码分析 | 程序引导过程

环境说明 CentOS Linux release 7.2 (Final) go version go1.16.3 linux/amd64 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7使用gdb查看程序入口 编写一个简单的go程序 // main.go package mainfunc main() {print("Hello world") } 编译go …

Python大神用的贼溜的九个技巧,超级实用~

文章目录 一、整理字符串输入二、迭代器(切片)三、跳过可对对象的开头四、只包含关键字参数的函数 (kwargs)五、创建支持「with」语句的对象六、用「slots」节省内存七、限制「CPU」和内存使用量八、控制可以/不可以导入什么九、实现比较运算符的简单方法…

js获取当前日期与7天后的日期

调用 console.log(this.getSectionData(7))结果 函数 getSectionData(section) {const now new Date()const nowYear now.getFullYear()const nowMonth now.getMonth() 1 < 10 ? (0 (now.getMonth() 1)) : (now.getMonth() 1)const nowDay now.getDate() < 1…

Git 分支设计规范

开篇 这篇文章分享 Git 分支设计规范&#xff0c;目的是提供给研发人员做参考。 规范是死的&#xff0c;人是活的&#xff0c;希望自己定的规范&#xff0c;不要被打脸。 在说 Git 分支规范之前&#xff0c;先说下在系统开发过程中常用的环境。 DEV 环境&#xff1a;用于开发…

高可用架构设计

1. 引言 软件系统有三个追求&#xff1a;高性能、高并发、高可用&#xff0c;俗称三高。三者既有区别也有联系&#xff0c;门门道道很多&#xff0c;本篇讨论高可用 高可用技术的重要性在于保证系统的连续可用性&#xff0c;提高系统的稳定性和可靠性。它可以应对高并发和大规…

vue2按需导入Element(vite打包)

1.安装element 说明&#xff1a;-S是生产依赖。 npm install element-ui2 -S 2.安装babel-plugin-component 说明&#xff1a;-D是开发模式使用。 npm install babel-plugin-component -D 3. vite.config.js 说明&#xff1a;借助 babel-plugin-component &#xff0c;我们可…

华为的干部管理和人才管理实践精髓(深度好文,收藏)

&#xff08;本文摘自谢宁专著《华为战略管理法&#xff1a;DSTE实战体系》&#xff0c;欢迎购买&#xff09; 1997年&#xff0c;在《华为基本法》的起草过程中&#xff0c;起草小组的一位人大教授问任正非:“任总&#xff0c;人才是不是华为的核心竞争力?”任正非的回答出人…

在Spring Boot中使用进程内缓存和Cache注解

在Spring Boot中使用内缓存的时候需要预先知道什么是内缓存&#xff0c;使用内缓存的好处。 什么是内缓存 内缓存&#xff08;也称为进程内缓存或本地缓存&#xff09;是指将数据存储在应用程序的内存中&#xff0c;以便在需要时快速访问和检索数据&#xff0c;而无需每次都从…

记录--让我们来深入了解一下前端“三清”是什么

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前端“三清” 在前端开发中&#xff0c;我们经常听到关于“三清”的说法&#xff0c;即 window、document、Object。这三者分别代表了 BOM(浏览器对象模型)、DOM(文档对象模型)以及 JS 的顶层对象。在…

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发006:基于redis查找玩家姓名+游戏业务实现总结

文章目录 1 Redis的安装与API的使用1.1 安装目录及环境变量1.2 设置远程客户端连接和守护进程1.3 启动redis1.4 Hiredis API的使用1.5 我的动态库和头文件 2 Redis的使用2.1 初始化时候2.2 结束的时候 3 测试4 Makefile5 游戏业务总结 1 Redis的安装与API的使用 1.1 安装目录及…

为什么UI自动化难做?—— 关于Selenium UI自动化的思考

在快速迭代的产品、团队中&#xff0c;UI自动化通常是一件看似美好&#xff0c;实际“鸡肋”&#xff08;甚至绝大部分连鸡肋都算不上&#xff09;的工具。原因不外乎以下几点&#xff1a; 1 效果有限 通常只是听说过&#xff0c;就想去搞UI自动化的团队&#xff0c;心里都认…