redis读书笔记(redis数据结构)

1.redis结构与对象
redis的默认字符串是 SDS(simple dynamic string)
对象中分别包含raw编码和embstr编码皆为sds字符串对象实现。
1.1 redis的数据类型 :
数据库键总是一个字符串对象。
键值则是:
①string字符串对象
②列表对象 list
③哈希对象 hash object
④集合对象 set object
⑤有序集合对象 sorted set object

1.2 关于SDS
SDS除了作为redis的默认字符串外还用作于缓冲区(buffer)
1.2.1 SDS结构

 ①free(表示分配空间)
 ②len(表示所保存字符串长度) 
 ③buf(字节数组,用于保存字符串。永远保分配额外一个字节去用作学习C字符串的空字符串结尾 \0
  1. 关于哈希表
    2.1
    redis因为使用C所以是没有内置这种数据结构的,所以redis构建了自己的字典实现。

2.2 哈希表结构

dictht-
dictEntry **table - 哈希表数组
long size - 哈希表大小
long sizemask - 哈希表大小掩值 用于计算索引值。总是等于size-1
long used - 该哈希表已有的节点数量
dictEntry-
*key -键
union{
	*val -指针
	uint64_tu64 -unint整数
	int64_ts64 -int整数
} v;
dictEntry *next - 只想下一个哈希表节点,形成链表

dictEntry-{0:null,1:null,2:null,3:null} - 此哈希数组标识了一个大小为4的空哈希表,没有包含任何的键值对。

2.3 关于字典

dict-
dictType *type -类特定函数①
void *privdata -私有数据
dictht ht[2] -哈希表
in trehashidx; rehash索引,当rehash不在进行时,值为-1

type和privdata属性是针对不同类型的键值对,为创建多态字典而设置的;

4.关于链表

listNode- 
listNode *prev -前置节点
listNode *next -后置节点
*value -节点的值
链表节点
list-
listNode *head -表头节点
listNode *tail -表尾节点
long len -链表锁包含的节点数量
*(*dup)(void *ptr) -节点值复制函数
(*free)(void *ptr) -节点值释放函数
int (*match)(void *ptr,void,*key) -节点值对比函数

5.跳跃表 skiplist *如果有序集合包含的元素数量比较多或者包含元素中的成员是字符串比较长的时候才会使用跳跃表

skiplist-
zskiplistNode *header -表头
zskiplistNode *tail -表尾
level -当前表内,层数最大的那个节点的层数(表头不计)
length -当前跳跃表包含节点的数量(表头不计)
zskiplistNode-
zskiplistLevel{
	zskiplistNode *forward -前进指针
	int span -跨度
} level[]
zskiplistNode *backward -后退指针
score -分值
robj *obj -成员对象

6.关于整数集合 intset *只有一个集合只包含整数值元素,并且数量不多的时候才会使用
6.1

intset-
uint32_t encoding -编码
uint32_t length -元素数量
int8_t contents[] - 保存元素的数组(contents的类型取决于encoding)

6.2 特性
有序、无重复,添加新元素的时候,有需要时会更改数组的类型。并不支持降级

  1. 压缩列表 *列表键和哈希键的底层实现之一。只包含少量列表项,比呢且要么是小整数值或者长度比较短的字符串。redis就会拿来做列表建的底层实现。

7.1 顺序型数据结构

zlbytes -4byte 列表占用内存字节数。在对压缩列表进行内存重分配或者计算zlend的位置使用
zltail -4byte 记录起始到表尾的字节数,
zllen -包含节点量(小于uint16——max 65535时准确,大于的时候只能便利)
entryN.. -
zlend -特殊值

8 对象
字符串对象string,列表对象list,哈希对象hash,集合对象set,有序集合sort set。

每个对象都由redisObject结构表示

redisObject-
type:4 -类型
encoding:4 -编码
*ptr -只想底层实现数据结构的指针
lru 最后访问时间

9.1 字符串对象
字符串对象可以说int、raw或者embstr
当字符串值长度大于32 =raw编码
小与32=emb编码
9.2 列表对象
ziplist(压缩列表)或者linkedlist(双端链表)
9.3 哈希对象
ziplist(压缩列表)或者hashtable(哈希结构)
9.4 集合对象
inset(正数集合)或者hashtable(哈希)
9.5 有序集合对象
ziplist(压缩列表) 或者skiplist(跳跃表)

10 内存机制
10.1 引用计数回收机制。
19.2 redis会共享0到9999的字符串对象

数据结构补充
11 hyperloglog *用于做基数统计的算法
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

12 geo
将用户给定的地理位置信息储存起来, 并对这些信息进行操作。

13 pub/sub

消息的“发布”和“订阅”的基本能力;但是尚未提供关于消息的持久化等各种企业级的特性。

13.1 一个Redis client发布消息,其他多个redis client订阅消息,发布的消息“即发即失”,
13.2 redis不会持久保存发布的消息;
13.3 消息订阅者也将只能得到订阅之后的消息,通道中此前的消息将无从获得。

chapter 2 数据库

14 redis服务器
14.1

redisServer-
	redisDb *db -数据库数组
	int dbnum -数据库数量 默认为16(配置文件内可修改redis.conf)

14.2

redisClient-
	redisDb *db -当前使用数据库指针
redisDb-
	dict *dict -数据库键空间,数据库中所有键值对
	dict *expires -键的过期时间,只想都是同一个键对象,所以不会有重复对象。

15 过期删除策略
15.1 定时删除。timer在设置过期时候创建,到点执行。

15.2 惰性删除。在获取键的同事查询是否过期。

15.3 定期删除。一定时间内检查。
redis使用的是定期和惰性删除两种策略。

15.4 aof、rdb和复制功能对过期键的处理。
15.4.1 rdb
冷备文件生成时候会扫描过期键。载入的时候分为主服务器和服务器模式。
主服务器模式会扫描过期,服务器模式的时候不会扫描。
15.4.2 aof
热备的时候不会因为过期键产生任何影响。
命令会被追加。
15.4.3 复制功能
主服务器模式下,会显式的发送del命令删除过期。
服务器模式下,只能被动接收服务器的del命令。

15.5 数据库通知
2.8版本新增功能。可以让客户端通过订阅给定频道或者模式来或者数据库中键的变化以及命令的执行情况。
可以通过服务器配种中的 notify-keyspace-events
AKE发送所有通知,AK键空间通知,AE键事件通知,K$只发送与字符串有关的键空间通知,El只发送与列表键有关的事件通知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值