===== SDS 字符串结构 ===== redis用自己创建的结构SDS来存储字符串 struct sdshdr{ int len; // 已分配但未被使用的字节 int free; // 内容长度 char buf[]; // 内容存储 } redis是用c语言写的,相比c语言的字符串结构有什么好处呢? - 有len字段:,所以获取的复杂度有o(N)变成o(1), - 有free字段:可以实现内存的预分配,和惰性回收 ===== 跳表 ===== 核心思想是给有序的list创建“索引”,加快搜索过程 {{:pasted:20160105-105730.png}} ===== hash算法 ===== * hash算法的冲突解决方式是拉链法,随着数据的增多会导致冲突的加剧 * 可以通过rehash命令根据当前数据量生成一个新的负载因子,重新hash一边 ===== 有序集合 ===== 用了2种算法 * 字典算法实现hash * 跳表算法用来实现有序 ===== 压缩列表 ===== 每个压缩的元素由3各部分组成, * 前一个元素的长度 * 编码类型 * 内容 * 前一个元素内容长度小于254用1个字节保存 * 前一个元素内容长度大于253用5个字节保存 改变元素大大小会导致内存的重新分配 假如第一个元素的内容长度又253增加到255时,导致第二个元素由之前1个字节存储的长度变成了5个字节极端情况(恰好第二个元素的长度也由253增加到257,然后导致第三个元素重新分配内存.....一直传递下去) 这也叫连锁更新 ===== 删除策略 ===== * 定时删除 * 获取时判断删除 ===== 发布订阅 ===== 发布订阅,订阅是阻塞的(类似开启了一个socket一直监听) ===== 事务 ===== lua脚本(服务端代理模式)