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 会根据当前值的类型和长度动态决定使用哪种内部编码实现。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web应用课——(第四讲:中期项目——拳皇)

代码AC Git地址:拳皇——AC Git链接

迁移学习实现图片分类任务

导入工具包 import time import osimport numpy as np from tqdm import tqdmimport torch import torchvision import torch.nn as nn import torch.nn.functional as Fimport matplotlib.pyplot as plt %matplotlib inline# 忽略烦人的红色提示 import warnings warnings.fi…

11.Ubuntu

目录 1. 什么是Ubuntu 1.1. 概述 1.2. Ubuntu版本简介 1.2.1. 桌面版 1.2.2. 服务器版 2. 部署系统 2.1. 新建虚拟机 2.2. 安装系统 2.3. 部署后的设置 2.3.1. 设置root密码 2.3.2. 关闭防火墙 2.3.3. 启用允许root进行ssh 2.3.4. 安装所需软件 2.3.5. 制作快照 …

企业图纸数据防泄密方案(图纸防泄密的几个实用方法)

在当今的商业环境中,企业图纸数据的重要性日益凸显。无论是产品设计、研发、生产还是项目管理,图纸都承载着企业的核心知识产权和商业机密。 然而,随着信息技术的迅猛发展,企业图纸数据泄密事件屡屡发生,给企业带来了…

【20240131】USB相机(查看设备列表、打开设备)

USB相机采集 1、v4l2查看设备列表2、查看具体设备信息3、在桌面打开USB相机 1、v4l2查看设备列表 打开终端,输入:v4l2-ctl --list-devices usb设备在Webcam: Webcam栏,分别是video9和video10,下一步:确定哪一个是接入…

存内计算——发展史与近期成果

存内计算的概念早在上个世纪就已经被提出,但当时的人们寄希望于通过优化处理器设计以及工艺制程的升级,来获得性能和能效比的提升,存内计算的研究仅停留在理论阶段。随着大数据时代的到来,存内计算由于其结构特点以及摩尔定律的“…

机器学习 低代码 ML:PyCaret 的使用

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

大数加法-----蓝桥杯

题目描述 以字符串的形式读入两个数字&#xff0c;编写一个函数计算它们的和&#xff0c;以字符串形式返回。 数据范围: s.length,tlength < 100000&#xff0c;字符串仅由0~9构成要求: 时间复杂度 O(n)。 结构示例1&#xff1a; 结果示例2&#xff1a; 代码展示&#xff…

在中国,大多数做机器视觉工程师的人的出路是什么?

工程师一直号称是靠技术吃饭&#xff0c;越老越吃香。显然我们机器视觉工程师归属于工程师。 可是这种是一种低级趣味的思维力度。 试问现在程序员难道不是越老越吃香吗&#xff1f; 律师难道不是吗&#xff1f; 银行家难道不是吗&#xff1f; 现在整体经济下滑情况&#xff0…

C++ 菱形继承和虚拟菱形继承

菱形继承和虚拟菱形继承 菱形继承1. 概念2. 产生的问题 虚拟菱形继承1.1 使用1.2 原理 菱形继承 1. 概念 菱形继承是多继承的一个特殊情况&#xff0c;多继承是指一个子类类继承了两个或以上的直接父类&#xff0c;而菱形继承问题的产生是因为该子类的父类&#xff0c;继承了…

超好看的前端特效HTML特效、CSS特效、JS特效(第一期)

超好看的前端特效 1. 粒子组成文字动画特效 文件组成&#xff1a; base.css import url(https://fonts.googleapis.com/css?familyAbrilFatface|Raleway:300,400,900);.coidea-header {position: fixed;display: block;width: 96%;width: calc( 100% - 32px );height: 40px;m…

面试题:Feign第一次调用为什么会很慢?

文章目录 前言Ribbon是如何进行负载的RibbonClientConfigurationZoneAwareLoadBalancerRibbon负载均衡策略Ribbon-eager-load&#xff08;饥饿加载&#xff09;模式开启Ribbon饥饿加载总结 前言 首先要了解 Feign 是如何进行远程调用的&#xff0c;这里面包括&#xff0c;注册…

Fiddler修改https请求与响应 bug修复变灰了选不了等 Fiddle对夜神模拟器抓包设置

不要修改别人的东西&#xff0c;不要修改别人的东西&#xff0c;不要修改别人的东西 只用于自己的网站&#xff0c;自己安全调试。 fiddler修改https请求 1、打到要改的请求 2、替换请求内容 3、开启捕获。操作产生请求。 4、fiddler里查看请求或响应数据 &#xff0c;确认成…

ubuntu20配置mysql8

首先更新软件包索引运行 sudo apt update命令。然后运行 sudo apt install mysql-server安装MySQL服务器。 安装完成后&#xff0c;MySQL服务将作为systemd服务自动启动。你可以运行 sudo systemctl status mysql命令验证MySQL服务器是否正在运行。 连接MySQL 当MySQL安装…

操作系统基础:进程同步【下】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 进程同步⛵1.1 吸烟者问题✈️1.1.1 问题描述✈️1.1.2 问题分析1.1.2.1 关系分析&#xff08;确定同步、互斥关系&#xff09;1.1.2.2 整理思路&#xff08;确定PV操作的…

Golang语言异常机制解析:错误策略与优雅处理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 作为开发者来说&#xff0c;我们没办法保证程序在运行过程中永远不会出现异常&#xff0c;对于异常…

K8S网络

一、介绍 k8s不提供网络通信&#xff0c;提供了CNI接口(Container Network Interface&#xff0c;容器网络接口)&#xff0c;由CNI插件实现完成。 1.1 Pod通信 1.1.1 同一节点Pod通信 Pod通过虚拟Ethernet接口对&#xff08;Veth Pair&#xff09;与外部通信&#xff0c;Veth…

Unity_颜色空间GammaLinear

Unity_颜色空间Gamma&Linear Unity颜色空间的选择对于效果的影响具体有多大&#xff1f; 在ProjectSetting -> Player -> OtherSetting -> Rendering设置下的颜色空间选项卡选择颜色空间进行设置&#xff1a; 太深奥的解释一时半会看不懂&#xff0c;找见一个粗…

jsp 样衣申请与归还管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 样衣申请与归还管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为My…

地理空间分析10——空间数据分析中的地理编码与Python

目录 写在开头1. 地理编码基础1.1 地理编码的基本原理1.1.1 坐标系统1.1.2 地名解析1.1.3 编码算法1.2 Python中使用地理编码的基础知识1.2.1 百度地图API1.2.2 高德地图API1.2.3 腾讯地图API1.3 Python中实现代码2. 逆地理编码2.1 利用Python进行逆地理编码2.1.1 获取高德地图…