比于 Java可修改,是动态字符串(Simple Dynamic String 简称 SDS)内部更像ArrayList,
维护一个字节数组 并 预分配冗余空间以减少频繁分配,扩容/缩容:1)<1MB时,扩容加倍,其他只扩1MB。最大512MB 2) 惰性缩容。不释放空间,留给到期释放等机制释放。
多个字节组成,每个字节8bit.还可以当做 bitmap 去用
概要:基本操作、存整数、原理
1、字符串的基本操作
mset 和 mget 可对多个字符串读写 节省网络开销
![](https://img.haomeiwen.com/i9930763/880eedb38366f6b3.png)
2、可存整数
1)遇到incr,decr自增自减,转成数值计算,此时redisObject的encoding字段为int。整数范围在 $-2^{64}$至$2^{64}-1$。
2)encoding不同场景显示不一样,容量不同:embstr:<=39字节的字符串。int:8个字节的长整型。raw:大于39个字节的字符串。
3)常规计数:微博数,粉丝数等。访问次。INCRBY让这些变容易,通过原子递增计数。。
![](https://img.haomeiwen.com/i9930763/10aaae996bb879c6.png)
4、复杂度o(1)
![](https://img.haomeiwen.com/i9930763/5f764f3310b492a0.png)
3、内部原理
![](https://img.haomeiwen.com/i9930763/e12e24aef5bd175b.png)
content :保存字符串内容,和 c 一样用 0x0作为结束字符.结束字符不会被计算len 中
capacity和len 都是泛型,不直接用 int,因为 Redis 不同数据类型不同长度.并在创建字符串时 len 和 capacity 一样大,没有冗余空间,因为修改字符串场景很少.(Redis 真的将内存优化到了极致)
![](https://img.haomeiwen.com/i9930763/2fdff294715faea7.png)
编码格式待整理:https://zhuanlan.zhihu.com/p/67876900
网友评论