Redis常用命令——String篇

  前面我们讲解了一些 Redis 的全局命令(Redis常用基本全局命令)。所谓全局命令,就是可以匹配任意一个数据结构进行使用。但是不同的数据结构,也有自己的操作命令。本篇文章主要讲解的是 String 的操作命令,希望会对你有所帮助。

文章目录

一、简单介绍

二、常用命令

2、1 常见命令

set

get

MGET 和 MSET

SETNX、SETEX

2、2 计数命令

INCR 和 INCRBY

DECR 和 DECRBY

INCRBYFLOAT

2、3 其他命令

APPEND

 GETRANGE

SETRANGE

STRLEN

三、小结


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Redis 👀

💥 标题: Redis命令——String篇 💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

一、简单介绍

  我们再次强调:redis 所有的key都是字符串(String)类型,value的类型是存在差异的!而我们本篇文章讲解的 String 的命令操作,也是针对 value 的。

  Redis 中的字符串,直接就是按照字节数组(二进制数据)的方式存储的!不会做任何的编码转换,存的是啥,取出来就还是啥!不仅仅可以存储文本数据,还支持存储整数、文本、JSON、二进制数据等。

  字符串类型是Redis最基础的数据类型,关于字符串需要特别注意:

  • 首先Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他4种数据结构的学习奠定基础。
  • 其次,如下图所示,字符串类型的值实际可以是字符串,包含一般格式的字符串或者类似JSON、XML格式的字符串;数字,可以是整型或者浮点型;甚至是二进制流数据,例如图片、音频、视频等。不过一个字符串的最大值不能超过512 MB。

  由于Redis内部存储字符串完全是按照二进制流的形式保存的,所以Redis是不处理字符集编码问题的,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。

  下面我们就来看一下String的操作命令。

二、常用命令

2、1 常见命令

set

  前面文章中我们讲解过set命令的使用。在此我们再次详细解释一下 set 命令的使用。首先,get、set都是针对 String 的命令,也是最为重要和基础的两个命令!set 语法格式:

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]

  下面是对 set 命令参数的详细解释:

  • key:指定要设置值的键。
  • value: 要存储的值。
  • [expiration EX seconds | PX milliseconds]: 可选参数,用于设置键的过期时间。可以使用EX参数和以秒为单位的时间来设置过期时间,或者使用PX参数和以毫秒为单位的时间来设置过期时间。过期后会自动删除!具体实例如下:
  • [NX|XX]: 可选参数,用于指定设置操作的行为。NX——只在key不存在时才进行设置,即如果key之前已经存在,设置不执行。XX——只在key存在时才进行设置,即如果key之前不存在,设置不执行。具体实例如下:

  注意,redis文档给出的语法格式说明:

  • [ ] 相当于一个独立的单元,表示可选项(可有可无的);
  • 其中 | 表示 "或者" 的意思,多个只能出现一个;
  • [ ] 和 [ ] 之间,是可以同时存在的。

get

  get命令没什么好解释的,也是只支持字符串(String)类型的value。如果不匹配,则直接会报错提示。具体如下:

  语法也很简单:

get key

  直接使用即可,这里不再做过多解释!需要学习的可以参看此篇文章:Redis常用基本全局命令。

MGET 和 MSET

  在Redis中,MGET和MSET是用于批量获取和设置多个键值对的命令。之前我们也说明了Redis是一个基于网络的客户端/服务器的中间件。为了减少网络IO的次数,那么就出现了MGET 和 MSET 指令。类似的Redis都有很多命令都是可以支持一次操作多个键值对的。其目的就是为了提高效率。

  我们先来看一下MGET 命令语法:

MGET key [key ...]

  理解并不难,我们直接看实例:

   我们再来看一下MSET 的语法:

 MSET key value [key value ...]

  我们直接看实例:

  两者的时间复杂度均为O(n),这里的 n 并不是指的redis中所有的key,而是我们所设置的key的个数。即使mset 和 mget 指令可以一次操作多个键值对,但是并不会一次设置或者获取 太对的键值对。因为我一次设置假设10w个键值对,有可能把redis 给阻塞住了!导致其他的命令不能够被执行,引起连锁反应!

SETNX、SETEX

  SETNX、SETEX其实就是把set 中的nx 和 ex选项结合成为一个命令了。这里再简单解释一下。

  SETNX 命令用于在 Redis 中设置一个 key 的值,如果这个 key 不存在的话。如果设置成功,返回 1;如果 key 已经存在,则不做任何操作,返回 0。具体实例如下:

  SETEX 命令用于在 Redis 中设置一个 key 的值,并指定该 key 在指定的秒数后过期。如果设置成功,返回 OK。这里要说明一下其语法:

SETEX key seconds value

  我们直接看一个实例:

2、2 计数命令

INCR 和 INCRBY

  在 Redis 中,INCR 和 INCRBY 命令都用于对存储在指定 key 中的值进行增量操作。

  1. INCR 命令用于将存储在指定 key 的值递增 1。如果 key 不存在,则先将其设置为 0,然后再执行递增操作。语法:INCR key。
  2. INCRBY 命令用于将存储在指定 key 的值递增指定的增量值。如果 key 不存在,则先将其设置为 0,然后再执行递增操作。语法:INCRBY key increment。

  注意:如果INCR 和 INCRBY key对应的string 不是一个整型或者范围超过了64位有符号整型,则报错。我们来看一下实例:

DECR 和 DECRBY

  在 Redis 中,DECR 和 DECRBY 命令与 INCR 和 INCRBY 命令相反,用于对存储在指定 key 中的值进行减量操作。

  1. DECR 命令用于将存储在指定 key 的值递减 1。如果 key 不存在,则先将其设置为 0,然后再执行递减操作。语法:DECR key。
  2. DECRBY 命令用于将存储在指定 key 的值递减指定的减量值。如果 key 不存在,则先将其设置为 0,然后再执行递减操作。语法:DECRBY key decrement。

  注意:如果DECR 和 DECRBY key对应的string 不是一个整型或者范围超过了64位有符号整型,则报错

INCRBYFLOAT

  INCRBYFLOAT是 Redis 中用于对存储在指定键中的浮点数值进行增加或减少操作的命令。下面是关于 INCRBYFLOAT 命令语法:

INCRBYFLOAT key increment

功能描述:

  • INCRBYFLOAT 命令用于在指定键存储的值为浮点数时,将这个值增加(或减少)指定的浮点数增量。
  • 如果键不存在,那么在执行命令前,会先将键的值设置为 0,再执行增加操作。
  • 如果键包含的值不是浮点数,命令将返回错误。
  • 增量参数可以是正数也可以是负数,用来增加或减少存储在键中的浮点数值。

  注意:并没有DECRBYFLOAT,我们可以通过INCRBYFLOAT key 负数 来实现对 key 的减法操作。这里就不再举例了,大家可以自己操作一下。

2、3 其他命令

APPEND

  append 顾名思义就是追加嘛!如果key已经存在并且是一个string,命令会将value追加到原有string的后边。如果key不存在,会先将键的值设置为空字符串再进行追加操作,则效果等同于SET命令。最终返回值为追加后字符串的长度。其语法如下:

 APPEND KEY VALUE

  具体实例如下:

  可不可以追加汉字呢?是可以的。具体如下:

  append返回值,长度的单位是字节。但是为什么会是6个字节呢?redis的字符串不会对字符编码做任何处理(redis 不认识字符,只认识字节)。当前咱们的xshell终端,默认的字符编码是utf8,在终端中输入汉字之后,也就是按照utf8编码的。一个汉字在utf8字符集中通常是3个字节的。

  我们通过get 获取value时,发现并不是我们所想的到的汉字,而是一堆二进制。因为存储进去时,并没有指定编码格式,那么存储的就是二进制,并且是以utf8所对应的编码方式的二进制存储进去的。所以我们得到的就是一堆二进制。

  在启动redis客户端的时候,加上一个--raw这样的选项。就可以使redis客户端能够自动的把二进制数据尝试翻译。具体如下:

 GETRANGE

  GETRANGE 命令用于获取指定键对应值的子字符串(根据指定的起始位置和结束位置)。语法:

GETRANGE key start end

  返回key对应的string的子串,由start和 end确定(左闭右闭),并且起始位置为0。可以使用负数表示倒数。-1代表倒数第一个字符(len - 1),-2代表倒数第二个(len - 2),其他的与此类似。超过范围的偏移量会根据string的长度调整成正确的值。具体实例如下:

  

  如果字符串中保存的是汉字,此时进行子串切分,很可能切出来的就不是完整的汉字了!如下:

  上述的代码,是强行切出了中间的四个字节。随便这么一切,切出的结果在utf8码表上不知道能查出啥了。

SETRANGE

  SETRANGE 命令用于替换指定键对应值的字符串中的部分内容。语法:

SETRANGE key offset value

  offset 为偏移量,表示从哪个位置开始替换字符串内容(以 0 表示)。value就是覆盖指定位置的值。注意:setrange 是用来覆盖替换的,并不是插入!具体实例如下:

  setrange针对不存在的key也是可以操作的.不过会把 offset之前的内容填充成0x00.具体如下:

STRLEN

  STRLEN 命令用于获取存储在指定键中的字符串值的长度。当key存储的value不是string时,直接报错。或者当 key 不存在时,返回 0。语法:

STRLEN key

  具体实例如下:

三、小结

  上述命令总结出如下表格,根据不同场景可以做出不同选择。具体如下:

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

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

相关文章

ClickHouse课件

列式存储数据库:hbase clickhouse 简介 ClickHouse入门 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C语言编写,主要用于在线分析处理查询(OLAP),能够使用…

2024年电工杯B题论文首发+问题一论文代码分享

问题一论文代码链接:https://pan.baidu.com/s/1kDV0DgSK3E4dv8Y6x7LExA 提取码:sxjm --来自百度网盘超级会员V5的分享 基于数据分析的大学生平衡膳食食谱的优化设计及评价 摘要 大学时期不仅是学术学习和身体成长的关键阶段,更是青年学生…

Hsql每日一题 | day03

前言 就一直向前走吧,沿途的花终将绽放~ 题目:打折日期交叉问题 如下为平台商品促销数据:字段为品牌,打折开始日期,打折结束日期 brand stt edt oppo,2021-06-05,2021-06-09 oppo,2021-06-11,2021-06-21 vivo,…

Java中流的概念细分

按流的方向分类: 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。 输出流:数据流向是程序到目的地(以OutputStream、Writer结尾的流)。 按处理的数据单元分类: 字…

PVE 虚拟机环境下删除 local-lvm分区

1、删除逻辑卷 lvremote pve/data 2、扩展逻辑卷 lvextend -l 100%FREE -r pve/root 3、 修改存储目录内容 点击 Datacenter - Storage (1)删除local-lvm分区 (2)编辑local分区,在内容一项中勾选所有可选项。

Spring Boot 3.3 正式发布,王炸级更新,应用启动速度直接起飞!

最新消息,Spring Boot 一次性发布了 3 个版本: 3.3.0 3.2.6 3.1.13 Spring Boot 3.3 正式发布了,3.1.x 在前几天也停止维护了。 最新的支持版本如下: 从路线图可以看到每个版本的终止时间,每个版本的生命周期只有…

clickhouse 中的数组(array)和元组(Tuple)—— clickhouse 基础篇(二)

文章目录 数组判断是否为空计算数组长度获取数组元素判断某个元素是否存在数组切片数组元素展开数组元素去重删除连续重复元素连接多个数组数组倒序数组拍平数组元素映射数组元素过滤数组聚合分析计算数组交集计算数组并集计算数组差集SQL 子查询进行集合操作 元组创建元组获取…

LeetCode刷题之HOT100之二叉树的直径

2024/5/25 阴天。这几天睡眠质量都非常好,一切似乎都在慢慢上升。先把题做了 1、题目描述 2、逻辑分析 题目要求就是给一个二叉树,求出两个节点之间的最大长度即为二叉树的直径。怎么做呢?我想不出来。看一下题解吧。题解给出的解法是深度优…

Linux——Docker容器虚拟化平台

安装docker 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 不需要设置防火墙 docker命令说明 docker images #查看所有本地主机的镜像 docker search 镜像名 #搜索镜像 docker pull 镜像名 [标签] #下载镜像&…

mybatis-plus 优雅的写service接口中方法(3)

多表联查 上文讲过了自定义sql ,和wrapper的使用,但是我们可以发现 我们查询的都是数据库中的一张表,那么怎么进行多表联查呢,当然也是用自定义sql来进行实现 比如说 查询 id 为 1 2 4 的用户 并且 地址在北京 的 用户名称 普…

Elasticsearch不删原有jdk8导致的系列安装和启动问题

以前在空机器直接装elasticsearch,没有遇到什么问题。今天在现有JDK上安装,遇到的问题记录一下: 1. JDK的环境变量配置与我原有的不一致报如下错误: [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

python-数据分析与可视化基础

1、data1.csv中的B、C、D和E列数据分别是日期、权重、A企业的销售额、B企业的销售额。读取C、D、E列数据,并统计E列数据的算术平均数、加权平均值(权值为C列数据)、方差、中位数、最小值、最大值。并绘制E列数据的直方图。 (1)源代码: impo…

什么生信流程语言让你极度爽?

生信流程搭建有多难?行业为解决这一问题提出了各种各样的配方,有你熟悉的吗? 一、困境 - 乱 无数机构投入大量人力物力,以期获得一条条可用的生信流程。而有些流程,由于种种原因,存在着巨大的缺陷&#xf…

安全风险 - 切换后台时背景模糊处理

因为安全风险中提到当app处于后台卡片状态时,显示的卡片页面应该为模糊效果,否则容易泄露用户隐私,尤其当前页涉及个人信息、资产信息等,都会造成信息泄露!基于这种场景,我研究了下这种业务下的模糊效果 找…

普通函数的参数中的auto

2.1 普通函数的参数中的auto 从c14起&#xff0c;lambda可以使用auto占位符声明或者定义参数: auto printColl [] (const auto& coll) // generic lambda{ for (const auto& elem : coll) {std::cout << elem << \n;}} 只要支持Lambda 内部的操作&…

Golang创建文件夹

方法 package zdpgo_fileimport ("os" )// AddDir 创建文件夹 func AddDir(dir string) error {if !IsExist(dir) {return os.MkdirAll(dir, os.ModePerm)}return nil }测试 package zdpgo_fileimport "testing"func TestAddDir(t *testing.T) {data : […

JAVA云HIS医院系统源码 HIS源码:云HIS系统与SaaS的关系

云HIS系统与SaaS的关系 云HIS系统是一种基于云计算技术的医院信息系统&#xff0c;它采用B/S架构&#xff0c;通过云端SaaS服务的方式提供。用户可以通过浏览器访问云HIS系统&#xff0c;无需关注系统的部署、维护、升级等问题。云HIS系统通常具有模板化、配置化、智能化等特点…

hot100 -- 回溯(上)

目录 &#x1f35e;科普 &#x1f33c;全排列 AC DFS &#x1f6a9;子集 AC DFS &#x1f382;电话号码的字母组合 AC DFS &#x1f33c;组合总和 AC DFS &#x1f35e;科普 忘记 dfs 的&#xff0c;先看看这个&#x1f447; DFS&#xff08;深度优先搜索&#xf…

百度软件测试面试经历,期望薪资27K

一面 1、 请为百度搜索框设计测试用例&#xff1f; 2、百度设计框上线前需要进行那些测试&#xff1f; 界面测试&#xff0c;功能测试&#xff0c;性能测试&#xff0c;安全性测试&#xff0c;易用性测试&#xff0c;兼容性测试&#xff0c;UI测试。 3、如何查看http状态码…

重学java 38.创建线程的方式⭐

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一种方式_继承extends Thread方法 1.定义一个类,继承Thread 2.重写run方法,在run方法中设置线程任务(所谓的线程任务指的是此线程要干的具体的事儿,具体执行的代码) 3.创建自定义线程…