【redis 】string类型详解

string类型详解

    • 一、string类型的概念
    • 二、string类型的常用指令
      • 2.1 SET
      • 2.2 GET
      • 2.3 MSET
      • 2.4 MGET
      • 2.5 SETNX
      • 2.6 INCR
      • 2.7 INCRBY
      • 2.8 DECR
      • 2.9 DECRBY
      • 2.10 INCRBYFLOAT
      • 2.11 APPEND
      • 2.12 GETRANGE
      • 2.13 SETRANGE
      • 2.14 STRLEN
    • 三、string类型的命令小结
    • 四、string类型的内部编码
    • 五、string类型的典型使用场景

一、string类型的概念

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

  1. ⾸先 Redis 中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。

在这里插入图片描述

  1. 如上图所⽰,字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过 512 MB。

二、string类型的常用指令

2.1 SET

将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此 key 的 TTL(键值对的过期时间) 也全部失效。

语法:

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

[ ]内是选填项,其他的是必填项

  • EX seconds:以秒作为单位设置key的过期时间

  • PX milliseconds:以毫秒作为单位设置key的过期时间

  • KEEPTTL:保留设置前指定键的生存时间

  • NX:只在key不存在时才设置,如果设置前key已存在,则不执行

  • XX:只在key存在时才设置,如果设置前key不存在,则不执行

返回值:成功返回ok,失败返回nil

使用方法:

  • 当创建的value值没有空格时:可加引号可不加引号没有影响

  • 当创建的value值有空格时需要加引号,否则会报错

//不存在时创建
127.0.0.1:6379> set key nexit nx
OK
127.0.0.1:6379> get key
"nexit"//存在不创建
127.0.0.1:6379> set key look nx
(nil)//存在时创建
127.0.0.1:6379> set key exit xx
OK
127.0.0.1:6379> get key
"exit"//不存在不创建
127.0.0.1:6379> set key1 look xx
(nil)//设置key的过期时间为10127.0.0.1:6379> set key second ex 10
OK
127.0.0.1:6379> get key
"second"//十秒后key被销毁
127.0.0.1:6379> get key
(nil)

2.2 GET

获取 key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是 string,会报错。

语法:

GET key

返回值:key 对应的 value,或者 nil 当 key 不存在时

使用方法:

127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get key
"hello"//没创建key2,找不到
127.0.0.1:6379> get key2
(nil)//key3不是string类型,报错
127.0.0.1:6379> hset key3 name lx
(integer) 1
127.0.0.1:6379> get key3
(error) WRONGTYPE Operation against a key holding the wrong kind of value

2.3 MSET

⼀次性设置多个 key 的值

MSET key value [key value ...]

返回值:永远是 OK

使用方法:

127.0.0.1:6379> mset key1 'name' key2 'age'
OK
127.0.0.1:6379> get key1
"name"
127.0.0.1:6379> get key2
"age"

2.4 MGET

⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil

语法:

MGET key [key ...]

返回值:对应 value 的列表

使用方法:

127.0.0.1:6379> mset key1 'hello' key2 'world' key3 'redis'
OK
127.0.0.1:6379> mget key1 key2 key3
1) "hello"
2) "world"
3) "redis"

多次get 和单次mget的区别:

多次get会客户端会和服务器进行多次网络通信

在这里插入图片描述

单次mget客户端和服务器只进行一次网络通信

在这里插入图片描述

使⽤ mget / mset 由于可以有效地减少了⽹络时间,所以性能相较更⾼。假设⽹络耗时 1 毫秒,命令执⾏时间耗时 0.1 毫秒,则执⾏时间如表 所⽰

1000 次 get 和 1 次 mget 对⽐

操作时间
1000 次 get1000 x 1 + 1000 x 0.1 = 1100 毫秒
1 次 mget 1000 个键1 x 1 + 1000 x 0.1 = 101 毫秒

学会使⽤批量操作,可以有效提⾼业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是⽆节制的,否则可能造成单⼀命令执⾏时间过⻓,导致 Redis 阻塞

2.5 SETNX

设置 key-value 但只允许在 key 之前不存在的情况下

语法:

SETNX key value

返回值:1 表⽰设置成功。0 表⽰没有设置

使用方法:

127.0.0.1:6379> setnx key 'hello'
(integer) 1
127.0.0.1:6379> setnx key 'nihao'
(integer) 0
127.0.0.1:6379> get key
"hello"

SET、SET NX 和 SET XX 的执⾏流程如图 :
在这里插入图片描述

2.6 INCR

将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错

语法:

INCR key

返回值:integer 类型的加完后的数值

使用方法:

//key 不存在,0 + 1 = 1
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incr key
(integer) 1//整数类型,可以直接加1
127.0.0.1:6379> set key '20'
OK
127.0.0.1:6379> incr key
(integer) 21//超出了整数类型,报错
127.0.0.1:6379> set key '234293482390480948029348230948'
OK
127.0.0.1:6379> incr key
(error) ERR value is not an integer or out of range//不是整数类型,报错
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> incr key
(error) ERR value is not an integer or out of range

2.7 INCRBY

将 key 对应的 string 表⽰的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错

语法:

INCRBY key decrement

返回值:integer 类型的加完后的数值

使用方法:

//key 不存在,0 + 1 = 1
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incrby key 3
(integer) 3//整数类型,可以直接加3
127.0.0.1:6379> set key '10'
OK
127.0.0.1:6379> incrby key 3
(integer) 13//不能使用非整数类型来加,报错
127.0.0.1:6379> incrby key 'not a number'
(error) ERR value is not an integer or out of range//所加以后的值超出整数类型,报错
127.0.0.1:6379> incrby key '234293482390480948029348230948'
(error) ERR value is not an integer or out of range//不能对非整数类型相加
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> incrby key 3
(error) ERR value is not an integer or out of range

2.8 DECR

将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错

语法:

DECR key

返回值:integer 类型的减完后的数值

使用方法:

//对整数相减
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decr key
(integer) -1
127.0.0.1:6379> set key '10'
OK
127.0.0.1:6379> decr key
(integer) 9//超出整数范围,报错
127.0.0.1:6379> set key '234293482390480948029348230948'
OK
127.0.0.1:6379> decr key
(error) ERR value is not an integer or out of range//不是整数类型,报错
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> decr key
(error) ERR value is not an integer or out of range

2.9 DECRBY

将 key 对应的 string 表⽰的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

语法:

DECRBY key decrement

返回值:integer 类型的减完后的数值

使用方法:

//对整数类型直接相减
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decrby key 3
(integer) -3
127.0.0.1:6379> set key '10'
OK
127.0.0.1:6379> decrby key 3
(integer) 7//不能使用非整数类型来减
127.0.0.1:6379> decrby key 'not a number'
(error) ERR value is not an integer or out of range//超出了整数类型,报错
127.0.0.1:6379> set key '234293482390480948029348230948'
OK
127.0.0.1:6379> decrby key
(error) ERR wrong number of arguments for 'decrby' command//对非整数类型相减,报错
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> decrby key 3
(error) ERR value is not an integer or out of range

2.10 INCRBYFLOAT

将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数。

语法:

INCRBYFLOAT key increment

返回值:加/减完后的数值

使用方法:

//正数时,相加
127.0.0.1:6379> set key 10.10
OK
127.0.0.1:6379> incrbyfloat key 0.1
"10.2"负数时,相减
127.0.0.1:6379> incrbyfloat key -6
"4.2"
127.0.0.1:6379> set key 6.0e3
OK
127.0.0.1:6379> incrbyfloat key 2.0e3
"8000"

很多存储系统和编程语⾔内部使⽤ CAS 机制实现计数功能,会有⼀定的 CPU 开销,但在 Redis 中完全不存在这个问题,因为 Redis 是单线程架构,任何命令到了 Redis 服务端都要顺序执⾏

2.11 APPEND

语法:

APPEND KEY VALUE

返回值:追加完成之后 string 的⻓度

使用方法:

127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> append key 'hello'
(integer) 5
127.0.0.1:6379> get key
"hello"
127.0.0.1:6379> append key 'world'
(integer) 10
127.0.0.1:6379> get key
"helloworld"

2.12 GETRANGE

返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的⻓度调整成正确的值。

语法:

GETRANGE key start end

返回值:string 类型的⼦串

使用方法:

127.0.0.1:6379> set key 'this is a string'
OK
127.0.0.1:6379> getrange key 0 3
"this"
127.0.0.1:6379> getrange key -3 -1
"ing"
127.0.0.1:6379> getrange key 0 -1
"this is a string"

2.13 SETRANGE

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

语法:

SETRANGE key offset value

返回值:替换后的 string 的⻓度

使用方法:

127.0.0.1:6379> set key 'hello world'
OK
127.0.0.1:6379> setrange key 6 'redis'
(integer) 11
127.0.0.1:6379> get key
"hello redis"//如果key不存在,从零位置开始替换不会报错
127.0.0.1:6379> setrange key1 0 'hello'
(integer) 5
127.0.0.1:6379> get key1
"hello"//key不存在,从0以后的位置开始会报错
127.0.0.1:6379> set range key2 3 'hello'
(error) ERR syntax error

2.14 STRLEN

获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错

语法:

STRLEN key

返回值:string 的⻓度。或者当 key 不存在时,返回 0

使用方法:

127.0.0.1:6379> set key 'hello world'
OK
127.0.0.1:6379> strlen key
(integer) 11
127.0.0.1:6379> strlen nonexisting
(integer) 0

三、string类型的命令小结

命令执⾏效果时间复杂度
set key value [key value…]设置 key 的值是 valueO(k), k 是键个数
get key获取 key 的值O(1)
del key [key …]删除指定的 keyO(k), k 是键个数
mset key value [key value …]批量设置指定的 key 和 valueO(k), k 是键个数
mget key [key …]批量获取 key 的值O(k), k 是键个数
incr key指定的 key 的值 +1O(1)
decr key指定的 key 的值 -1O(1)
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +nO(1)
append key value指定的 key 的值追加 valueO(1)
strlen key获取指定 key 的值的⻓度O(1)
setrange key offset value覆盖指定 key 的从 offset 开始的部分值O(n),n 是字符串⻓度, 通常视为 O(1)
getrange key start end获取指定 key 的从 start 到 end 的部分值O(n),n 是字符串⻓度, 通常视为 O(1)

四、string类型的内部编码

字符串类型的内部编码有 3 种:

  1. int:8 个字节的⻓整型。

  2. embstr:⼩于等于 39 个字节的字符串

  3. raw:⼤于 39 个字节的字符串

Redis 会根据当前值的类型和⻓度动态决定使⽤哪种内部编码实现

整型类型⽰例如下:

127.0.0.1:6379> set key 6379
OK
127.0.0.1:6379> object encoding key
"int"

短字符串⽰例如下:

//⼩于等于 39 个字节的字符串
127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> object encoding key
"embstr"

⻓字符串⽰例如下:

//⼤于 39 个字节的字符串
127.0.0.1:6379> set key "one string greater than 39 bytes ........"
OK
127.0.0.1:6379> object encoding key
"raw"

五、string类型的典型使用场景

缓存(Cache)功能

  • 下图 是⽐较典型的缓存使⽤场景,其中 Redis 作为缓冲层,MySQL 作为存储层,绝⼤部分请求的数据都是从 Redis 中获取。由于 Redis 具有⽀撑⾼并发的特性,所以缓存通常能起到加速读写和降低后端压⼒的作⽤

计数(Counter)功能

  • 许多应⽤都会使⽤ Redis 作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。例如视频⽹站的视频播放次数可以使⽤ Redis 来完成:⽤⼾每播放⼀次视频,相应的视频播放数就会⾃增 1

共享会话(Session)

  • ⼀个分布式 Web 服务将⽤⼾的 Session 信息(例如⽤⼾登录信息)保存在各⾃的服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将⽤⼾的访问请求均衡到不同的服务器上,并且通常⽆法保证⽤⼾每次请求都会被均衡到同⼀台服务器上,这样当⽤⼾刷新⼀次访问是可能会发现需要重新登录,这个问题是⽤⼾⽆法容忍的

⼿机验证码

  • 很多应⽤出于安全考虑,会在每次进⾏登录时,让⽤⼾输⼊⼿机号并且配合给⼿机发送验证码,然后让⽤⼾再次输⼊收到的验证码并进⾏验证,从⽽确定是否是⽤⼾本⼈。为了短信接⼝不会频繁访问,会限制⽤⼾每分钟获取验证码的频率,例如⼀分钟不能超过 5 次

以上介绍了使⽤ Redis 的字符串数据类型可以使⽤的⼏个场景,但其适⽤场景远不⽌于此 。

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

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

相关文章

跨平台应用开发框架(1)----Qt(组件篇)

目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…

Element UI 打包探索【2】

目录 第三个命令 第四个命令 第五个命令 第六个命令 第七个命令 cross-env BABEL_ENV babel 第八个命令 总结 书📚接上文Element UI 打包探索【1】我们继续来看 第三个命令 "lint": "eslint src/**/* test/**/* packages/**/* build/**/* …

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

目录 JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码) 一、为什么要使用Array.sort() 二、Array.sort() 的使用与技巧 1、基础语法 2、返回值 3、…

丹摩 | 利用 CogVideoX 生成视频

声明:非广告,纯用户体验 1. CogVideoX CogVideoX 是智谱 AI 推出的一款极具创新性与突破性的视频生成产品。它在技术层面展现出诸多卓越特性,例如其采用的 Diffusion Transformer(DiT)架构奠定了强大的生成能力基础…

SAP开发语言ABAP常见面试问题及答案

一、基础概念问题 什么是SAP ABAP? SAP ABAP(Advanced Business Application Programming)是一种高级企业应用编程语言,用于开发SAP系统中的应用程序。它主要用于定制和扩展SAP的标准功能,以满足企业特定的业务需求。例…

C# 读取多条数据记录导出到 Word标签模板之图片输出改造

目录 应用需求 设计 范例运行环境 配置Office DCOM 实现代码 组件库引入 ​核心代码 调用示例 小结 应用需求 在我的文章《C# 读取多条数据记录导出到 Word 标签模板》里,讲述读取多条数据记录结合 WORD 标签模板输出文件的功能,原有输出图片的…

『 Linux 』网络层 - IP协议 (二)

文章目录 路由NAT技术分片与组装分片的组装IP协议分片的短板 路由 通常情况路由器具备了一个非常重要的功能,即构建子网; 同时路由器需要实现跨网络通信,说明路由器必须存在两个或以上的IP地址,通常在路由器中可以看到几个接口,分别是一个WAN口和几个LAN口; WAN口IP被称为公网I…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域,行人检测是一个重要的研究方向,它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先,我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

javaEE初阶——多线程(1)

文章目录 一些背景知识操作系统(OS)(计算机的大管家)操作系统的基本概念:市面上常见的操作操作系统: 关于前端与后端的介绍:(针对服务的体系架构)计算机是如何工作的&…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial(单独导入),或者直接安装 三、对应设置 其他的操作与之前的版本相同…

学习threejs,使用设置normalMap法向量贴图创建更加细致的凹凸和褶皱

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshPhongMaterial高…

Python办公自动化案例:将演示文稿批量导出为图片和PDF文件

案例:将演示文稿批量导出为图片和PDF文件 准备资料:准备好PPT,并起好名称,放在同一目录下。 批量的将ppt,pptx转换为pdf和图片,代码如下: import comtypes.client import osdef init_powerpoint():powerp

数据结构 ——— 直接选择排序算法的实现

目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现(默认升序) 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…

linux从0到1——shell编程9

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 httpd进程标签(/usr/share/nginx/html &#…

前端:JavaScript (学习笔记)【2】

目录 一,数组的使用 1,数组的创建 [ ] 2,数组的元素和长度 3,数组的遍历方式 4,数组的常用方法 二,JavaScript中的对象 1,常用对象 (1)String和java中的Stri…

QML学习 —— 28、3种等待指示控件(附源码)

效果如下 说明 BusyIndicator应用于指示在加载内容或UI被阻止等待资源可用时的活动。BusyIndicator类似于一个不确定的ProgressBar。两者都可以用来指示背景活动。主要区别在于视觉效果,ProgressBar还可以显示具体的进度(当可以确定时)。由于视觉差异,繁忙指示器和不确定的…

Java 基于SpringBoot+Vue的家政服务管理平台

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

DataGear 5.2.0 发布,数据可视化分析平台

DataGear 企业版 1.3.0 已发布,欢迎体验! http://datagear.tech/pro/ DataGear 5.2.0 发布,图表插件支持定义依赖库、严重 BUG 修复、功能改进、安全增强,具体更新内容如下: 重构:各模块管理功能访问路径…

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境(multi-fidelity setting)下,利用图神经网络(GNNs&…