【Redis】String字符串

news2024/11/25 16:48:16

目录

String字符串

常见命令

SET

GET

MSET

MGET 

SETNX

计数命令

INCR

INCRBY

DECY

DECYBY

INCRBYFLOAT

其他命令

APPEND

GETRANGE

SETRANGE

STRLEN

内部编码

String类型的典型使用场景

缓存(Cache)功能 

计数功能

共享会话(Session)


String字符串

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

  1. ⾸先 Redis 中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。
  2. 其次,字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过 512 MB。

常见命令

SET

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

语法:

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

时间复杂度:O(1)

选项:SET命令支持多种选项来影响它的行为

  • EX seconds ⸺ 使⽤秒作为单位设置 key 的过期时间。
  • PX milliseconds⸺ 使⽤毫秒作为单位设置 key 的过期时间。
  • NX ⸺ 只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏。
  • XX ⸺ 只在 key 存在时才进⾏设置(相当于更新key),即如果 key 之前不存在,设置不执行。

注意:由于带选项的 SET 命令可以被 SETNX 、 SETEX 、 PSETEX 等命令代替,所以之后的版本中,Redis 可能进⾏合并。

返回值

  • 如果设置成功,返回 OK。
  • 如果由于 SET 指定了 NX 或者 XX 但条件不满⾜,SET 不会执⾏,并返回 (nil)。

示例:

GET

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

语法:

GET key

时间复杂度:O(1)
返回值:key 对应的 value,或者 nil 当 key 不存在

MSET

⼀次性设置多个 key 的值。

语法:

MSET key value [key value ...]

时间复杂度:O(N) N 是 key 数量
返回值:永远是 OK

示例:

MGET 

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

MGET key [key ...]

时间复杂度:O(N) N 是 key 数量
返回值:对应 value 的列表

示例:

 多次GET VS 单次MGET

如图所示,使⽤ mget / mset 由于可以有效地减少了⽹络时间,所以性能相较更⾼。学会使⽤批量操作,可以有效提⾼业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是⽆节制的,否则可能造成单⼀命令执⾏时间过⻓,导致 Redis 阻塞。

SETNX

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

时间复杂度:O(1)
返回值:1 表⽰设置成功。0 表⽰没有设置。

示例:

说明:SETXX和SETEX的使用刚好相反,当key存在时进行更新value;不存在时放回nil;


计数命令

INCR

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

语法:

INCR key

时间复杂度:O(1)
返回值:integer 类型的加完后的数值。
⽰例:

INCRBY

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

语法:

INCRBY key decrement

时间复杂度:O(1)
返回值:integer 类型的加完后的数值。
⽰例:

DECY

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

 DECR key

时间复杂度:O(1)
返回值:integer 类型的减完后的数值。

DECYBY

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

DECRBY key decrement

时间复杂度:O(1)
返回值:integer 类型的减完后的数值。

INCRBYFLOAT

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

时间复杂度:O(1)
返回值:加/减完后的数值。

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


其他命令

APPEND

如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。

语法:

APPEND KEY VALUE

时间复杂度:O(1). 追加的字符串⼀般⻓度较短, 可以视为 O(1).
返回值:追加完成之后 string 的⻓度。

示例:

GETRANGE

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

语法:

GETRANGE key start end

时间复杂度:O(N). N 为 [start, end] 区间的⻓度. 由于 string 通常⽐较短, 可以视为是 O(1)

返回值:string 类型的⼦串

⽰例:

SETRANGE

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

SETRANGE key offset value

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

STRLEN

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

STRLEN key

时间复杂度:O(1)
返回值:string 的⻓度。或者当 key 不存在时,返回 0。

示例:

内部编码

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

  • int:8 个字节的⻓整型。
  • embstr:⼩于等于 39 个字节的字符串。
  • raw:⼤于 39 个字节的字符串。

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

整形类型示例如下:

短字符串示例如下:

长字符串示例如下:


String类型的典型使用场景

缓存(Cache)功能 

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

Redis和MySQL组成的缓存架构存储

整体思路:

应用服务器访问数据的时候,先查询Redis如果Redis上数据库存在了,就直接从Redis中取数据交给应用层服务器,不继续访问数据库;如果Redis上数据存在了,在读取数据库把读到的结果返给应用层服务器,然后把这个值写入到Redis中。

计数功能

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

实际中要开发⼀个成熟、稳定的真实计数系统,要⾯临的挑战远不⽌如此简单:防作弊、按
照不同维度计数、避免单点问题、数据持久化到底层数据源等。

共享会话(Session)

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

Session分散存储

为了解决这个问题,可以使⽤ Redis 将⽤⼾的 Session 信息进⾏集中管理,如图所示,在这种模式下,只要保证 Redis 是⾼可⽤和可扩展性的,⽆论用户被均衡到哪台 Web 服务器上,都集中从Redis 中查询、更新 Session 信息。

Redis集中管理Session


今天对Resid中String类型的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!! 

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

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

相关文章

bat批处理文件 —— 用于自动化环境配置和项目执行

文章目录 一、什么是 bat ?1.1、支持 bat 的编辑软件1.2、常用命令 三、项目实战3.1、入门案例3.2、(自动化)环境配置与python库安装3.3、将 bat 当成一个简易的 .exe 可执行文件 四、标识符详解4.1、rem:添加注释4.2、echo off&a…

网工内推 | 上市公司IT工程师,最高15薪,周末双休

01 上海索辰信息科技股份有限公司 🔷招聘岗位:IT工程师 🔷岗位职责: 1、熟悉代码研发类企业的内部信息化管理,参与公司自主开发系统的规划和建设,搭建高级别内部信息安全体系,对内部信息的安全…

【practise】删除有序数组中的重复项

关于博主: 今天分享一道简单的关于“双指针”算法的题目。算是双指针中非常基础的题目,有兴趣可以借鉴一波~ 目录 1.题目介绍2.题解思路:双指针法3.代码示例 1.题目介绍 题目链接:LINK 本题要求是:对给定的有序数组…

Android中的沉浸式丝滑转场之共享元素转场动画

文章目录 1. 介绍2. 实现方法3. 举例演示3.1 举例一:普通页面间共享元素转场动画3.2 举例二:列表页面共享元素转场动画 4. 总结 1. 介绍 在Android开发中,经常会有页面转场的动画效果。普通的转场动画不过是左进右出,渐显渐隐&am…

树莓派4B学习笔记24:Python_SYN6288语音模块的控制函数

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Opencv 版本是4.5.1: ​ Python 版本3.7.3: 今日学习SYN6288语…

叛逆,批判

1、对以往说法的批判之一(第一次这么公开批判是2004-2005年): 这部英文版的《数学百科全书》似乎是从俄语版翻译过来的?我查了三本引用的图书文献,都没有关于“nonsingular”和“singular”的类似下面的说法&#xff…

加密市场再遭重创:多重利空因素引发超10亿美元抛售潮

四年前的全球“熔断潮”仿佛还在眼前,如今金融市场再度迎来剧烈震荡,全球股市与加密货币市场遭遇多重利空冲击,尤其是比特币和以太坊的闪崩使得市场恐慌情绪蔓延。这个“黑色星期一”不仅见证了股市的跳水,还标志着加密市场的又一…

每日学习笔记:C++ STL算法之已排序区间算法

目录 查找元素 检查某个元素是否存在: binary_search(beg, end, value) binary_search(beg, end, value, op) 检查数个元素是否存在: includes(beg, end, searchBeg, searchEnd) includes(beg, end, searchBeg, searchEnd, op) ​编辑 查找第一个或最后一…

网安新声 | 微软蓝屏事件安全启示录

网安加社区【网安新声】栏目,汇聚网络安全领域的权威专家与资深学者,紧跟当下热点安全事件、剖析前沿技术动态及政策导向,以专业视野和前瞻洞察,引领行业共同探讨并应对新挑战的策略与可行路径。 2024年7月19日,微软发…

搭建Mysql主从架构

一、主从 1、备份的三种类型 热备份逻辑备份物理备份 二、集群 1、概述 高可用集群(HA)是指通过特殊软件,把独立的服务器连接起来,组成一个能够提供故障间切换功能的集群。 2、标准 可用性级别 年宕机时间 描述 99% 3.65天 …

蜂窝网络架构

2G/3G 4G eNB RF-RRU eCPRI RRU-BBU 光纤 5G From 38.300 AMF处理信令等,UPF 用户面,后面还有SMF

Day20 文件IO

feof(FILE*) 用于检测文件是否到达结尾 ferror(FILE*) 检测文件是否发生错误 clearerr(FILE*) 清除错误 一.文件IO的特性 1 没有缓存区 2 操作对象不在是流,而是文件描述符 3…

埃拉托斯特尼筛法,厄拉多塞筛算法,C#实现

埃拉托斯特尼筛法,厄拉多塞筛算法 这个 很多地方的定义不一样。 虽然名字相同,但是具体的定义还是有差距。 有的地方描述的是: 厄拉多塞筛算法(Eratosthenes Sieve)是一种求素数的方法,由古希腊数学家厄拉多塞提出。它的原理是&…

如何下载学术论文、专利(最全)——包含免费方法

经常有同学问,如何下载论文 一、中文论文 万方(在校生一般学校已购买权限,具体可看自己学校图书馆) 网址:https://www.wanfangdata.com.cn/ 2. 知网(在校生一般学校已购买权限,具体可看自己学…

【ML】transform 之 encode 及其实现细节

transform 之 encode 及其实现细节 1. transform (seq2seq) 是什么2. transform (seq2seq) 具体如何实现3. transform (seq2seq) 可以解决哪些类型的问题4. 补充问题4.1 残差连接(Residual Connection)是什么如何实现4.1.2 残差连接的具体实现&#xff1…

一文搞懂后端面试之MySQL MVCC【中间件 | 数据库 | MySQL | 隔离级别 | Read View】

为什么需要MVCC 锁本身就是用于并发控制的,那么为什么InnoDB还要引入MVCC,读写都加锁不就可以控制住并发吗? 锁确实可以,但是性能太差。如果是纯粹的锁,那么写和写、读和写、读和读之间都是互斥的。如果是读写锁&…

C#TreeView控件应用

1、代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace TestApp…

两数之和 II(LeetCode)

题目 给你一个下标从 1 开始的整数数组 ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 的两个数。 如果设这两个数分别是 和 ,则 。 以长度为 的整数数组 形式返回这两个整数的下标 和 。 你可以假设每个输入…

【从零开始一步步学习VSOA开发】并行RPC服务端

并行RPC服务端 概念 之前 RPC 使用方式中的所有回调函数都是串行执行的,VSOA 为 C 语言开发版本提供了并行处理 RPC 请求的功能,开发者可以通过并发 RPC 相关接口创建线程池并行处理 RPC 请求。并发服务模式通过多线程来实现,能有效提高响应…

8.06 C++作业

使用类定义实现隔离储存计算 1.头文件 #ifndef CLASS_H #define CLASS_H #include <iostream> using namespace std;class rect { private:int width;int height; public:void init(int width,int height);void show();void setw(int w);void seth(int h); };#endif //…