数据结构
- 字符串
getset:返回旧值,设置新值
setnx key value 如果key不存在的话设置,没有时间参数
setex key 60 value,key存在的时候设置,并且有时间参数
// sds数据结构
type sds struct {
free int
len int
buffers []int
}
1. sds 和c比较
1. 获取长度O(1),c是O(N)
2. 杜绝了缓冲区的溢出,因为c不检查字符串的长度,很容易覆盖到其他字符串
3. 内存重分配次数,C操作的字符串数组,每次增加或者删除,都要进行内存分配操作,忘记释放内存,会导致内存泄露,增加不检查,会导致缓冲区溢出,内存重分配可能会进行系统调用,影响性能
4. redis 采用空间预分配,和惰性释放,保证字符串的扩展和缩容高效。
5. 二进制安全
2. 编码方式
1. int编码,如果整数能用long表示的
2. embstr编码:redis对象和sds在空间是上连续的,分配一次内存 小于44字节
3. raw:redis对象和sds对象不在一起,内存分配两次
哈希
1. 先计算哈希值 2. 计算索引值,然后放到hash表上
列表
type listNode struct { next *listNode pre *listNode val } redis 链表是一个双向的
集合
集合的中的元素无无序的,所以不能根据下标返回,只能返回所有 集合可以计算并集,交集,差集,判断元素是否属于集合,随机返回一个集合或者多个集合 实现方式:intset typedef struct intset { uint32_t encoding; uint32_t length; int8_t contents[]; } intset; intset 数据是有序的,从小到大排序,可以进行二分查找
- 有序集合
1.压缩列表
2.跳表
redis 过期策略和内存淘汰策略
过期策略:
- 定期删除策略:每隔一段时间从过期的key中,随机挑选一部分key进行删除(100ms运行一次)
- 惰性删除策略:当访问过期key的时候进行删除。
- 定时删除: 在设置过期的键的同时,创造一个定时器,等到过期的到来时,立刻删除(对cpu不友好)
redis采用惰性删除,和定期删除策略
惰性删除能够保证获取已经过期的key肯定会删除,不会影响业务,
定期删除的话,肯定有些key'没有被删除掉,且不会访问,就会一直留在内存里面,
这样的话就会有内存淘汰策略
- 从所有的key,设置过期时间的key,采用lru算法
- 从所有的key,设置过期时间的key,采用随机淘汰的算法
- 从设置了过期时间的key,看那个最先过期,就淘汰那个
- 不淘汰,写入直接返回错误
备份
1. aof 和rdb
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。