数据库
首页 > 数据库> > Redis学习记录

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来保存字符串的长度
SDS

2)、内存重新分配

在C语言中对字符串进行修改(例如拼接字符或者缩短字符),都需要对数组的空间进行重新分配,而这样分配空间的过程通常是非常耗时。因此redis做出如下策略

修改空间预分配

在为redis中字符串进行修改或者扩容的时候,会有如下选择

  1. 如果对String进行修改,字符小于1M,就会增加和len相等的未使用空间,即buf的长度是len+free+1 Byte(1用来保存'\0'
  2. 如果修改后大于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