用户工具


SDS 字符串结构

redis用自己创建的结构SDS来存储字符串

struct sdshdr{
	int len;  // 已分配但未被使用的字节
	int free; // 内容长度
	char buf[]; // 内容存储
}

redis是用c语言写的,相比c语言的字符串结构有什么好处呢?

  1. 有len字段:,所以获取的复杂度有o(N)变成o(1),
  2. 有free字段:可以实现内存的预分配,和惰性回收

跳表

核心思想是给有序的list创建“索引”,加快搜索过程

hash算法

  • hash算法的冲突解决方式是拉链法,随着数据的增多会导致冲突的加剧
  • 可以通过rehash命令根据当前数据量生成一个新的负载因子,重新hash一边

有序集合

用了2种算法

  • 字典算法实现hash
  • 跳表算法用来实现有序

压缩列表

每个压缩的元素由3各部分组成,

  • 前一个元素的长度
  • 编码类型
  • 内容
  • 前一个元素内容长度小于254用1个字节保存
  • 前一个元素内容长度大于253用5个字节保存

改变元素大大小会导致内存的重新分配 假如第一个元素的内容长度又253增加到255时,导致第二个元素由之前1个字节存储的长度变成了5个字节极端情况(恰好第二个元素的长度也由253增加到257,然后导致第三个元素重新分配内存…..一直传递下去)

这也叫连锁更新

删除策略

  • 定时删除
  • 获取时判断删除

发布订阅

发布订阅,订阅是阻塞的(类似开启了一个socket一直监听)

事务

lua脚本(服务端代理模式)