Redis数据类型学习之聊聊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-1Embstr
embstr格式的SDS simple Dynamic String 内存空间是连续的,只读的,只要执行修改就会转成raw-
Raw
,SDS,存储大于44个字节的字符串
3、不用担心内存溢出,sds具备自动扩容能力
4、获取字符串长度时间复杂度O(1)
,存储了len属性
5、通过空间预分配
和惰性空间释放
防止多次分配内存
6、判断是否结束使用len属性,可以包含'