Redis常用命令合集【一】

1.Redis常用命令

Redis是典型的key-value数据库,key一般是字符串,而value包含很多不同的数据类型:

在这里插入图片描述

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( https://redis.io/commands )可以查看到不同的命令:

在这里插入图片描述

不同类型的命令称为一个group,我们也可以通过help命令来查看各种不同group的命令:
在这里插入图片描述

接下来,我们就学习常见的五种基本数据类型的相关命令。

1.1 Redis通用命令

通用指令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key

    功能:
    查找所有符合pattern(通配符模式)的键。支持*(匹配任意字符)、?(匹配单个字符)、[](匹配指定范围字符)。

    示例:

    # 设置几个键
    SET user:1 "Alice"
    SET user:2 "Bob"
    SET product:100 "Phone"# 查询所有以"user:"开头的键
    KEYS user:*
    # 返回:1) "user:1" 2) "user:2"# 查询格式为"product:数字"的键
    KEYS product:[0-9]*
    # 返回:1) "product:100"
    

    注意事项:

    • 生产环境慎用KEYS会遍历所有键,数据量大时可能导致Redis阻塞,推荐使用SCAN命令(非阻塞迭代)。
    • 通配符需合理设计,避免模糊匹配过多键。
  • DEL:删除一个指定的key

    功能:
    删除一个或多个键,返回成功删除的键的数量。

    示例:

    # 删除单个键
    DEL user:1
    # 返回:1(表示成功删除)# 删除多个键
    DEL user:2 product:100
    # 返回:2(表示成功删除两个键)# 删除不存在的键
    DEL non_existing_key
    # 返回:0
    

    注意事项:

    • 若键不存在,则忽略不计入返回值。
  • EXISTS:判断key是否存在

    功能:
    检查一个或多个键是否存在,返回存在的键的数量(0表示全不存在)。

    示例:

    # 检查单个键
    EXISTS user:1
    # 返回:1(存在)# 检查多个键
    EXISTS user:1 product:100
    # 返回:2(两者均存在)# 检查混合存在的键
    EXISTS user:1 non_existing_key
    # 返回:1(仅user:1存在)
    

    注意事项:

    • 返回值是整数,非布尔值(需根据业务逻辑判断)。
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除

    功能:
    为键设置过期时间(秒),到期后自动删除。返回1表示成功,0表示键不存在或设置失败。

    示例:

    # 设置键并添加10秒有效期
    SET session:abc123 "user_data"
    EXPIRE session:abc123 10
    # 返回:1(成功)# 10秒后再次获取
    GET session:abc123
    # 返回:nil(已过期删除)# 对不存在的键设置过期时间
    EXPIRE non_existing_key 60
    # 返回:0
    

    扩展命令:

    • PEXPIRE key milliseconds:以毫秒为单位设置过期时间。
    • EXPIREAT key timestamp:指定秒级UNIX时间戳过期。
    • PEXPIREAT key timestamp:指定毫秒级UNIX时间戳过期。

    注意事项:

    • 仅对可设置过期时间的键生效(如String、Hash、List等),某些类型(如HyperLogLog)不支持。
  • TTL:查看一个KEY的剩余有效期

    功能:
    返回键的剩余存活时间(秒),返回值含义:

    • -2:键不存在。
    • -1:键存在但未设置过期时间(永久有效)。
    • 正整数:剩余存活秒数。

    示例:

    # 设置键并添加60秒有效期
    SET token:xyz "temp_data"
    EXPIRE token:xyz 60# 立即查看剩余时间
    TTL token:xyz
    # 返回:59(实际剩余秒数)# 查看未设置过期的键
    TTL user:1
    # 返回:-1# 查看不存在的键
    TTL non_existing_key
    # 返回:-2
    

    扩展命令:

    • PTTL key:以毫秒为单位返回剩余时间。

通过help [command] 可以查看一个命令的具体用法,例如:

# 查看keys命令的帮助信息:
127.0.0.1:6379> help keysKEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic

1.2.String类型

String类型,也就是字符串类型,是Redis中最简单的存储类型。

其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.

在这里插入图片描述

1.2.1.String的常见命令

String的常见命令有:

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • SETEX:添加一个String类型的键值对,并且指定有效期

示例:

# 1. SET(设置或修改键值对)
SET name "John"          # 设置键 name 的值为 "John"
SET age 25               # 设置键 age 的值为整数 25
SET name "Jane"          # 修改键 name 的值为 "Jane"# 2. GET(获取值)
GET name                 # 返回 "Jane"
GET age                  # 返回 "25"(字符串形式)
GET non_existing_key     # 返回 (nil)# 3. MSET(批量设置)
MSET key1 "Hello" key2 "World" key3 100  # 批量设置三组键值对# 4. MGET(批量获取)
MGET key1 key2 key3      # 返回 1) "Hello" 2) "World" 3) "100"# 5. INCR(整型自增1)
SET counter 10
INCR counter             # 返回 11(直接操作整型)# 6. INCRBY(整型自增步长)
INCRBY counter 5         # 返回 16(11 + 5)# 7. INCRBYFLOAT(浮点自增步长)
SET price 9.99
INCRBYFLOAT price 1.5    # 返回 "11.49"(字符串形式)# 8. SETNX(不存在时设置)
SETNX new_key "value"    # 返回 1(创建成功)
SETNX new_key "new_value"# 返回 0(键已存在,不执行)# 9. SETEX(设置值并指定有效期)
SETEX session_token 3600 "abc123"  # 设置键 session_token 值为 "abc123",有效期3600秒
TTL session_token        # 返回剩余存活时间(如 3599)
1.2.2.Key结构

Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?

例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?

我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:

Redis的key允许有多个单词形成层级结构,多个单词之间用’:'隔开,格式如下:

	项目名:业务名:类型:id

这个格式并非固定,也可以根据自己的需求来删除或添加词条。这样以来,我们就可以把不同类型的数据区分开了。从而避免了key的冲突问题。

例如我们的项目名称叫 heima,有user和product两种不同类型的数据,我们可以这样定义key:

  • user相关的key:heima:user:1

  • product相关的key:heima:product:1

如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:

KEYVALUE
heima:user:1{“id”:1, “name”: “Jack”, “age”: 21}
heima:product:1{“id”:1, “name”: “小米11”, “price”: 4999}

并且,在Redis的桌面客户端中,还会以相同前缀作为层级结构,让数据看起来层次分明,关系清晰:

在这里插入图片描述

1.3.Hash类型

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

在这里插入图片描述

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

在这里插入图片描述

Hash的常见命令有:

  • HSET key field value:添加或者修改hash类型key的field的值

  • HGET key field:获取一个hash类型key的field的值

  • HMSET:批量添加多个hash类型key的field的值

  • HMGET:批量获取多个hash类型key的field的值

  • HGETALL:获取一个hash类型的key中的所有的field和value

  • HKEYS:获取一个hash类型的key中的所有的field

  • HINCRBY:让一个hash类型key的字段值自增并指定步长

  • HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

示例:

# 1. HSET(添加或修改字段值)
HSET user:1000 name "Alice"          # 设置 user:1000 的 name 字段为 "Alice"(返回 1)
HSET user:1000 age 25                # 设置 age 字段为 25(返回 1)
HSET user:1000 name "Alice Smith"    # 修改 name 字段值(返回 0,表示字段已存在时仅更新)# 2. HGET(获取字段值)
HGET user:1000 name                  # 返回 "Alice Smith"
HGET user:1000 age                   # 返回 "25"(字符串形式)
HGET user:1000 email                 # 返回 (nil)(字段不存在)# 3. HMSET(批量设置字段值 - 已废弃但兼容旧版本)
HMSET product:001 id "P100" price 99.9 stock 50  # 设置 product:001 的多个字段(返回 OK)# 4. HMGET(批量获取字段值)
HMGET user:1000 name age email       # 返回 1) "Alice Smith" 2) "25" 3) (nil)
HMGET product:001 price stock        # 返回 1) "99.9" 2) "50"# 5. HGETALL(获取所有字段和值)
HGETALL user:1000                    # 返回 1) "name" 2) "Alice Smith" 3) "age" 4) "25"# 6. HKEYS(获取所有字段名)
HKEYS product:001                    # 返回 1) "id" 2) "price" 3) "stock"# 7. HINCRBY(整数字段自增步长)
HINCRBY user:1000 age 2              # 返回 27(25 + 2)
HINCRBY product:001 stock -5         # 返回 45(50 - 5)# 8. HSETNX(字段不存在时设置)
HSETNX user:1000 email "alice@example.com"  # 返回 1(成功设置新字段)
HSETNX user:1000 email "new@example.com"    # 返回 0(字段已存在,不执行)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算

【0】基础定义 按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。 按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。 按位取反运算:一个二进制数,0变1,1变0。 按…

docker 学习笔记

一、docker容器快速上手以及简单操作 docker的image和container image镜像 docker image就是一个read.only文件,可以理解成一个模版,docker image具有分层的概念 可以自己制作,也可以从registry拉去 container容器 一个运行中的docker …

【PyTorch】5.张量索引操作

目录 1. 简单行、列索引 2. 列表索引 3. 范围索引 4. 布尔索引 5. 多维索引 个人主页:Icomi 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为…

穿心莲内酯(andrographolide)生物合成CYP72-文献精读106

Two CYP72 enzymes function as Ent-labdane hydroxylases in the biosynthesis of andrographolide in Andrographis paniculata 两种CYP72酶在穿心莲(Andrographis paniculata)中作为Ent-labdane羟化酶,在穿心莲内酯(andrograp…

关于圆周率的新认知 - 2

当未知长度的单位 1 和已完成长度的单位 1 之间的比例不是 1:1 而是其它的数值的时候,不难看出,这时候的圆周率就变成了“椭圆周率”。你可能要说,这不是椭圆积分吗?对了,这就是椭圆积分。但是我们不要考虑什么椭圆积分…

ARM64平台Flutter环境搭建

ARM64平台Flutter环境搭建 Flutter简介问题背景搭建步骤1. 安装ARM64 Android Studio2. 安装Oracle的JDK3. 安装 Dart和 Flutter 开发插件4. 安装 Android SDK5. 安装 Flutter SDK6. 同意 Android 条款7. 运行 Flutter 示例项目8. 修正 aapt2 报错9. 修正 CMake 报错10. 修正 N…

进程池的制作(linux进程间通信,匿名管道... ...)

目录 一、进程间通信的理解 1.为什么进程间要通信 2.如何进行通信 二、匿名管道 1.管道的理解 2.匿名管道的使用 3.管道的五种特性 4.管道的四种通信情况 5.管道缓冲区容量 三、进程池 1.进程池的理解 2.进程池的制作 四、源码 1.ProcessPool.hpp 2.Task.hpp 3…

新年祝词(原创)

新年将至,福进万户。 家家团圆,事事顺心。 喜迎财神,多寿添金。 瑞兽迎春,炮竹声起。 趋吉避凶,蛇年大吉。 中华崛起,人人自强。 天下大同,百姓富足。 有情有义,平易近人。 …

stack 和 queue容器的介绍和使用

1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了,还不了解的uu, 可以移步去看这篇博客哟: 数据结构-栈数据结构-队列 简单回顾一下,重要的概念其实就是后进先出,栈在…

python:洛伦兹变换

洛伦兹变换(Lorentz transformations)是相对论中的一个重要概念,特别是在讨论时空的变换时非常重要。在四维时空的背景下,洛伦兹变换描述了在不同惯性参考系之间如何变换时间和空间坐标。在狭义相对论中,洛伦兹变换通常…

DIY QMK量子键盘

最近放假了,趁这个空余在做一个分支项目,一款机械键盘,量子键盘取自固件名称QMK(Quantum Mechanical Keyboard)。 键盘作为计算机或其他电子设备的重要输入设备之一,通过将按键的物理动作转换为数字信号&am…

【Unity3D】aab包太大无法上传Google问题

目录 一、勾选Split Application Binary,Unity直接打aab包 勾选Split Application Binary选项的影响 不勾选Split Application Binary选项的影响 总结 2、导出Android工程打包aab 一、勾选Split Application Binary,Unity直接打aab包 超出150MB部分…

DeepSeek助力学术文献搜索!

搜集文献 宝子们如果是第一次发表学术论文,论文往往是会署名多个作者。在这种情况下,即便成功发表了论文,独立撰作或主导写作的挑战仍旧存在。那么,怎样才能独立地完成一篇属于自己的学术论文呢?对于初次尝试学术论文…

【时时三省】(C语言基础)文件的随机读写

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例: 这个输出的就是ade seek_cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK_CUR…

Python-基于PyQt5,json和playsound的通用闹钟

前言:刚刚结束2024年秋季学期的学习,接下来我们继续来学习PyQt5。由于之前我们已经学习了PyQt5以及PyUIC,Pyrcc和QtDesigner的安装,配置。所以接下来我们一起深入PyQt5,学习如何利用PyQt5进行实际开发-基于PyQt5,json和…

数据结构课程设计(三)构建决策树

3 决策树 3.1 需求规格说明 【问题描述】 ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的…

2024收尾工作

目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆(优先级队列) 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…

纯css实现div宽度可调整

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>纯css实现div尺寸可调整</title><style…

浅谈Linux的发展

目录 1.Linux背景 1.1 发展史 UNIX发展的历史 1.2开源 1.3官网 1.4.企业应用现状 1.5.发行版本 1.6 os概念&#xff0c;定位 1.Linux背景 1.1 发展史 学习Linux系统编程&#xff0c;你可能要问Linux从哪里来&#xff1f;它是怎么发展的&#xff1f;在这里简要介绍Linux的发展史…

四层网络模型

互联网由终端主机、链路和路由器组成&#xff0c;数据通过逐跳的方式&#xff0c;依次经过每条链路进行传输。 网络层的工作是将数据包从源端到目的端&#xff0c;跨越整个互联网。 网络层的数据包称为数据报。网络将数据报交给链路层&#xff0c;指示它通过第一条链路发送数据…