【Redis】String字符串

目录

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.rhkb.cn/news/393277.html

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

相关文章

类和对象(下)C++

1.初始化列表 1.为什么有初始化列表,它的作用? ->初始化列表,是构造函数初始化的另一种形式。 ->在语法上面理解,初始化列表可以认定为是每个成员变量定义初始化的地方. ->引用成员变量,const成员变量&am…

Qt实现简易CAD软件的开发:技术解析与实现

文章目录 简易CAD软件的开发:技术解析与实现引言项目概述程序入口主窗口的实现主窗口类定义(mainwindow.h)主窗口类实现(mainwindow.cpp) 自定义绘图视图自定义绘图视图类定义(myqgraphicsview.h&#xff0…

亚信安全获国家信息安全服务(风险评估和安全工程类)二级资质

近日,亚信安全荣获由中国信息安全测评中心颁发的《国家信息安全测评信息安全服务资质证书—风险评估二级》和《国家信息安全测评信息安全服务资质证书—安全工程类二级》资质。亚信安全凭借综合实力和优秀的技术能力,成为为数不多的获得国家信息安全服务…

嵌入式C编程常用的异常错误处理

嵌入式C编程中,异常错误处理是确保系统稳定性和可靠性的重要部分。以下是一些常见的异常错误处理方法及其详细说明和示例: 1. 断言 (Assertions) 断言用于在开发阶段捕获程序中的逻辑错误。通过assert宏,可以在条件不满足时终止程序并输出错…

前端常用的【设计模式】和使用场景

设计原则 最重要的:开放封闭原则 对扩展开放对修改封闭 工厂模式 用一个工厂函数,来创建实例,隐藏 new 如 jQuery 的 $ 函数,React 的 createElement 函数 单例模式 全局唯一的实例(无法生成第二个) 如 Vuex 和 Redux 的 store…

鸿蒙AI功能开发【人脸活体验证控件】 机器学习-场景化视觉服务

人脸活体验证控件 介绍 本示例展示了使用视觉类AI能力中的人脸活体验证能力。 本示例模拟了在应用里,跳转人脸活体验证控件,获取到验证结果并展示出来。 需要使用hiai引擎框架人脸活体验证接口kit.VisionKit.d.ts。 效果预览 使用说明: …

Web性能监测的利器Performance Observer!!

前言 前段时间在研究前端异常监控平台,在思考性能监控时,想到了浏览器自带的观察者以及页面生命周期API 。于是在翻查资料时发现了,Performance ObserverAPI。正好趁着这个机会给大家好好讲讲Performance Observer API Performance Observe…

【python】Scrapy中常见的“Response Not Ready”或“Response Not 200”错误分析及解决

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

吴恩达机器学习笔记

1.机器学习定义: 机器学习就是让机器从大量的数据集中学习,进而得到一个更加符合现实规律的模型,通过对模型的使用使得机器比以往表现的更好 2.监督学习: 从给定的训练数据集中学习出一个函数(模型参数)…

【Jenkins未授权访问漏洞 】

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。 第一步:使用fofa语句搜索 搜索语句: port&…

【八股文】Redis

1.Redis有哪些数据类型 常用的数据类型,String,List,Set,Hash和ZSet(有序) String:Session,Token,序列化后的对象存储,BitMap也是用的String类型,…

CCRC-CISAW信息安全保障人员证书含金量

在数字化时代背景下,CISAW认证受到越来越多个人的青睐。 特别是在互联网技术高速发展的今天,随着5G技术的广泛应用,市场对CISAW专业人才的需求急剧增加。 这种职业不仅地位显著,而且职业生涯相对较长。 目前市场上,…

【leetcode详解】覆盖所有点的最少矩形数目(C++思路详解)

思路详解: 0. 题目情境并未限制矩形高度,故矩形数目的判断只和点的横坐标有关 1. 为了不重不漏地考虑到所有点,故笔者选择首先将二维数组中的点按横坐标的大小排序 //说明:本来笔者以为需要自定义sort排序,后来发现…

《嵌入式 - 嵌入式大杂烩》ARM Cortex-M寄存器详解

1 ARM Cortex-M寄存器概述 ARM Cortex-M提供了 16 个 32 位的通用寄存器(R0 - R15),如下图所示。前15个(R0 - R14)可以用作通用的数据存储,R15 是程序计数器 PC,用来保存将要执行的指令。除了通用寄存器,还有一些特殊功能寄存器。特殊功能寄存器有预定义的功能,而且必须通…

GPU 片上调度系统

这篇文章分析和说明GPU 片上的kernel 通过stream 作为载体是如何分发到SM 处理器上,同时CUDA 所抽象的grid/block/thread 在GPU 设备层面是如何调度的。调度器通常是被忽略的一个部分,但对CUDA kernel 的编写和后期系统性能分析很有帮助,也可…

将 Tcpdump 输出内容重定向到 Wireshark

在 Linux 系统中使用 Tcpdump 抓包后分析数据包不是很方便。 通常 Wireshark 比 tcpdump 更容易分析应用层协议。 一般的做法是在远程主机上先使用 tcpdump 抓取数据并写入文件,然后再将文件拷贝到本地工作站上用 Wireshark 分析。 还有一种更高效的方法&#xf…

【HarmonyOS】鸿蒙应用实现截屏

【HarmonyOS】鸿蒙应用实现截屏 组件截屏 通过componentSnapshot的get函数,将需要截图的组件设置id传进去即可。 import { componentSnapshot } from kit.ArkUI; import { image } from kit.ImageKit;/*** 截图*/ Entry Component Preview struct SnapShotPage {S…

sheng的学习笔记-AI-层次聚类

AI目录:sheng的学习笔记-AI目录-CSDN博客 需要学习的前置知识:聚类,可参考:sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 什么是层次聚类 层次聚类(hierarchical clustering)试图在不同层次对数据集进行划分,从而形…

【Python系列】使用 `isinstance()` 替代 `type()` 函数

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

国产版Sora复现——智谱AI开源CogVideoX-2b 本地部署复现实践教程

目录 一、CogVideoX简介二、CogVideoX部署实践流程2.1、创建丹摩实例2.2、配置环境和依赖2.3、上传模型与配置文件2.4、开始运行 最后 一、CogVideoX简介 智谱AI在8月6日宣布了一个令人兴奋的消息:他们将开源视频生成模型CogVideoX。目前,其提示词上限为…