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

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

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

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

相关文章

【前端 19】使用Vue-CLI脚手架构建Vue2项目

使用Vue CLI构建Vue 2项目 引言 Vue.js 是一个构建用户界面的渐进式JavaScript框架,以其轻量级和易用性受到前端开发者的广泛喜爱。Vue CLI(Vue Command Line Interface)是一个基于Vue.js进行快速开发的完整系统,提供了零配置的项…

数据结构之线性表(顺序表的实现)

目录 一、线性表的原理 二、线性表的实现(顺序表) 1.定义顺序表 2.初始化顺序表 3.判断顺序表是否为空 4.获取顺序表的长度 5.向顺序表中插入元素 6.删除指定位置的元素 7.遍历顺序表 8.得到指定位置的元素 三、打印测试功能 1.测试 2.结果…

全球相机控制面板市场展望与未来增长机遇:预计未来六年年复合增长率CAGR为4.3%

在全球摄影器材和专业影像设备需求增长的背景下,相机控制面板正成为市场的焦点。本文详细分析了全球相机控制面板市场的现状、增长趋势及未来前景,旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示,2…

RK3568笔记四十七:PWM 子系统

若该文为原创文章,转载请注明原文出处。 pwm 子系统功能单一,很少单独使用,一般用于控制显示屏的背光、控制无源蜂鸣器、伺服电机、电压调节等等。 一、PWM介绍 PWM(Pulse width modulation),脉冲宽度调制。在内核中 PWM 驱动较简…

学习大数据DAY26 简单数据清洗练习和 Shell 脚本中的数据库编程

目录 上机练习 14 mysql 命令 sql 语句实现步骤 shell 脚本导入 csv 格式文件到 mysql 数据库 secure-file-priv 特性 把文件拷贝到 mysql 指定目录下 上机练习 15 mysqldump 命令 上机练习 16 上机练习 14 运用上一节课学的 Shell 工具完成 1. 清洗数据《infotest.t…

CentOS7 yum报错Cannot find a valid baseurl for repo

问题 Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infravag error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown…

前端canvas——五子棋小游戏开发

这估计是最后一篇了,终于是修复了部分bug——隔一个空格能够胜利的bug,并且添加了部分样式。 其他bug目前还没有找到,找到再说吧。 大部分代码请见: 用canvas实现五子棋小游戏https://blog.csdn.net/m0_54066656/article/detail…

后端笔记(2)--JDBC

1.JDBC简介 *JDBC(Java DataBase Connectivity)就是使用java语言操作关系型数据库的一套API *JDBC本质:(可以使用同一套代码,操作不同的关系型数据库) ​ *官方定义的一套操作所有关系型数据库的规则,即接口 ​ *各…

ESP之经典蓝牙库BluetoothSerial介绍和实例演示

ESP之经典蓝牙库BluetoothSerial介绍和实例演示 1.概述 目前ESP32内置了双模蓝牙(蓝牙4.0版本之前都是经典蓝牙,4.0版本成为BLT低功耗蓝牙转为物联网开发。双模指的就是这款芯片两种模式都支持)。 这篇文章介绍ESP32蓝牙的经典模式使用方法…

算法学习day23

一、k个一组翻转链表 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 思路: 1.首先得到链表的长度size;然后在size>k的范围里面进行翻转长度为k的链表。 2.while(size>k) 在这个循环中&#xf…

【C++BFS算法】886. 可能的二分法

本文涉及的点 CBFS算法 LeetCod886. 可能的二分法 给定一组 n 人(编号为 1, 2, …, n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。 给定整数 n 和数组 dislikes ,其…

电脑桌面记事本便签哪个好,有哪些好用的桌面备忘记事工具推荐

在寻找高效办公的道路上,我们经常需要记住许多重要的事情,然而人的记忆力终究有限,这时候就需要依赖一些工具来帮助我们进行提醒。一款好的电脑桌面记事本便签、桌面日程安排软件就像是一位得力助手,它不仅能够帮助我们合理规划时…

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

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

Excel模拟计算演示-以矩阵乘计算密度为例

Excel模拟计算演示-以矩阵乘计算密度为例 1.参考链接2.CUDA_Occupancy_Calculator截图3.矩阵乘计算密度模拟计算的操作步骤及效果 安装好CUDA之后,/usr/local/cuda-12.1/tools/CUDA_Occupancy_Calculator.xls里会看到"TABLE(,B17)"这样的表达式,原来是模拟计算的结果…

3V升5V输出800mA可驱动10MA驱动蜂鸣片芯片AH6910

135-3806-7573今天,我们将深入解析一款名为AH6910的芯片,这款芯片以其独特的3V至5V宽电压输入范围、800mA的高输出电流能力,以及能够轻松驱动低至10mA需求的蜂鸣片,成为了众多电子项目中的优选元件。######一、AH6910芯片概述 AH…

RIP路由协议

RIP-路由信息协议V1/V2/NG NG版为ipv6专用 距离矢量型IGP路由协议,使用跳数作为度量,支持等开销负载均衡;基于UDP,520端工作,基于UDP V1和V2的区别: 1、v1为有类别协议--不支持VLSM/CIDR,即使使…

ic进阶|性能篇02:一文带你了解一种特殊的并行技术-展开!

本期文章让我们聊聊一种数字ic设计技术——展开,展开用于产生一个一次迭代就相当于原有结构的多次迭代的新电路结构。其相当于之前聊过的折叠技术的反向操作,折叠使用一个功能单元通过多次迭代来完成原有电路结构一次迭代的操作,相对于通过时…

中电金信:云原生时代IT基础设施管理利器——基础设施即代码(IaC)

在数字化转型、零售业务快速发展、信创建设驱动下,应用架构、技术架构、基础架构都已向云原生快速演进,银行业IT基础设施管理产生了非常大的变化,当前银行业,正在开展新一轮的核心应用系统重构、基础平台统一建设等重点任务&#…

Playwright 的使用

Playwright 的特点 支持当前所有主流浏览器,包括 Chrome 和 Edge (基于 Chromiuns), Firefox , Safari 支持移动端页面测试,使用设备模拟技术,可以让我们在移动Web 浏览器中测试响应式的 Web 应用程序 支持所有浏览…

x264编解码库 -介绍和使用示例

目录 1:X264简单介绍 1.1:编译x264 1.2:x264简单介绍 1.3:x264的优势 1.4:x264与FFmpeg的关系 1.5:x264 编解码原理 1.6 进一步学习资源 2:demo效果 3:完整代码 4:附件…