Redis:string类型
Redis:string类型
- string命令
- 设置与读取
- SET
- GET
- MSET
- MGET
- 数字操作
- INCR
- INCRBY
- DECR
- DECRBY
- INCRBYFLOAT
- 字符串操作
- APPEND
- STRLEN
- GETRANGE
- SETRANGE
- 内部编码
- int
- embstr
- raw
在Redis中,字符串string存储的是二进制,以byte为单位,输入的二进制是什么,那么存储的就是什么,string不进行编码的转化。
因此string类型可以存储非常多种类的数据,比如ASCII编码字符串,UTF-8编码字符串,int整型,甚至可以存储图片,视频音频等,因为这些都是二进制,怎么存进去的,最后就怎么解析。
当然,一般不会用string存储图片,视频音频,因为它们太大了,内存没那么多空间,只是理论上可行。
string命令
设置与读取
SET
- 设置一个
key
set key value [EX seconds | PX milliseconds] [NX | XX]
由于set默认情况下就是设置一个string,所以没有什么其它的特殊语法,此处介绍两个选项。
EX seconds:以秒为单位,设置超时时间PX milliseconds:以毫秒为单位,设置超时时间NX:如果key不存在才设置,如果存在返回nilXX:如果key存在就更新,如果不存在返回nil
注意:通过XX更新后,原先的过期时间会失效,数据类型也有可能变化
示例:

该指令设置了一个字符串key1,内容为12345,过期时间为10 s,nx表示只有不存在才设置。
示例:

和刚才一样设置一个超时时间10 s的字符串,随后立刻通过xx选项进行更新操作。更新后发现,ttl的返回值变成了-1,这说明原先ex设置的过期时间被覆盖了。
GET
- 获取
key对应的value
get key
和set一样,get的默认数据类型就是string,如果value类型不是string,会发生报错。
MSET
- 一次设置多个
key
mset key value [key value ...]
由于Redis基于网络通信,所以多条指令压缩为一条指令就是把多个网络请求压缩为一个,对效率提升非常明显。所以Redis提供了这样的一次设置多组键值对的指令。
MGET
- 一次获取多个
key的value
mget key [key ...]
示例:

数字操作
由于string内部还可以存储数字,所以Redis还提供了数字操作的命令。
INCR
- 指定整数
+1
incr key
返回值是字符串+1后的结果。
示例:

如图,设置了一个数字后,通过incr对其自增,返回了124,并且get num1的值也自增了。

当设置的数字值过大,此时就不会被解析为数组,而是解析为字符串。此时incr执行失败,检测到num2类型为embstr。string可以存储的最大整型为64位有符号整型,相当于C/C++中的long long。

另外的,incr可以操作一个空值,并且将其视为数字0。此处通过get检测num3不存在,但是incr num3成功执行,结果为1。
INCRBY
- 指定整数,增加指定的值
incrby key increment
key对应的value的值就会增加increment,其余特性和incr相同。
示例:

注意:incrby可以增加一个负数,也就是做减法。但是不能操作浮点数,只能操作整型。
DECR
- 指定整数
-1
decr key
返回值是字符串-1后的结果。
DECRBY
- 指定整数,减少指定的值
decrby key decrement
key对应的value的值就会减少decrement,其余特性和decr相同。
同样的,decrby也可以操作负数,此时相当于增加decrement的绝对值。
INCRBYFLOAT
- 指定浮点数/整数,增加指定的值
incrbyfloat key increment
同样的,返回key的value自增后的值。
示例:

与整型不同,Redis没有提供DECRBYFLOAT指令,也就是说浮点数想要进行减法,只能让increment为负数。
字符串操作
回到string的本职工作,自然是要存储字符串,字符串也要提供相关的操作。
APPEND
- 将
value追加字符串的尾部
append key value
返回追加完成后,字符串的总长度。

如图完成了一个字符串的追加。

同样的,如果原先key不存在,则视为一个空串,直接追加。
STRLEN
- 获取字符串的长度
strlen key
返回字符串的长度,以字节为单位。
如果遇到中文:

此时根据UTF-8编码,一个中文占3 byte,所以两个中文的长度是6。如果再输出这个中文字符串,会得到一个乱码。此处\x是一个转义字符,表示一个十六进制数字。也就是说\xe4整体是一个十六进制的数字,占一个字节。
其实这个十六进制数字,就是汉字的编码,比如\xe4 \xdb \xa0就是汉字"你"。如果想要让Redis支持输出中文,在启动时要加入--raw选项:

这样就可以正常输出中文了,但是要注意,如果key不存在,原本是输出nil,但是会被转化为一个空行。
GETRANGE
- 返回字符串指定范围的字串
getrange key start end
获取的字串是下标范围[start, end]的闭区间,下标从0开始。而且支持使用负数,最后一个字符串的负数编码为-1。
示例:

第一次截取,区间为[0, 5],由于是闭区间,所以有6个字符。
第二次截取,区间为[0, -1],-1就是最后一个字符,又是闭区间,所以输出整个字符串。

如果存储汉字,此时依然以字节解析,而不是以字符为单位。
如果开启了--raw选项:

此时汉字"好"截取了一半,但是不输出,只有"你"被完整拆分下来,才能解析。
SETRANGE
- 修改指定范围内的字符串
setrange key offset value
从下标offset位置开始覆盖,字符串替换为value,返回替换后的字符串长度。
示例:

此处从下标5,也就是字符w开始覆盖,往后三个字符替换为cpp,而ld不变。

如果字符串覆盖后超出原先的长度,此时字符串就会变长。
对于不存在的key:

如果在空的key后面修改字符串,此时offset之前的所有字节自动初始化为\x00,offset之后的内容正常覆盖。
总结:
| 命令 | 执行效果 |
|---|---|
set key value[key value...] | 设置key的值为value |
get key | 获取key的值 |
del key[key...] | 删除指定的key |
mset key value[key value ...] | 批量设置指定的key和value |
mget key[key...] | 批量获取key的值 |
incr key | 指定的整数的值+1 |
decr key | 指定的整数的值-1 |
incrby key n | 指定的整数的值+n |
decrby key n | 指定的整数的值-n |
incrbyfloat key n | 指定的整数/浮点数的值+n |
append key value | 指定的字符串追加value |
strlen key | 获取指定字符串的长度 |
setrange key offset value | 覆盖指定字符串从offset开始的部分值 |
getrange key start end | 获取指定字符串从start到end的部分值 |
内部编码
在 Redis 中,string 数据类型的底层实现有三种编码方式:int、embstr 和 raw。每种编码方式有其特定的使用场景和实现细节,以优化内存使用和性能表现。
int
当一个字符串的值可以被解析为整数(有符号的 64 位整数范围内)时,
Redis会将其存储为整数
int 编码使用 8 byte 来存储整数值。这种方式的优势在于节省存储空间并提高处理速度,因为整数操作比字符串操作更高效。
embstr
用于存储长度小于或等于
39 byte的字符串。
embstr 编码是为了优化小字符串的内存分配和管理而设计的。embstr 的实现将字符串对象的结构和实际字符串数据放在一起,这样在创建时只需要一次内存分配。其包含一个 SDS(Simple Dynamic String)结构,用于管理字符串的长度等信息。
这种方式减少了内存碎片,提高了缓存的局部性,并使得创建和销毁字符串对象的速度更快。
raw
用于存储长度大于
39 byte的字符串。
raw 编码是传统方式,分开存储字符串对象和字符串数据。与 embstr 不同,raw 编码需要两次内存分配:一次用于存储字符串对象的基本信息,比如长度,另一次用于实际的字符串数据。
这种方式允许更灵活的字符串管理,适合处理较大字符串的场景。在需要对字符串进行修改时,raw 编码也能更好地管理内存。
相关文章:
Redis:string类型
Redis:string类型 string命令设置与读取SETGETMSETMGET 数字操作INCRINCRBYDECRDECRBYINCRBYFLOAT 字符串操作APPENDSTRLENGETRANGESETRANGE 内部编码intembstrraw 在Redis中,字符串string存储的是二进制,以byte为单位,输入的二进…...
【C++ STL】手撕vector,深入理解vector的底层
vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…...
【Android】CarWatchDog I/O监控服务
Android Car WatchDog I/O监控服务 背景: 某基于Android 13的车载系统。 某天长时间测试一款3方(非SystemApp)时,该款应用偶发闪退现象。 通过日志分析,发现应用被系统的 Car WatchDog(喂狗服务ÿ…...
如何使用 Django 框架进行用户认证的详细指南,涵盖用户注册和登录功能的实现。
当然!下面是关于如何使用 Django 框架进行用户认证的详细指南,涵盖用户注册和登录功能的实现。 掌握 Django 用户认证的艺术 Django 是一个强大的 Python Web 框架,以其灵活性和高效性著称。无论你是新手还是经验丰富的开发者,理解和实现用户认证都是 Web 开发中的一项核心…...
C++ 语言特性21 - 别名模板
一:概述 别名模板是 C11 引入的,用于为一个模板类型定义别名,从而简化复杂的模板类型定义。它结合了 using 关键字,可以对模板类型进行重新命名,使代码更加简洁和可读。 1. 作用 定义模板类型的别名。简化复杂的模板类…...
Jenkins pipeline配置示例
前提条件:已经安装Jenkins并能正常启动 如果Jenkins安装启动遇到问题可以参考: 1.创建pipeline 点击新建项目: 输入名称,选择pipeline: 进入配置页面,如果要配置GitHub Webhook要勾选:<fo…...
Navicat for MySQL 常见问题
一、 创建连接失败问题 创建连接后,报错:1251 -Client does not support authentication protocal by server;consider upgrading MySQL client 原因:环境冲突 解决办法 : windowsR 打开 services.msc 找S开头:SQ…...
Windows:win11旗舰版连接无线显示器,连接失败
摘要:win11系统通过 miracast 无线连接到长虹电视的时候,一直连接不上。查看电脑又是支持 miracast 协议,后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视,打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…...
Android2024.2.1升级错误
提示 Gradle 版本不兼容,升级后就报错了 。 1.gradle安装包镜像 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists //distributionUrlhttps\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrlhttps://mirrors.cloud.tencen…...
【PHP陪玩系统源码】游戏陪玩系统app,陪玩小程序优势
陪玩系统开发运营级别陪玩成品搭建 支持二开源码交付,游戏开黑陪玩系统: 多客陪玩系统,游戏开黑陪玩,线下搭子,开黑陪玩系统 前端uniapp后端php,数据库MySQL 1、长时间的陪玩APP源码开发经验,始终坚持从客户…...
Arduino UNO R3自学笔记20 之 Arduino如何测定电机速度?
注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:在学习了Arduino的相关基础知识后,现在做个综合应用,给旋转的电机测速。 1.实验目的 测定旋转电机的转速。 2.实验器材-编码器 …...
ChatGPT全新功能Canvas上线:开启智能编程与写作新篇章
引言 随着人工智能技术的迅猛发展,OpenAI旗下的明星产品ChatGPT不断推出创新功能,以满足用户在各个领域的需求。2024年10月3日,OpenAI正式宣布了ChatGPT的全新功能——Canvas。这一功能基于先进的GPT-4o模型开发,为用户提供了一个…...
南沙C++信奥赛陈老师解一本通题 2005:【20CSPJ普及组】直播获奖
【题目描述】 NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%w%,即当前排名前 w%w% 的选手的最低成绩就是即时的分数线。 更具体地,若当前已评出了 pp 个选手的…...
Llama 3.2 视觉能力评估
Meta 发布了 Llama 3 模型的新版本;这次,有四种模型用于不同的目的:两个多模态模型,Llama 3.2 11B 和 90B,以及两个用于边缘设备的小型语言模型,1B 和 3B。 这些是 Meta AI 的首批多模态模型,基…...
前端性能优化 面试如何完美回答
前言 性能优化是目前在面试中被问到非常多的问题,主要就是通过各种算和技术来提高页和应用的速度和用户体前端性能优化的问题并不好回答 在回答的时候干万不要掉进一个误区,认为性能优化只是几个技术点而已,事实上性能优化涉及到的是多方面的…...
程序猿成长之路之设计模式篇——设计模式简介
无论是对于代码质量还是代码可维护性、可扩展性,使用合适的设计模式都能够起到促进提升的作用,此外在软考的软件工程师、系统架构师职称考试中,设计模式也是必考的一块内容,因此我打算开拓一个新的专栏简单介绍一下设计模式&#…...
基于Node2Vec的图嵌入实现过程
目录 一、引言二、Node2Vec(原理)2.1 随机游走(Random Walk)2.2 嵌入学习2.3 Node2Vec 的优势 三、使用 Node2Vec 进行图嵌入(实践)3.1 读取和转换 JSON 文件为 Graph 对象3.2 训练 Node2Vec 模型3.3 二维嵌…...
国庆刷题(day4)
C语言: C:...
如何在 Python 3 中制作一个计算器程序
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Python 编程语言是处理数字和求解数学表达式的强大工具。这种特性可以用来制作有用的程序。 本教程介绍了如何在 Python 3 中制作…...
搭建shopify本地开发环境
虽然shopify提供了在线编辑器的功能,但是远不及本地编辑器方便高效,这篇文章主要介绍如何在本地搭建shopify开发环境: 1、安装nodejs 18.2 2、安装git 3、安装shopify cli ,使用指令: npm install -g shopify/clilatest 4、安装ruby 5、…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
