【Redis】string 字符串

文章目录

  • string 字符串
  • 常用命令
    • 设置和获取
      • set
      • get
      • mget & mset
    • 计数操作
      • incr & incrby
      • decr & decrby
      • incrbyfloat
    • 字符串操作
      • append
      • strlen
      • getrange
      • setrange
  • 应用场景

在这里插入图片描述

string 字符串

关于 Redis 的字符串,有几点需要注意

  1. Redis 所有的 key 的类型都是字符串类型
  2. value 的多种数据结构也都是在字符串的基础上构建的,例如列表和集合的元素类型都是字符串类型
  3. 字符串类型的值,可以是字符串,包括一般格式的字符串、JSON、XML格式的字符串;数字,可以是整数、浮点型;也可以是二进制数据流,例如图片、音频、视频
  4. 一个字符串的最大长度不能超过 512MB
  5. Redis 内部存储字符串完全是按照二进制流的形式保存,所以不处理编码问题,客户端传入什么字符集编码,就存储什么

在这里插入图片描述

常用命令

设置和获取

set

将 string 类型的 value 设置到 key 中。如果 key 存在,则覆盖,无论原来的类型是什么。如果之前有设置 TTL(过期时间),也会失效

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

[ ] 中为可选选项

  • EX seconds:使用秒为单位设置 key 的过期时间
  • PX milliseconds:使用毫秒为单位设置 key 的过期时间
  • NX:key 不存在时才进行设置
  • XX:key 存在时才进行设置

如果设置成功,返回 OK;如果由于选项 NX 或 XX 条件不满足,set 不会执行,并返回(nil)

Redis 也支持上述选项和 set 的合并,如 SETEX、PSETEX、SETNX、SETXX

示例:

127.0.0.1:6379> set key1 111 ex 10
OK
127.0.0.1:6379> ttl key1
(integer) 7
127.0.0.1:6379> ttl key1
(integer) 5
127.0.0.1:6379> set key2 hello nx
OK
127.0.0.1:6379> set key2 111 nx
(nil)
127.0.0.1:6379> set key2 111 xx
OK
127.0.0.1:6379> get key2
"111"
127.0.0.1:6379> setnx key3 hi
(integer) 1
127.0.0.1:6379> psetex key4 1000000 hello
OK
127.0.0.1:6379> pttl key4
(integer) 997750

set、setxx、setnx 执行流程如下:

在这里插入图片描述

get

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

get key

mget & mset

mget

一次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil
如果 mget 多个 key,其中有不存在的,不会报错,而是返回 nil

mget key [key…]

示例:

127.0.0.1:6379> keys *
1) "key2"
2) "key3"
3) "key4"
127.0.0.1:6379> mget key2 key1 key4
1) "111"
2) (nil)
3) "hello"

mset

一次性设置多个 key

mset key value [key value…]

只要 key value 没问题,则返回都是 OK

示例:

127.0.0.1:6379> mset key1 111 key2
(error) ERR wrong number of arguments for MSET
127.0.0.1:6379> mset key1 111 key2 hello
OK

因为 Redis 是客户端服务器架构,需要进行网络通信,多个 get/set 命令意味着多次网络通信,而 mget/mset 可以将多次 get/set 合并,减少网络通信,性能会更好

PS:但同时也要注意,Redis 执行命令是单线程,不宜单条命令太多复杂,如果 mget/mset 执行过久,会导致其他业务阻塞,无法与 Redis 交互

在这里插入图片描述

计数操作

incr & incrby

incr

将 key 对应的 string 表示的数字加一
如果 key 不存在,则先设置 key 对应的 value 为0,再加一
如果 key 对应的 string 不是一个整数或者范围超过 64 位有符号整型,则报错

incr key

127.0.0.1:6379> set key1 111
OK
127.0.0.1:6379> incr key1
(integer) 112
127.0.0.1:6379> incr key2
(integer) 1

incrby

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

incrby key decrement

127.0.0.1:6379> get key1
"112"
127.0.0.1:6379> incrby key1 100
(integer) 212

decr & decrby

decr

用法同 incr 和 incrby,效果是减去
如果不存在 key,则视为 key 对应的 value 为 0
如果 key 对应的 string 不是整型或者范围超过64位有符号整数,则报错

decr key

127.0.0.1:6379> get key1
"212"
127.0.0.1:6379> decr key1
(integer) 211

decrby

decrby key decrement

127.0.0.1:6379> get key1
"211"
127.0.0.1:6379> decrby key1 100
(integer) 111

incrbyfloat

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

incrbyfloat key

示例:

127.0.0.1:6379> set float1 10.50
OK
127.0.0.1:6379> incrbyfloat float1 0.1
"10.6"
127.0.0.1:6379> incrbyfloat float1 -5.0
"5.6"
127.0.0.1:6379> set float2 6.0e3
OK
127.0.0.1:6379> get float2
"6.0e3"
127.0.0.1:6379> incrbyfloat float2 3.0e2
"6300"

PS:很多存储系统和编程语言内部使用 CAS 机制实现计数功能,有一定的 CPU 开销,但因为 Redis 是单线程架构,任何命令在 Redis 服务端都要顺序执行,所以不存在上述开销

字符串操作

append

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

append key value

返回值:追加后 string 的长度,单位是字节

示例:

127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> append key1 world
10
127.0.0.1:6379> get key1
helloworld127.0.0.1:6379> append key2 你好
6
127.0.0.1:6379> append key2 hello
11
127.0.0.1:6379> get key2
你好hello

PS:因为 Redis 存储是不对字符串进行处理的,存入什么编码就是什么编码,此处是在 Xshell 操作客户端,使用的是 UTF-8 编码,汉字占三个字节,所以 “你好” 占 6 个字节

另外,使用 redis-cli 启动客户端,get 是读取字节,对于汉字是不会进行翻译的

127.0.0.1:6379> get key2
"\xe4\xbd\xa0\xe5\xa5\xbdhello"

可以添加参数 redis-cli --raw 启动客户端,get 获取到汉字时就会尝试进行翻译

strlen

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

strlen key

返回值:string 的长度,单位是字节;当 key 不存在时,返回 0

示例:

127.0.0.1:6379> set key1 "hello world"
OK
127.0.0.1:6379> strlen key1
(integer) 11
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> strlen key2
(integer) 0

getrange

返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭),单位为字节。可以使用负数表示倒数,-1 表示倒数第一个字节,-2 表示倒数第二个,以此类推。超过范围的偏移量会根据 string 的长度调整为正确的值

getrange key start end

返回值:获取到的 string 的子串。如果 key 不存在,返回空串

示例:

127.0.0.1:6379> get key1
hello world
127.0.0.1:6379> get key2
你好
127.0.0.1:6379> getrange key1 0 -1
hello world
127.0.0.1:6379> getrange key1 1 -2
ello worl
127.0.0.1:6379> getrange key2 0 -1
你好
127.0.0.1:6379> getrange key2 1 -2
½ 
127.0.0.1:6379> getrange key3 0 4

因为使用 XShell,编码格式为 UTF-8,汉字占3个字节,getrange 获取 “你好” 的第 1 字节到 第 4 字节,会出现乱码问题

setrange

覆盖字符串的一部分,从指定的偏移量开始,覆盖的范围根据 value 指定

setrange key offset value

返回值:替换后的 string 的长度,单位字节

示例:

127.0.0.1:6379> get key1
"hello world"
127.0.0.1:6379> setrange key1 1 aaa
(integer)11
127.0.0.1:6379> get key1
"haaao world"127.0.0.1:6379> setrange key1 3 aaaaaaaaaaaaaaa
(integer)18
127.0.0.1:6379> get key1
"haaaaaaaaaaaaaaaaa"127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> setrange key3 1 aaa
(integer) 4
127.0.0.1:6379> get key3
"\x00aaa"

PS:当 key 不存在时,效果相当于 set,如果此时偏移量不为0,则前面用 0x00 填充

应用场景

1. 缓存

Redis 的一大功能就是作为缓冲层,MySQL 作为存储层
先尝试从 Redis 中获取数据,数据不存在时,再去 MySQL 中获取数据,返回时缓存在 Redis 中,因为局部性原则,该数据一段时间内还可能会被再次访问,可视为热点数据

在这里插入图片描述

Redis 没有表、字段这种命名空间,也没有对键名有强制要求,但设计合理的键名,有利于防止键冲突和项目的可维护性
比较推荐的方式是使用 业务名:对象名:唯一标识:属性 作为键名,例如 MySQL 的数据库叫 csdn,用户表名为 user_info,那么对应的键可以为 csdn:user_info:1234csdn:user_info:1234:name
PS:因为 Redis 是客户端服务器架构,使用网络通信,所以当键名过长时,会增大网络开销,可以使用团队内部都认同的缩写减小带宽,例如 user:1234:friends:message:6666 替换为 u:1234:fr:m:6666

2. 计数

许多应用都会使用 Redis 作为计数的基础工具,因为其自身就支持快速计数的功能,同时查询缓存速度快,还可以异步处理或者将数据落地到其他数据仓库(通常用于数据分析)
例如,视频网站的视频播放次数,点赞数

在这里插入图片描述
3. 手机验证码

平时在用手机号登录账号的时候,都会通过验证码的形式。
此处有两种需求:

  1. 验证码的有效时间
  2. 一分钟内不能多次获取验证码

Redis 都可以很简单的满足上述需求,通过 过期时间 实现验证码的有效时间;通过 increx 实现不允许多次获取验证码

以下是 一分钟不能超过5次获取验证码的伪代码

std::string 发送验证码(phoneNumber) {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为 1 分钟(60 秒)// 使⽤ NX,只在不存在 key 时才能设置成功bool r = Redis 执⾏命令:set key 1 ex 60 nxif (r == false) {// 说明之前设置过该⼿机的验证码了long c = Redis 执⾏命令:incr keyif (c > 5) {// 说明超过了⼀分钟 5 次的限制了// 限制发送return null;}}// 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次std::string validationCode = ⽣成随机的 6 位数的验证码();validationKey = "validation:" + phoneNumber;// 验证码 5 分钟(300 秒)内有效Redis 执⾏命令:set validationKey validationCode ex 300;// 返回验证码,随后通过⼿机短信发送给⽤⼾return validationCode ;
}
// 验证⽤⼾输⼊的验证码是否正确
bool 验证验证码(phoneNumber, validationCode) {validationKey = "validation:" + phoneNumber;std::string value = Redis 执⾏命令:get validationKey;if (value == null) {// 说明没有这个⼿机的验证码记录,验证失败return false;}if (value == validationCode) {return true;} else {return false;}
}

以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

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

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

相关文章

本地部署firecrawl的两种方式,自托管和源码部署

网上资料很多 AI爬虫黑科技 firecrawl本地部署-CSDN博客 源码部署 前提条件本地安装py,node.js环境,嫌弃麻烦直接使用第二种 使用git或下载压缩包 git clone https://github.com/mendableai/firecrawl.git 设置环境参数 cd /firecrawl/apps/api 复制环境参数 …

(三)毛子整洁架构(Infrastructure层/DapperHelper/乐观锁)

文章目录 项目地址一、Infrastructure Layer1.1 创建Application层需要的服务1. Clock服务2. Email 服务3. 注册服务 1.2 数据库服务1. 表配置Configurations2. Respository实现3. 数据库链接Factory实现4. Dapper的DataOnly服务实现5. 所有数据库服务注册 1.3 基于RowVersion的…

uni-app微信小程序登录流程详解

文章目录 uni-app微信小程序登录流程实战详解微信小程序登录流程概述1. 获取登录凭证(code)2. 发送登录请求3. 保存登录态4. 登录状态管理5. 应用登录状态请求拦截器中添加 token自动登录页面路由守卫 使用 Vuex 集中管理登录状态登录组件示例登录流程最…

GUC并发编程和SpringCloud,二者之间的关系

一.提问 我认为,Java开发中,如果项目的每一个小模块需要不同人员并行开发时,就需要使用SpringCloud;如果要解决系统用户激增,就是用GUC并发编程。 这个说法对么? 二.解答 你的理解部分正确,但不…

在 Vue 3 中使用 canvas-confetti 插件

🎉 在 Vue 3 中使用 canvas-confetti 插件 canvas-confetti 是一个轻量、无依赖的 JavaScript 动画库,用于在网页上展示彩带、庆祝动画。非常适合用于抽奖、支付成功、活动庆祝等场景。 本教程将指导你如何在 Vue 3 项目中集成并使用该插件。 &#x1…

深入解析Spring Boot项目目录结构:从新手到规范实践

一、标准项目结构全景图 典型的Spring Boot项目(Maven构建)目录结构如下: my-spring-project/ ├── src/ │ ├── main/ │ │ ├── java/ # 核心代码 │ │ │ └── com/ │ │ │ └── exa…

【C语言】宏经典练习题,交换奇偶位

交换奇偶位 写一个宏&#xff0c;可以将一个整数的二进制位的奇数位和偶数位交换。 #define Swap(x) x(((x&0x55555555)<<1)((x&0xaaaaaaaa)>>1)) int main() {int a 10;Swap(a);printf("%d\n", a);return 0; } 写宏的思路&#xff1a; 假设…

VSCode-插件:codegeex:ai coding assistant / 清华智普 AI 插件

一、官网 https://codegeex.cn/ 二、vscode 安装插件 点击安装即可&#xff0c;无需复杂操作&#xff0c;国内软件&#xff0c;无需科学上网&#xff0c;非常友好 三、智能注释 输入 // 或者 空格---后边自动出现注释信息&#xff0c;&#xff0c;按下 Tab 键&#xff0c;进…

FFmpeg 与 C++ 构建音视频处理全链路实战(三)—— FFmpeg 内存模型

经过前面文章的 FFmpeg 编程实践&#xff0c;相信你已经对AVPacket和AVFrame这两个核心结构体不再陌生。当我们编写代码时&#xff0c;频繁调用unref系列 API 释放内存的操作&#xff0c;或许让你心生疑惑&#xff1a;这些函数究竟是如何实现内存释放的&#xff1f;又该在何时准…

c 中的哈希表

哈希是一种可以接受各种类型、大小的输入&#xff0c;输出一个固定长度整数的过程。你可以将哈希理解成一种特殊的映射&#xff0c;哈希映射&#xff0c;将一个理论无限的集合A映射到有限整数集合B上。 哈希函数&#xff1a;哈希函数是哈希过程的核心&#xff0c;它决定了哈希映…

【一次成功!】Ubuntu22.04安装cartographer

之前在ubuntu20.04上成功安装cartographer&#xff0c;但是翻遍全网都没找到官方的22.04安装教程&#xff0c;然后找到小鱼的&#xff0c;试了一下&#xff0c;一次成功&#xff0c;连接如下&#xff1a; gd2l-ros2/docs/humble/chapt10/get_started/2.Carto介绍及安装.md at …

【WPF】Opacity 属性的使用

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Opacity 属性是定义一个元素透明度的属性&#xff0c;其值范围是从 0.0&#xff08;完全透明&#xff09;到 1.0&#xff08;完全不透明&#xff09;。由于 Opacity 是在 UIElement 类中定义的&…

8天Python从入门到精通【itheima】-6~10

目录 7节-开发出第一个Python程序: 1.在cmd窗口写下第一个最简单的程序:Hello World!!! 9节: 1.如何卸载python: 2.报错:不是可运行的程序 ​编辑 3.报错:无法初始化设备PRN: 4.报错:语法错误——非法的字符 10节-python解释器: 1.python解释器的原理: 2.解…

Mac 3大好用的复制粘贴管理工具对比

剪贴板管理器是查看复制粘贴历史记录的工具&#xff0c;几乎是每个苹果电脑用户必备工具。市面上的工具很多&#xff0c;我结合了功能丰富、设计简洁、交互便利整理了目前3款头部剪贴板应用 Paste、PasteNow、PasteMe。 Paste 优势&#xff1a;老牌剪切板应用&#xff0c;功能…

2025年全国青少年信息素养大赛初赛模拟测试网站崩了的原因及应对比赛流程

2025年全国青少年信息素养大赛初赛模拟测试昨天开始&#xff0c;由于同一时间涌入太多的人&#xff0c;导致网站的服务器奔了&#xff0c;出现了各种状况&#xff0c;导致很多人没有模拟上&#xff0c;大家今天可以刷新或者提前打开网页。 有的是一直“转圈圈”&#xff0c;有的…

02 | 大模型微调 | 从0学习到实战微调 | 从数学概率到千亿参数大模型

一、导读 作为非AI专业技术开发者&#xff08;我是小小爬虫开发工程师&#x1f60b;&#xff09; 本系列文章将围绕《大模型微调》进行学习&#xff08;也是我个人学习的笔记&#xff0c;所以会持续更新&#xff09;&#xff0c;最后以上手实操模型微调的目的。 &#xff08;…

十四、继承与组合(Inheritance Composition)

十四、继承与组合&#xff08;Inheritance & Composition&#xff09; 引言 C最引人注目的特性之一是代码复用。组合&#xff1a;在新类中创建已有类的对象。继承&#xff1a;将新类作为已有类的一个类型来创建。 14.1 组合的语法 Useful.h //C14:Useful.h #ifndef US…

2025年5月-信息系统项目管理师高级-软考高项一般计算题

决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时&#xff0c;npv越大越好

OpenJDK 17 中线程启动的完整流程用C++ 源码详解

1. 线程创建入口&#xff08;JNI 层&#xff09; 当 Java 层调用 Thread.start() 时&#xff0c;JVM 通过 JNI 进入 JVM_StartThread 函数&#xff1a; JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))// 1. 检查线程状态&#xff0c;防止重复启动if (java_…

Spring MVC参数传递

本内容采用最新SpringBoot3框架版本,视频观看地址:B站视频播放 1. Postman基础 Postman是一个接口测试工具,Postman相当于一个客户端,可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果。 2. Spring MVC相关注解 3. Spring MVC参数传递 Spri…