数据类型:
数据类型 | 名字 | 编码 |
---|---|---|
list | 列表 | ziplist 、linkedlist |
hash | 哈希表 | ziplist、hashmap |
string | 字符串 | SDS |
set | 集合 | IntSet |
sorted set | 有序集合 | skiplist |
- SDS = simple dynamic string 简单动态字符串;string类型
- 双向链表:list类型
- 即可用作栈,也可以做队列;
- 包含head tail 指针,list 长度;
- void * 万能指针,实现多台;
- 字典:Hash 类型,set 集合
- 数据结构
- 哈希算法:
使用字典设置的哈希函数,计算键 key 的哈希值
hash = dict->type->hashFunction(key);使用哈希表的 sizemask 属性和哈希值,计算出索引值
根据情况不同, ht[x] 可以是 ht[0] 或者 ht[1]
index = hash & dict->ht[x].sizemask;
当字典被用作数据库的底层实现, 或者哈希键的底层实现时, Redis 使用 MurmurHash2 算法来计算键的哈希值。MurmurHash 算法目前的最新版本为 MurmurHash3 ;
- 数据结构
- 跳跃表:sortedset 有序集合类型,性能和红黑树类似
- 链表加多级索引的结构,就是跳表, 实现二分查找;所以时间复杂度logN;
- 索引数量是a1=n/2 ,an=2,q=1/2 所以,Sn=(a1-anq)/1-q=n-1 ,即空间复杂度O(n);
- 有序链表,插入需要查找,所以O(logN);删除O(logN)
- 整数集合;set 类型;
- 有序数组,整数集合是集合键的底层实现之一。
- 整数集合的底层实现为数组, 这个数组以有序、无重复的方式保存集合元素, 在有需要时, 程序会根据新添加元素的类型, 改变这个数组的类型。
- 升级操作为整数集合带来了操作上的灵活性, 并且尽可能地节约了内存。
- 整数集合只支持升级操作, 不支持降级操作。
- 压缩列表(ziplist);
- 是列表键和哈希键的底层实现之一;
- 对象:
- Redis 数据库中的每个键值对的键和值都是一个对象。
- Redis 共有字符串、列表、哈希、集合、有序集合五种类型的对象, 每种类型的对象至少都有两种或以上的编码方式, 不同的编码可以在不同的使用场景上优化对象的使用效率。
- 服务器在执行某些命令之前, 会先检查给定键的类型能否执行指定的命令, 而检查一个键的类型就是检查键的值对象的类型。
- Redis 的对象系统带有引用计数实现的内存回收机制, 当一个对象不再被使用时, 该对象所占用的内存就会被自动释放。
- Redis 会共享值为 0 到 9999 的字符串对象。
- 对象会记录自己的最后一次被访问的时间, 这个时间可以用于计算对象的空转时间。
- 数据库:
1.
原始文章:
https://mp.weixin.qq.com/s?__biz=MzI5NzAzOTM4MQ==&mid=2648093049&idx=1&sn=9274af76149189ba4f5e45cd55308f15&chksm=f4993203c3eebb15b380b9ee314ed1e3b580ba5303208be5fc57c34fa86b27d99ae7b14fadb3#rd
https://www.jianshu.com/p/c706d050d2f8