Redis -- String 字符串, 计数命令,字符串操作

"学如逆水行舟,不进则退。"


目录

Redis的String字符串

常见命令 

set

get

mget

mset 

setnx

setex

psetex

计数命令 

incr

incrby

decr

decrby

incrbyfloat

字符串操作

append

getrange

setrange

strlen

小结

string内部编码


Redis的String字符串

        redis中所有的key都是字符串的,但是value是存在各种差异的。Redis中的字符串直接就是按照二进制的方式进行存储的,不会做任何编码转换,存的是啥取得就是啥。对于value来说,不仅仅可以存储文本数据,还可以存储整数,普通文本,Json,xml,还有一些二进制文件,例如图片音频等,但是redis对string类型限制了大小,最高位512MB。

        下面是字符串类型的value的不同形式:

 

        区别于MySQL,MySQL有一个默认的字符集,为拉丁文的字符集,插入中文机会检测插入失败。但是redis是直接存储的二进制,因此redis遇到乱码的概率就小的多。

常见命令 

set

        将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。

         除了最常见的set key value之外,我们还可以在set的时候设置存活时间,类似于expire的操作。

语法set key value [expiration EX seconds | PX milliseconds] [NX|XX]

        相当于set key value和expire key 10这两步的操作。EX设置的相当于秒级,PX设置的表示毫秒级。NX表示如果key不存在才设置,XX表示key存在,则不设置,并且返回nil(相当于更新操作

        [ ]表示一个独立的单元,相当于一个可有可无的选项,[ ]中的|表示或者的意思,即使是多个|也只能选择其中的一个。[ ]和[ ]之间是可以同时存在的。

        还有一个小技巧就是在redis-cli输入flushAll,这个操作就相当于mysql里面的drop database。

演示 :

         -2表示当前key已经被删除了

        设置NX参数:

        nil表明key1已经存在无法设置

        设置XX参数:

        OK表示覆盖key1成功

get

        get key来获取对应key的value,但是只能获取对应value为字符串类型的key。

        例如 :

        创建一个列表类型的value,然后尝试使用get去获取,发现报错。 

mget

        一次性get多个key 的value。对比与get操作,mget可以减少网络传输的次数,可以节省网络资源。

        时间复杂度为O (N),n是key的数量

         下面是一个简单的时间消耗对比:

        但是由于其是单一线程模型,同一个请求的任务的执行时间不宜过长。学会使用批量操作,可以有效提高业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是无节制的,否则可能造成单一命令执行时间过长,导致 Redis 阻塞。

语法:mget key [key1 key2 key3 ... ]

        多个key之间使用空格间隔开

演示:

        设置三个key-value 

        使用mget获取三个key-value

mset 

        一次性可以设置多个key-value,其用法和mget类型。

        时间复杂度O(N)

 语法:mset key value [ key2 value2 key3 value3 ... ]

         多个key-value之间使用空格间隔

        返回值为ok。

演示

setnx

        set if not exists

        功能类似于set key value ex,也就是说,设置的这个key已经存在,那么就会设置失败并且返回一个integer0。

语法:setnx key value 

演示

setex

        设置一个key-value,并且向此key value增加一个存活时间

语法:setex  key value seconds value

        解释:second表示秒级,代表你要输入的秒数

演示:

        设置一个存活时间为10秒的key value

           -2表示这个key已经不存在了


        既然有秒级,那么必然有毫秒级,毫秒级别的指令为psetex


psetex

        设置一个key-value,并且向此key value增加一个存活时间(毫秒级别)

语法:psetex key value milliseconds value

        解释:second表示毫秒级,代表你要输入的毫秒数

演示

        设置一个存活时间为1000ms的key value.


计数命令 

  • incr:针对数字字符串的value 进行 +1 操作
  • incrby:针对数字字符串的value进行 +n操作
  • decr:针对数字字符串的value进行 -1操作
  • decrby:针对数字字符串的value进行 -n操作 
  • incrbyfloat:针对浮点数进行处理

        这些命令的对象的value必须是数字类型的字符串例如 "111",但是不能是"111好" 

incr

        设置一个value为10的key,然后对其进行incr操作:

        如果设置一个非整数字符串,然后对其进行incr操作:

        此时就会发生错误:ERR value is not an integer or out of range

        说明,这个value为非数字字符串,或者超出了范围(64位),上述例子为超出了范围。

        这里的范围可以理解为java中的long类型

注意

        如果对一个不存在的key进行incr操作会有什么效果?

        ? 咦?这说明什么?incr操作的key如果不存在,就会把这个key当作0来处理

        

incrby

        针对一个数字类型的value来进行+n操作。

语法:incrby key num

        解释:对key的value进行+num操作。这里的key的value必须是一个整数的字符串形式。

        返回值为+num后的结果

演示

        同理如果针对一个不存在的key,那么效果如incr一样,key都会被当作0来进行+num操作。

        当然你也可以使用incrby key -20来让它进行一个-n的操作。

decr

语法:decr key

        返回值为计算之后的值,例如key的value为10,那么decr的返回值就为9

演示:

        同理如果decr的key不存在,那么这个key就会被当作0,然后进行-1操作:

decrby

        -n操作

 语法:decrby key num

        返回值为计算之后的结果

演示:

incrbyfloat

        针对浮点数进行加减操作

语法:incrbyfloat key float

        返回值仍然为计算之后的结果。

演示

        如果incrbyfloat一个不存在的key?

        同样会把这个key2当作0来进行处理。


        很遗憾没有decrbyfloat操作,但是你可以使用incrbyfloat 负数的形式实现减法:


        上述这几个计数命令的时间复杂度都是O(1)

        很多存储系统和编程语言内部使用 CAS 机制实现计数功能,会有一定的 CPU 开销,但在 Redis 中完全不存在这个问题,因为 Redis 是单线程架构,任何命令到了 Redis 服务端都要顺序执行,因此多个客户端对同一个value进行计数操作是不会引起'线程安全'的问题的。


        除了对数字类型的字符串进行incr等操作,还有一些更多更常见的场景也需要使用到一些非常常用的命令,例如对一个字符串进行拼接操作等,字符串拼接操作在java中可以说是非常常见了。Redis中也存在对字符串形式的value进行拼接等一系列操作的命令。

字符串操作

append

        如果这个key已经存在,并且是一个string,append命令会将会将要添加的内容追加到原有的value后边,如果key不存在,则等同于set命令。

语法:append key otherString

        返回值值的单位为字节,如果使用的是xshell的终端,默认的字符集编码是utf8,在终端输入汉字之后,也是按照utf8编码,一个汉字在utf8编码通常是3个字节。

演示

        可以看到返回值为integer10,正好为字母数量。

        如果append的key不存在,那么就相当于set:

        汉字的返回值根据它的字符集来计算:

        然后我们通过get来获取这个中文value的key:

        这个汉字被转化为16进制去了。

        可以去字符编码查看网站。

        那么如何将其设置为可以识别中文?

        只需要在启动redis客户端的时候,加上--raw这样的选项,redis就会尝试翻译二进制数据。

getrange

        返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭:[start, end])。可以使用负数表示倒数。-1 代表倒数第一个字符,-2 代表倒数第二个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值。

语法getrange  key  start   end

         时间复杂度:O(N)

演示:

        我们以helloworld为例:

        对helloworld进行各种getrange操作:

        最后发现,发现getrange操作是不会改变原有的key的value的。

        需要注意的是,这里的0 -1,0 -2都是指的字符,但是如果是中文也可以如此吗,例如:

        就会出现各种乱码问题这是为嘛?所以为汉字的时候就尽量不要使用getrange,很可能切出来就不是完整的汉字,上述的代码是强行切除了几个自己,所以在utf8中查出不知道是什么字符。

setrange

        覆盖字符串的一部分,从指定的偏移开始。

语法setrange  key offset value

        其中offset是从第几个字节开始进行替换。举个例子:

        set key hellowrold

        setrange key  1 aaa

        get key 输出 haaaoworld

        时间复杂度:O(N), N 为 value 的长度. 由于一般给的 value 比较短, 通常视为 O(1).
        返回值:替换后的 string 的长度。

演示

        如果offset为1,那么就是从第一个字节开始,如果为0就是从第一个字节的前面开始:

        假设要替换的字节比较靠后,进行替换的字符串也比较长,那么:

        同样的,尽量不要对中文字符串进行setrange操作

strlen

        获取 key 对应的 string 的长度,单位是字节。当 key 存放的类似不是 string 时,报错。 

语法:strlen key

        输出key的vaue 的字节数。

案例

小结

string内部编码

字符串类型的内部编码有 3 种:
• int:8 个字节的长整型。
• embstr:小于等于 39 个字节的字符串。
• raw:大于 39 个字节的字符串。
Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。 

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

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

相关文章

文生图提示词:自然景观

场景描述 --自然景观 Natural Landscapes 涵盖了多种自然景观,可以用于精确地表达 AI 生成图像中所需的自然环境。 Mountain 山脉 River 河流 Forest 森林 Beach 海滩 Ocean 海洋 Lake 湖泊 Waterfall 瀑布 Desert 沙漠 Valley 山谷 Meadow 草地 Glacier 冰川 Cliff…

springboot137欢迪迈手机商城设计与开发

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

通过与chatGPT交流实现零样本事件抽取

1、写作动机: 近来的大规模语言模型(例如Chat GPT)在零样本设置下取得了很好的表现,这启发作者探索基于提示的方法来解决零样本IE任务。 2、主要贡献: 提出了基于chatgpt的多阶段的信息抽取方法:在第一阶…

6、应急响应-日志自动提取自动分析ELKLogkitLogonTracerAnolog等

用途:个人学习笔记,欢迎指正 目录 背景: 一、日志自动提取-七牛Logki&观星应急工具 1、七牛Logkit: (支持Windows&Linux&Mac等) 2、观星应急工具(只支持Windows) 二、日志自动分析-Web-360星图&Goaccess&ALB&Anolog 1、W…

uniapp 使用canvas 画海报,有手粘贴即可用(拆成组件了,看后面)

1.直接使用 html部分 <view click"doposter">下载海报</view> <canvas canvas-id"myCanvas" type2d style"width: 370px; height: 550px;opcity:0;position: fixed;z-index:-1;" id"myCanvas" />js 部分 drawBac…

【网络安全|漏洞挖掘】ChatGPT 再曝安全漏洞,被指泄露私密对话

风靡全球的聊天机器人 ChatGPT 近日再次陷入安全风波&#xff0c;被曝泄露用户同机器人的私密对话&#xff0c;其中包含用户名、密码等敏感信息。 ArsTechnica 网站援引其读者提供的截图报道称&#xff0c;ChatGPT 泄露了多段非用户本人的对话内容&#xff0c;包含了大量敏感信…

前端入门第二天

目录 一、列表、表格、表单 二、列表&#xff08;布局内容排列整齐的区域&#xff09; 1.无序列表&#xff08;不规定顺序&#xff09; 2.有序列表&#xff08;规定顺序&#xff09; 3.定义列表&#xff08;一个标题多个分类&#xff09; 三、表格 1.表格结构标签 2.合并…

使用宝塔面板访问MySQL数据库

文章目录 前言一、安装访问工具二、查看数据库总结 前言 前面我们已经部署了前后端项目&#xff0c;但是却不能得到数据库的信息&#xff0c;看有谁再使用你的项目。例如员工、用户等等。本次博客进行讲解如何在宝塔面板里面访问MySQL数据库。 一、安装访问工具 1、打开软件商…

TensorFlow2实战-系列教程13:Resnet实战1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 Resnet实战1 Resnet实战2 Resnet实战3 1、残差连接 深度学习中出现了随着网络的堆叠…

scienceplots绘图浅尝

前言 科研写作中&#xff0c;黑压压的文字里面如果能有一些优美的图片无疑会给论文增色不少&#xff0c;绘图的工具有很多&#xff0c;常用的有Excel、Python、Matlab等&#xff0c;Matlab在绘图方面相较于Python有一种更加原生的科研风&#xff0c;而且可视化编辑图例、坐标轴…

ManticoreSearch-(安装配置,集群搭建)-学习总结

ManticoreSearch-(安装配置)-学习总结 基础概念安装搭建集群搭建(基于K8S) 原文地址 https://blog.csdn.net/liuyij3430448/article/details/135955025 基础概念 Manticore Search是一个专门为搜索设计的多存储数据库&#xff0c;具有强大的全文搜索功能&#xff0c;适用于…

【SparkML系列3】特征提取器TF-IDF、Word2Vec和CountVectorizer

本节介绍了用于处理特征的算法&#xff0c;大致可以分为以下几组&#xff1a; 提取&#xff08;Extraction&#xff09;&#xff1a;从“原始”数据中提取特征。转换&#xff08;Transformation&#xff09;&#xff1a;缩放、转换或修改特征。选择&#xff08;Selection&…

15.Golang中的反射机制及应用

目录 概述实践基本应用复杂应用 结束 概述 Golang中的反射用法还是比较简单的 reflect.TypeOf(arg)reflect.ValueOf(arg) 实践 基本应用 package mainimport ("fmt""reflect" )func reflectNum(arg interface{}) {fmt.Println("type ", re…

网络异常案例三_RST

问题现象 在做功能测试的时候&#xff0c;经常看到设备离线的消息&#xff08;MQTT遗嘱&#xff09;。 在终端连接的网络设备上抓包分析&#xff0c;看到终端设备发起大量的RST请求。 151这个设备&#xff0c;7min&#xff0c;重置断开了8个TCP连接&#xff08;mqtt连接&#…

理解部署描述符的元素

理解部署描述符的元素 部署描述符是文件名为web.xml的XML文件&#xff0c;其包含了Web应用程序的配置信息。每个Web应用程序都有一个web.xml文件。web.xml文件的元素可用于指定servlet的初始化参数、不同文件的MIME类型、侦听器类&#xff0c;以及将URL模式映射到servlet上。一…

2024年,AI 掀起数据与分析市场的新风暴

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿在其公司内部的飞书订阅号发表了多篇 Rethink Data & Analytics 的内部信&#xff0c;分享了对数据与分析行业的一些战略思考&#xff0c;尤其是 AI 带来的各种变化和革命&#xff0c;是如何深刻地影响这个行业乃至…

防御挂马攻击:从防御到清除的最佳实践

挂马攻击&#xff0c;也称为马式攻击&#xff08;Horse Attack&#xff09;&#xff0c;是一种常见的网络攻击手段。攻击者通过在目标服务器或网站中植入恶意程序&#xff0c;以获取系统权限或窃取敏感信息。为了应对这种威胁&#xff0c;本文将重点介绍防御挂马攻击的最佳实践…

AI项目落地成功因素:数据和机器学习模型的选择

构建机器学习模型时&#xff0c;需要考虑几个关键要素&#xff1a;计算能力、算法和数据。公司往往会将大部分资源集中于开发正确的、无偏见的算法&#xff0c;并加大对计算能力的投入&#xff0c;而在运行模型前&#xff0c;数据通常靠边站或完全被抛诸脑后。 如果数据被遗忘&…

C语言——动态内存管理(经典例题)

题1、 为什么会崩溃呢&#xff1f;&#x1f914;&#x1f914;&#x1f914; #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char** p) {*p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(&str);str…

腾讯云幻兽帕鲁Palworld服务器价格表,2024年2月最新

腾讯云幻兽帕鲁服务器价格32元起&#xff0c;4核16G12M配置32元1个月、96元3个月、156元6个月、312元一年&#xff0c;支持4-8个玩家&#xff1b;8核32G22M幻兽帕鲁服务器115元1个月、345元3个月&#xff0c;支持10到20人在线开黑。腾讯云百科txybk.com分享更多4核8G12M、16核6…