Redis学习记录
作者:互联网
Reids内存耗尽下的八种淘汰策略
noeviction
当内存不足以容纳新写入的数据的时候,不允许新的键值写入
allkeys-lru:
当内存不足的时候,删除最近最少使用的键值(lru算法 least recently used)
allkeys-random
随机删除键值
volatile-lru
当内存不足时,在设置了过期时间的键空间中,删除最近最少使用的键值。
(这种情形是把redis当缓存和数据库使用,即不删除持久保存在redis中的数据)
volatile-random
当内存不足时,在设置了过期时间的键空间中,随机删除键值。
volatile-ttl
当内存不足时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
Redis中SDS和C语言字符串的区别
1)、字符串长度处理
相比于C语言O(n)获取字符串长度,Redis中SDS通过len
来保存字符串的长度
2)、内存重新分配
在C语言中对字符串进行修改(例如拼接字符或者缩短字符),都需要对数组的空间进行重新分配,而这样分配空间的过程通常是非常耗时。因此redis做出如下策略
修改空间预分配
在为redis中字符串进行修改或者扩容的时候,会有如下选择
- 如果对String进行修改,字符小于1M,就会增加和len相等的未使用空间,即buf的长度是
len+free+1 Byte
(1用来保存'\0'
) - 如果修改后大于1M,则
free
为1M
借此在对字符串进行append的时候,会先检查free
是否足够,够就不需要进行内存重分配
惰性空间释放
针对字符串的缩短,redis不会立马释放原有的内存空间,而是用free记录下缩短的空间,以便之后的扩容使用
3)、二进制安全
C语言中的字符串遇到'\0'
就判定终止
而Redis中buf
是保存一系列的二进制数据而不是字符,并且通过len
来判断字符串什么时候结束
所以保存在redis中字符串进入是什么样,出来就是什么样
参考文献
redis为什么快
《Redis设计与实现》
《阿里面试技术手册》
标签:记录,Redis,redis,free,内存不足,学习,键值,字符串 来源: https://blog.csdn.net/csw3186016056/article/details/115601967