本篇文章带大家了解一下Redis数据类型中的String,聊聊String数据类型的存储原理,希望对大家有所帮助!
Redis是工作中使用比较多的中间件,它支持丰富的数据结构,拥有极强的读写性能,tps可以达到10w+。
今天这篇文章来分析和总结String类型也是使用最多的一种数据结构之一。本文是基于redis5.0进行分析。【相关推荐:Redis视频教程】
一、基本使用
set key value [EX seconds] [PX milliseconds] [NX|XX]
1、set是语法,key是指定名称, value是需要存储的值
2、EX 指定过期的秒时间,PX指定过期的毫秒时间
3、NX:只有key不存在的时候,才设置成功
4、XX:只有key存在的时候,才设置成功
总结:5.0支持set命令指定过期时间和不存在的时候才设置成功,也就是通过一条命令就可以实现分布式锁加锁的功能,以前的版本设置key和设置过期时间需要分成两个命令,原子性保证难度更大。
二、使用场景
1、热点数据缓存,分布式session
2、Setnx 分布式锁
3、incr 计数器
4、Incr 全局id
5、Incr 限流
6、bit 操作,位图功能,在线用户统计 0/1标记
三、支持存储的数据类型
整型,字符型,float(单浮点型)
四、不同的编码类型
五、String存储原理
在Redis中,数据存储在一个RedisObject类中
typedef struct redisObject { //这个类型可以是string,也可以是hash,zset等等 unsigned type:4; unsigned encoding:4; //记录lru,lfu淘汰算法依赖的访问时间和访问频率 unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or * LFU data (least significant 8 bits frequency * and most significant 16 bits access time). */ //引用计数器 int refcount; //指向真实数据结构对象 void *ptr; } robj;
对于String,Redis自定义了一种简单动态字符串的数据结构来存储字符串数。
源码实现:多种数据结构,分别表示可以存储不同长度的字符串。
len:代表已经使用的长度
alloc:分配的总内存大小
flags:代表存储类型
buf[]:实际的数据
六、三种编码存储区别
1、embstr的RedisObject,SDS内存在一块,只要创建时分配一次内存
,销毁时释放一次内存
,查找方便
2、raw则RedisObject,SDS内存不在一块,需要创建时分配两次内存
,销毁时释放两次内存
3、embstr的结构,决定了他需要增加长度时,RedisObject,SDS都需要重新分配内存。因此embstr编码的数据是不能修改的,只读的
。
七、int,embstr编码什么时候转换成raw
1、int类型的数据不再是int类型,转成raw
2、长度大于2^63-1转成embstr
3、embstr字符超过44字节,转成raw
八、SDS数据结构的优点
1、二进制安全的
可以存储图片 整形,浮点型
2、String 的三种编码,充分利用内存,提高内存利用率
-
int
存储8个字节长整形 long ,2^63-1 -
Embstr
embstr格式的SDS simple Dynamic String 内存空间是连续的,只读的,只要执行修改就会转成raw -
Raw
,SDS,存储大于44个字节的字符串
3、不用担心内存溢出,sds具备自动扩容能力
4、获取字符串长度时间复杂度O(1)
,存储了len属性
5、通过空间预分配
和惰性空间释放
防止多次分配内存
6、判断是否结束使用len属性,可以包含'\0',操作字符串。
九、为什么不用c中的字符数组?
1、需要预先分配内存,可能内存溢出
2、获取长度需要遍历数组,时间复杂度O(n)
3、字符数组长度变化,需要内存重分配
4、c的字符数组中,'\0'代表判断结束。二进制数据存储不安全
,不能保存图片,视频等。
十、关于内存预分配特性
通过源码分析,扩容策略是字符串在长度小于 SDS_MAX_PREALLOC 之前,扩容空间采用加倍策略,也就是保留 100% 的冗余空间。当长度超过 SDS_MAX_PREALLOC 之后,为了避免加倍后的冗余空间过大而导致浪费,每次扩容只会多分配 SDS_MAX_PREALLOC大小的冗余空间。
十一、关于惰性空间释放
惰性空间释放用于优化 SDS 的字符串缩短操作:当 SDS 的 API 需要缩短 SDS 保存的字符串时, 程序并不立即使用内存重分配来回收缩短后多出来的字节, 而是使用 free 属性将这些字节的数量记录起来,并等待将来使用。
//仅仅设置长度,没有真正清除数据 void sdsclear(sds s) { //单纯设置长度为0 sdssetlen(s, 0); //第一个字符设置为结束符 s[0] = '\0'; }
真正的清除空间
sds sdsRemoveFreeSpace(sds s) { struct sdshdr *sh; sh = (void*) (s-(sizeof(struct sdshdr))); // 进行内存重分配,让 buf 的长度仅仅足够保存字符串内容 sh = zrealloc(sh, sizeof(struct sdshdr)+sh->len+1); // 空余空间为 0 sh->free = 0; return sh->buf; }
以上便是关于string的知识点记录,string的设计很多地方都非常巧妙,比如不同的结构体存储不同长度的字符串,不同编码类型存储不同长度的字符串,
空间预分配,空间惰性释放等,从存储结构,编码类型,内存分配策略和回收策略,作者都从性能方面做了非常多的考量设计,可想而知这也是redis为什么性能极高的原因,工作中也要学习这种追求极致性能的优良风格和设计风格。
更多编程相关知识,请访问:编程入门!!
以上是Redis数据类型学习之聊聊String原理的详细内容。更多信息请关注PHP中文网其他相关文章!

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

redis error就是redis数据库和其组合使用的部件出现错误,这个出现的错误有很多种,例如Redis被配置为保存数据库快照,但它不能持久化到硬盘,用来修改集合数据的命令不能用。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

记事本++7.3.1
好用且免费的代码编辑器

Atom编辑器mac版下载
最流行的的开源编辑器