当前位置: 首页 > news >正文

【精通Redis】Redis命令详解

引言

Redis是一个内存数据库,在学习它的内部原理与实现之前,我们首先要做到的就是学会使用,学会其丰富的命令操作。

一、字符串

Redis的字符串类型之前笔者的一篇入门介绍中曾经说过,不是简单的只存人可以阅读的字符串,实际可以是任意二进制的字节序列。在Redis中,字符串可以存储以下3中类型值:

  1. 字节串(byte string)
  2. 整数
  3. 浮点数

虽然我们以字符的形式把数值类型的整数或浮点数存到redis中,但我们仍然可以对这些以字符形式存储的整数或浮点数进行自增(increment)或自减(decrement)操作,必要时Redis还会把整数转换为浮点数。
整数的取值范围和系统的长整数取值范围相同,32位系统就是32位有符号整数,64位系统就是64位有符号整数。

Redis中的自增和自减命令

命令描述
incrincr key-name ——把键存储的值加1
decrdecr key-name ——把键存储的值减1
incrbyincrby key-name amount 把键存储的值加上整数amount
decrbydecrby key-name amount 把键存储的值减去整数amount
incrbyfloatincrbyfloatkey-name amount 把键存储的值加上浮点数amount

测试代码如下,笔者使用的是Jedis库:

public class RedisTest {public static void main(String[] args) {try (JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "localhost", 6379)){Jedis jedis = jedisPool.getResource();jedis.incr("key-name");System.out.println("把键存储的值加1: "+jedis.get("key-name"));jedis.decr("key-name");System.out.println("把键存储的值减1: "+jedis.get("key-name"));jedis.incrBy("key-name", 10);System.out.println("把键存储的值加10: "+jedis.get("key-name"));jedis.decrBy("key-name", 5);System.out.println("把键存储的值减5: "+jedis.get("key-name"));jedis.incrByFloat("key-name", 0.1);System.out.println("把键存储的值加0.1: "+jedis.get("key-name"));}}
}

在这里插入图片描述

注意点如果Redis对于一个已经存在的键值进行incr、decr、incrBy、decrBy操作,则要求该键对应的值必须是整数,否则报错
比如上面的代码,再执行一次,对5.1进行自增操作,报错如下:

在这里插入图片描述
对于代码:

  jedis.incrByFloat("key-name", 0.1);System.out.println("把键存储的值加0.1: "+jedis.get("key-name"));

5.1加上0.1会遇到精度问题,并不是5.2 而是5.199999999999,所以对于非整数类型的数值,解决方法是先从redis获取值,再使用java的BigDecimal对其进行处理,再写入redis,代码大致如下:
在这里插入图片描述

Redis强大到提供了字符串子串和二进制位的操作命令。这是一般的键值对数据库所没有的,命令如下:

命令用例和描述
APPEND如果 key 已经存在并且是一个字符串, APPEND 命令将给定的 value 追加到 key 原来的值的末尾
GETRANGE如果 key 已经存在并且是一个字符串, APPEND 命令将给定的 value 追加到 key 原来的值的末尾
SETRANGE重写 key 中字符串值的一部分,从 offset 开始用新的字符串替换
GETBIT返回 key 中指定偏移量 offset 上的位(bit)。偏移量 0 是第一位
SETBIT设置或清除 key 中指定偏移量 offset 上的位(bit),并返回修改前的 bit 值
BITCOUNT对一个 bit 字符串进行计数,在指定范围内计算为 1 的 bit 的数量
BITOP对两个或更多的 bit 字符串进行位操作(AND, OR, XOR, NOT)并将结果保存到 destination key

这些命令笔者这里就不详细演示了,不怎么常用,感兴趣可以自行尝试:

在这里插入图片描述

二、列表

列表是Redis早期就实现的数据结构,从开始的普通双向链表到后来的快速列表实现,Redis在内存和性能的平衡上花了不少功夫。下面是一些常用的列表命令

命令描述
RPUSHRPUSH key-name value [value …]——将一个或多个值推入列表的右端
LPUSHLPUSH key-name value [value …]——将一个或多个值推入列表左端
RPOPRPOP key-name——移除并返回列表最右端的元素
LPOPLPOP key-name——移除并返回列表最左端的元素
LINDEXLINDEX key-name offset——返回列表中偏移量位offset的元素
LRANGELRANGE key-name start end——返回列表从start偏移量到end偏移量范围
LTRIMLTRIM key-name start end ——对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,其中包含stdart和end处的元素

笔者也是使用Jedis简单操作了下,也可以使用工具连redis server,使用redis相关命令操作。
在这里插入图片描述
没问题的哈
在这里插入图片描述

阻塞式的列表弹出命令以及在列表间移动元素的命令

命令用例描述
BLPOPBLPOP key-name [key-name …] timeout ——从第一个非空列表中弹出位于最左端的元素,或者在timeout秒内阻塞等待可弹出的元素出现
BRPOPBRPOP key-name [key-name …] timeout ——从第一个非空列表中弹出位于最右端的元素,或者在timeout秒内阻塞等待可弹出的元素出现
RPOPLPUSHRPOPLPUSH source-key dest-key——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素
BRPOPLPUSHBRPOPLPUSH source-key dest-key timeout——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key为空,则阻塞等待timeout秒

这些命令,现在看起来好像有用但不知道哪里适合用,不用管,后续介绍队列时会经常用到这些命令。

三、散列

散列相当于HashMap,可以让用户把多个键值对存储到一个Redis键里。Redis的散列值提供了一些与字符串值相同的特性,使得散列非常适合把一些相关的数据存储在一起。可以把这个数据聚集看成是关系数据库里的行,或者文档数据库的文档。

常用的散列命令如下:

命令描述
HMGETHMGET key-name key [key …]——从散列中获取一个或多个键的值
HMSETHMSET key-name key value [key value …]——为散列里面的一个或多个键设置值
HDELHDEL key-name key [key …]——删除散列里面的一个或多个键值对,返回成功找到并删除的键值对数量
HLENHLEN key-name——返回散列包含的键值对数量

Redis散列的高级命令如下:

命令描述
HEXISTSHEXISTS key-name key——检查给定键是否存在于散列中
HKEYSHKEYS key-name——获取散列包含的所有键
HVALSHVALS key-name——获取散列包含的所有值
HGETALLHGETALL key-name——获取散列包含的所有键值对
HINCRBYHINCRBY key-name key increment——将key存储的值加上整数increment
HINCRBYFLOATHINCRBYFLOAT key-name key increment——将key存储的值加上浮点数increment

对于以上的命令我们需要注意的是HKEYS 和HVALS 的用处,尽管HGETALL可以获取所有键值信息,但是当散列包含的值非常大时,HKEYS就派上了用场,可以先使用HKEYS获取所有键,再使用HMGET一个个去除键的值,避免一次获取多个大体积的值造成服务器阻塞。

四、集合

集合和列表优点类似,但是集合只能保存各不相同的元素。集合以无序的方式存储多个各不相同的元素。

下面是一些常用的集合命令

命令描述
SADDSADD key-name item [item…]——把一个或多个元素添加到集合里,并返回被添加元素中原本不存在于集合中的元素数量
SREMSREM key-name item [item…]——从集合里面移除一个或多个元素,并返回被移除元素的数量
SMEMBERSSMEMBERS key-name——返回集合包含的所有元素
SISMEMBERSISMEMBER key-name item——检查元素item是否存在于集合key-name里
SCARDSCARD key-name——返回集合包含的所有元素
SRANDMEMBERSRANDMEMBER key-name [count]——从集合中返回一个或多个元素。当count为正数时,命令返回的随机元素可能会重复
SPOPSPOP key-name——随机地移除集合中的一个元素,并返回被移除的元素
SMOVESMOVE source-key dest-key item——如果集合source-key包含item,那么从source-key中移除item,并将元素item移动到dest-key中,如果item移除成功,那么命令返回1,否则返回0

同样的,这些命令笔者也不再演示,感兴趣的可以使用Jedis尝试下,或者直接使用redis原生命令操作。

用于组合和处理多个集合的Redis命令

命令描述
SDIFFSDIFF key-name [key-name…]——返回哪些存在于第一个集合、但不存在于其他集合中的元素(数学上的差集运算)
SDIFFSTORESDIFFSTORE dest-key key-name [key-name…]——把那些存在于第一个集合但并不存在于其他集合中的元素(数学上的差集运算)存储到dest-key键里面
SINTERSINTER key-name [key-name…]——返回那些同时存在所有集合中的元素,相当于数学的交集
SINTERSTORESINTERSTORE dest-key key-name [key-name…]——把那些同时存在所有集合中的元素存储到dest-key键中
SUNIONSUNION key-name [key-name…]——返回那些至少存在于一个集合中的元素(数学里的并集)
SUNIONSTORESUNIONSTORE dest-key key-name [key-name…]——把并集元素存储到dest-key键中

五、有序集合

虽然叫有序集合,但是数据结构和集合反而不同,却是和散列类似,它存储着成员与分值之间的映射,提供了许多针对这个分值的处理命令,比如排序。这个score分值的作用就是排序。

常用的有序集合的命令如下

命令描述
ZADDZADD key-name score member [score member…]——把带有给定分值的成员添加到有序集合中去
ZREMZREM key-name member [member…]——从有序集合中移除给定成员,返回移除成功的成员数量
ZCARDZCARD key-name——返回有序集合包含的成员数量
ZINCRBYZINCRBY key-name increment member——把member成员的分值加上increment
ZCOUNTZCOUNT key-name min max——返回分值介于min和max之间的成员数量
ZRANKZRANK key-name member——返回成员member在有序集合中的排名,注意排名是从0开始的
ZSCOREZSCORE key-name member——返回成员member的分值
ZRANGEZRANGE key-name start stop [WITHSCORES]——返回有序集合中排名介于start和stop之间的成员,如果给定了可选的WITHSCORES选项,那么命令会将成员的分值也一并返回

自行在Redis中测试如下命令

ZADD zset-key 3 a 2 b  1 cZCARD zset-keyZINCRBY zset-key 3 cZSCORE zset-key cZRANK zset-key cZRANGE zset-key 0 -1 withscores

高阶有序集合命令:

命令描述
ZREVERANKZREVERANK key-name member——返回有序集合里成员member的排名,成员按照分数从大到小排列
ZREVERANGEZREVERANGE key-name start stop [withscores]——返回有序集合给定排名范围内的成员,成员按照分值从大到小排序
ZRANGEBYSCOREZRANGEBYSCORE key min max [withscores] [limit offset count]——返回有序集合中,分值介于min和max之间的所有成员
ZREVERANGEBYSCOREZREVERANGEBYSCOREkey min max [withscores] [limit offset count]——获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回它们
ZREMRANGEBYRANKZREMRANGEBYRANK key-name start stop——移除有序集合中排名介于start和stop之间的所有成员
ZREMRANGEBYSCOREZREMRANGEBYSCORE key-name min max——移除有序集合中分值介于min和max之间的所有成员
ZINTERSTOREZINTERSTORE dest-key key-count key [key…] [weights weight [weight…]] [AGGREGATE SUM|MIN|MAX]——对给定集合执行类似于集合的交集运算
ZUNIONSCOREZUNIONSCORE dest-key key-count key [key…] [weights weight [weight…]] [AGGREGATE SUM|MIN|MAX]——对给定的有序集合执行类似于集合的交集运算

交集运算使用的是默认的聚集函数sum,输出的有序集合为交集成员的各自的分值累加。

并集运算是取每个并集成员最小分值的成员输出到有序集合中。

相关文章:

【精通Redis】Redis命令详解

引言 Redis是一个内存数据库,在学习它的内部原理与实现之前,我们首先要做到的就是学会使用,学会其丰富的命令操作。 一、字符串 Redis的字符串类型之前笔者的一篇入门介绍中曾经说过,不是简单的只存人可以阅读的字符串&#xf…...

项目经理的开源工具指南:优化您的选择过程

国内外主流的10款开源项目管理系统对比:PingCode、Worktile、禅道、Teambition、Gogs、码云 Gitee、Jira、Redmine、ProjectLibre、OpenProject。 在选择合适的开源项目管理系统时,很多团队面临诸多挑战:功能是否全面?易用性如何&…...

如何防御IP劫持

摘要 IP劫持是一种网络攻击方式,攻击者通过各种手段获取对某个IP地址的控制权,并将其用于恶意目的。这种攻击可能会导致数据泄露、服务中断等严重后果。本文将介绍IP劫持的基本概念、攻击方式以及防御策略,并提供一些实际的代码示例。 IP劫…...

C++绝对值

在C中&#xff0c;你可以使用标准库中的abs函数来获取一个整数的绝对值。对于浮点数&#xff0c;也有一个类似的函数叫做fabs。下面是如何使用这些函数的示例&#xff1a; 对于整数 对于整数&#xff0c;你可以使用std::abs函数&#xff0c;它存在于<cstdlib>头文件中。…...

C# dataGridView 去掉左边多出来空列

1.问题 在使用winform做界面程序时&#xff0c;dataGridView控件创建好后&#xff0c;左侧会多出一列为空&#xff0c;如何删除呢 2.解决方法 你可以在属性窗口中进行设置 如图&#xff1a; 将RowHeadersVisible 属性设置为False 或者代码设置 this.dataGridView1.RowHea…...

esp32

买了单片机模块&#xff0c;学8266...

IDEA 本地有jar包依赖文件,但是所有引用的jar包全部爆红

前端时间 看源码&#xff0c;下载源码额按钮不见了&#xff0c;折腾了很久&#xff0c;遂打算重新安装idea&#xff0c;但是重新安装后&#xff0c;发现代码全都爆红&#xff0c;按照晚上说的删除idea 文件夹&#xff0c;idea缓存删除&#xff0c;都不好使&#xff0c;但是看到…...

如何在调整节拍时间的过程中保持生产流程的稳定性?

在快节奏的工业生产领域&#xff0c;节拍时间&#xff08;Takt Time&#xff09;——即完成一个完整产品所需的标准时间&#xff0c;是维持生产效率和流程稳定性的关键指标。然而&#xff0c;市场需求的波动、技术升级或是生产线的微调&#xff0c;都可能要求我们对节拍时间进行…...

3. Docker的数据管理与持久化

在Docker容器化应用中&#xff0c;数据的持久化和管理是一个关键问题。容器的生命周期短暂&#xff0c;容器的停止和删除会导致数据丢失。因此&#xff0c;了解Docker的数据卷&#xff08;Volumes&#xff09;和挂载&#xff08;Mounts&#xff09;的管理方式&#xff0c;对保障…...

Logback原理及应用详解(九)

本系列文章简介&#xff1a; 在软件开发的过程中&#xff0c;日志记录是一项至关重要的功能。它不仅帮助开发者在开发阶段追踪代码的执行流程和调试问题&#xff0c;还在生产环境中扮演着监控应用运行状态、记录关键业务信息和排查故障的重要角色。随着软件系统的日益复杂和分布…...

SpringBoot 禁用RabbitMQ自启动

1.背景 在实际开发中,项目中使用了mq,但是在测试的时候用不到mq,或者测试环境的mq挂了, 希望能正常启动项目 2.步骤 这很简单在配置文件中增加一个配置就可以了 spring:autoconfigure:exclude: org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration 表示启…...

unity 实现图片的放大与缩小(根据鼠标位置拉伸放缩)

1创建UnityHelper.cs using UnityEngine.Events; using UnityEngine.EventSystems;public class UnityHelper {/// <summary>/// 简化向EventTrigger组件添加事件的操作。/// </summary>/// <param name"_eventTrigger">要添加事件监听的UI元素上…...

Scrapy 爬取旅游景点相关数据(五)

本期内容&#xff1a;&#xff08;1&#xff09;爬取日本其他城市数据存入数据库&#xff08;2&#xff09;爬取景点评论数据 1 爬取其他城市景点数据 只爬取一个城市的数据对于做数据可视化系统可能是不够的&#xff0c;因为数据样本量少嘛&#xff0c;本期来爬取其他城市的景…...

程序员纯粹八股文的危害有哪些,应该如何来解决?

“八股文”这个词在程序员面试的上下文中通常指的是那些被广泛讨论、反复练习的问题和答案&#xff0c;它们往往围绕着一些经典的技术知识点&#xff0c;例如算法、数据结构、设计模式等。这些知识在面试中被频繁提及&#xff0c;以至于应聘者经常会提前准备并背诵这些答案&…...

LabVIEW操作系列1

系列文章目录 我的记录&#xff1a; LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…...

【前端 09】JavaScript中的对象与JSON

JavaScript中的对象与JSON 在JavaScript中&#xff0c;对象和JSON&#xff08;JavaScript Object Notation&#xff09;是两个紧密相连但又有区别的概念。它们都在数据处理和交换中扮演着重要角色。本文将详细讲解JavaScript中的自定义对象以及JSON对象的基本概念、格式、用法…...

C# 字符串罗马数字123转汉字一二三

要将字符串 "123" 转换为 "一二三"&#xff0c;可以通过以下几种方法来实现。 1. 使用映射字典 可以创建一个映射字典&#xff0c;将数字字符映射到对应的中文数字&#xff0c;然后遍历原始字符串进行替换&#xff1a; using System; using System.Coll…...

红杉资本视角:大公司在AI领域的投资策略与市场影响

在人工智能&#xff08;AI&#xff09;的快速发展浪潮中&#xff0c;大型科技公司如谷歌、Meta等正在积极投资&#xff0c;以确保在未来技术竞争中占据有利地位。红杉资本等投资机构对此现象进行了深入分析&#xff0c;探讨了大公司在AI领域的投资策略及其对市场的影响。本文将…...

CI/CD学习之路

CI/CD之路 https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg4NDg0MjQ0MQ&actiongetalbum&album_id3433192036428447744&scene173&subscene&sessionidsvr_0b1e7fe1d6b&enterid1721879847&from_msgid2247485821&from_itemidx1&count3&am…...

IP 泄露: 原因与避免方法

始终关注您的IP信息&#xff01; 您的IP地址不仅显示您的位置&#xff0c;它包含几乎所有的互联网活动信息&#xff01; 如果出现IP泄漏&#xff0c;几乎所有的信息都会被捕获甚至非法利用&#xff01; 那么&#xff0c;网站究竟如何追踪您的IP地址&#xff1f;您又如何有效…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...