【精通Redis】Redis命令详解

news2024/9/8 23:14:55

引言

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 c

ZCARD zset-key

ZINCRBY zset-key 3 c

ZSCORE zset-key c

ZRANK zset-key c

ZRANGE 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,输出的有序集合为交集成员的各自的分值累加。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb笔记_FilterListener

一.过滤器 1.1 过滤器概述 过滤器主要用来拦截目标资源(静态资源或动态资源)的请求和响应 (类似地铁的安检) 我们访问动态或静态资源都要通过URL访问:http://localhost:8080/... 所以过滤器本质上拦截的是URL 1.2 过滤…

select ... for update中锁等级转化

一、结论 select ... for update 除了查询功能,还实现了加锁机制,是一种悲观锁。根据是否使用了主键和索引,决定锁等级是表锁还是行锁。如果采用了,则是行锁,否则是表锁。 二、实例 前提条件:将事务自动…

你敢信?1万块存上5年,到手只有900!

1996年的夏天你走进银行,会看到五年期整存整取的利息,可能高达14%左右。1万块存上5年,到手利息高达——7000元。 今天呢?同样的存款方式,5年后,能拿到的利息只有900元。靠吃银行利息就能躺平的年代&#xf…

分布式事务解决方案(一) 2PC、3PC、TCC、Sega

目录 1.绪论 2.2PC 2.1 基本原理 2.1.1 组成 2.1.2 步骤 1.prepare阶段 2.commit阶段 2.2 2PC 存在的问题 2.2.1 阻塞问题 2.2.2 单点故障问题 1. 事务协调器宕机 2.部分数据不一致问题 2.资源管理器宕机 3. 事务协调器和资源管理管理器同时宕机 2.2 实现 2.2.1…

【AI落地应用实战】Amazon Bedrock +Amazon Step Functions实现链式提示(Prompt Chaining)

一、链式提示 Prompt Chaining架构 Prompt Chaining 是一种在生成式人工智能(如大型语言模型)中广泛使用的技术,它允许用户通过一系列精心设计的提示(Prompts)来引导模型生成更加精确、丰富且符合特定需求的内容。 P…

freertos-HAL库-STM32Cubemax生成

打开cubemax选好型号配置RCC(外部高速时钟)这里查看原理图,我们把按键设为输入,led设为输出创建两个新任务(default是系统创建的)配置时钟,这里HSE是外部高速时钟,HSI是内部的&#…

打卡第27天------贪心算法

再次祈祷上帝,提前预备好自己,希望我可以在机会来临的时候,抓住机会,成功上岸! 一、理论基础 什么是贪心?例如:有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿? 你肯定是每次拿最大的,最终结果就是拿走最大数额的钱了。 每次拿最大的就是局部最优,…

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《60、Pandas中DataFrame对象的操作(一)》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…

Selenium Java中的isDisplayed()方法

isDisplayed()方法用于确定元素是否可见。本文将详细讨论 的WebElement接口isDisplayed()方法。 方法声明- boolean isDisplayed()它能做什么?此方法用于判断元素是否显示。这个方法节省了我们…

EasyExcel入门

目录 一、文章简介 二、概念 1.EasyExcel是什么? 2.EasyExcel 能用在哪里? 3.为什么要选用EasyExcel解析excel? 4.如何使用EasyExcel? 三、EasyExcel快速入门 1.环境搭建 2.简单写excel 代码示例 TestFileUtil Employe…

C++(week14): C++提高:(二)C++11线程库

文章目录 一、线程1.C11线程库的概述2.构造函数3.线程启动: 线程入口函数的传递方式4.线程终止5.线程状态6.获取线程id:get_id() 二、互斥锁1.什么是互斥锁2.头文件3.常用函数接口 三、lockguard与unique_lock1.lock_guard2.unique_lock(1)概念(2)函数接口 3.原子数…

Python脚本:使用PyPDF2给一个PDF添加上页数/总页数标签

一、实现代码 import PyPDF2 from PyPDF2 import PdfWriter from PyPDF2.generic import AnnotationBuilder# 指定输入和输出pdf pdf_path rC:\Users\ASUS\Desktop\temp\xxxx.pdf out_path rC:\Users\ASUS\Desktop\temp\xxxx2.pdf# 创建 PdfWriter 对象 writer PdfWriter()…

Python转换Excel文件为SVG文件

SVG(Scalable Vector Graphics)是一种基于XML的矢量图像格式。这种格式在Web开发和其他图形应用中非常流行,提供了一种高效的方式来呈现复杂的矢量图形。如果我们需要在网页中嵌入Excel表格,或是直接使用Excel工作表制作网页&…

基于元神系统编写“清屏”程序

1. 背景 本文介绍了基于元神系统开发软件的操作流程,并详细介绍了“清空屏幕”程序的编写以及测试结果。 2. 方法 (1)编写程序 在元神系统0.4版的基础上,用FASM汇编语言进行软件开发。假设屏幕为80列25行的文本显示模式&#…

【更新2022】各省农业科技活动经费(RD)测算 1999-2022 无缺失

各省农业科技活动经费(R&D)测算数据在农业经济学、政策研究和农村发展规划等领域的论文研究中具有重要应用价值。首先,这些数据可以用于分析不同省份在农业科技投入上的差异及其对农业生产力和产出的影响,帮助揭示不同地区农业…

Node.js版本管理工具之NVM

目录 一、NVM介绍二、NVM的下载安装1、NVM下载2、卸载旧版Node.js3、安装 三、NVM配置及使用1、设置nvm镜像源2、安装Node.js3、卸载Node.js4、使用或切换Node.js版本5、设置全局安装路径和缓存路径 四、常用命令技术交流 博主介绍: 计算机科班人,全栈工…

坐牢十八天 20240729(IO)

一.笔记 1. 有关系统时间的函数 1> 有关时间的函数 #include <time.h> time_t time(time_t *tloc); 功能&#xff1a;获取系统时间&#xff0c;从1970年1月1日0时0分0秒&#xff0c;到目前累计的秒数 参数&#xff1a;用于接收的秒数 返回值&#xff1a;秒数使…

【每日刷题】Day89

【每日刷题】Day89 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 2. 155. 最小栈 - 力扣&#xff0…

Open3D 计算点云质心

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 1.1原理 在Open3D中&am…