C字符串中的字符必须符合某种编码(比如 ASCII,并且除了字符串的末尾之外 , 字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾 。
SDS的API都是二进制安全的(binary-safe):都会以处理二进制的方式来处理SDS存放在buf数组里的数据,程序不会对其中的数据做任何限制、过滤、或者假设 —— 数据在写入时是什么样的,它被读取时就是什么样 。redis不是用这个数组来保存字符,而是用它来保存一系列二进制数据 。
3.4 SDS结构优化String类型所存储的数据可能会几byte存在大量这种类型数据,但len、free属性的int类型会占用4byte共8byte存储,3.2之后会根据字符串大小使用sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64数据结构存储,具体结构如下:
struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[];};struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* used */uint32_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* used */uint64_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];};
- unsign char flags:3bit表示类型,5bit表示未使用长度
- len:表示已使用长度
- alloc:表示分配空间大小 , 剩余空间大小可以使用alloc - len获得
- embstr:CPU每次按Cache Line 64byte读取数据,一个redisObject对象为16byte,为填充64byte大?。?会向后再读取48 byte数据 。但获取实际数据时还需要再通过*ptr指针读取对应内存地址的数据 。而一个sdshdr8属性的信息占用4byte , 其余44byte可以用来存储数据 。如果value值小于44 , byte可以通过一次读取缓存行获取数据 。
文章插图
- int:如果SDS小于20位,并且能够转换成整型数字 , redisObject的*ptr指针会直接进行存储 。
文章插图
- raw:SDS
文章插图
作者:盛旭
推荐阅读
- 巅峰罐头和k9罐头哪个好一点_新西兰k9好还是巅峰好
- 2017睡衣品牌前十名:芬腾睡衣第一名,质量好价格美
- 老王普及一下,贵妃镯现在很多女生都有在戴,是一种非常普遍的手镯款式
- 德州扑克两个玩家牌型相同,筹码怎么分配(德州扑克只剩一个筹码怎么对局)
- 德州扑克是怎么玩法,有没有详细解释一下的
- Springboot 一行代码实现文件上传 20个平台!少写代码到极致
- 从0搭建vue3组件库: 如何完整搭建一个前端脚手架?
- Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵
- JDK中自带的JVM分析工具
- 还在使用@Autowrired注入?不妨试试@RequiredArgsConstructor