Redis第一天
Redis基本数据结构
数据结构
字符串
与C字符串的区别
- 常数复杂度获取字符串长度
- 杜绝缓冲区溢出:对SDS修改时,API会先检查SDS的空间是否满足修改所需的要求,不满足,会扩展SDS的空间至需要的大小
- 减少修改字符串时带来的内存重分配次数,SDS会通过空间预分配和惰性空间释放的策略管理字符串。
- 二进制安全:SDS的保存字符串的结构是二进制数组
- 兼容部分C字符串函数
Redis链表
特点:
- 双端:链表节点带有prev和next指针
- 无环:表头节点的prev和表尾节点的next指向NULL
- 带表头指针和标为指针
- 带链表长度计数器
- 多态:链表节点使用void *指针保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。
字典
rehash:扩展和收缩哈希表
- 执行扩展操作的时机:
- 服务器目前没有正在执行BGSAVE或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于1
- 服务器正在执行BGSAVE或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于5
- 执行收缩操作的时机:
- 当哈希表负载因子小于0.1时,程序自动开始对哈希表执行收缩操作
跳跃表
压缩列表
对象
字符串对象
编码方式:
- int:保存的是整数值,并且可以用long类型表示
- raw: 保存的是字符串,并且长度大于39字节
- embstr:保存的是字符串,并且长度小于等于39字节
列表对象
哈希对象
集合对象
有序集合对象
类型检查
键回收
OBJECT REFCOUNT : 查看对对象的引用计数
OBJECT IDLETIME:查看对象的空转时长,如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过maxmemory选项所设置的上限时,空转时长较高的那部分键会优先被服务器释放,从而回收内存。