当一个集合只包括整数值元素,并且这个集合的元素数量不多时,redis 会使用整数集合作为集合键的底层实现。
比如:SADD numbers 1 3 5 7 9
;这个集合键的底层就是整数集合。
一、实现
他可以保存类型为 int16_t、int32_t、int64_t
的整数值,并且保证集合中不会出现重复元素,并且有序
1 | typedef struct intset { |
哈希表当数据量不断增加时,他的性能就经常会受到哈希冲突和 rehash 开销的影响。两个问题的核心都来自于哈希表要保存的数据量,超过了当前哈希表能容纳的数据量。
redis 的做法:针对哈希冲突,redis 采用了链式哈希。对于 rehash 开销,redis 实现了渐进式 rehash 设计。
1 | typedef struct dictht { |
如上是哈希表的实现,
redis 服务器将所有数据库都保存在 redisServer 结构的 db 数组中,每个 redisDb 结构代表一个数据库。redis 服务器在初始化时,默认会创建 16 个数据库。
1 | struct redisServer { |
redisDb 结构中的 dict 字典保存了数据库中所有的键值对。
使用 select 2
语句,即可将切换到 2 号数据库。