redis常用基本数据类型:String、Hash、List 、Set、ZSet
redis不常用数据类型:、Hyperloglog、Geo、Streams
1.String 字符类型
可以用来存储字符串、整数、浮点数
数据结构如下: dictEntry 、redisObject
typedef struct dictEntry {
void * key ; /* key 关键字定义 */
union {
void * val ;
uint64_t u64 ; /* value 定义 */
int64_t s64 ;
double d ;
} v ;
struct dictEntry * next ; /* 指向下一个键值对节点 */
} dictEntry
typedef struct redisObject {
unsigned type : 4 ; /* 对象的类型,包括: OBJ_STRING 、 OBJ_LIST 、 OBJ_HASH 、 OBJ_SET 、 OBJ_ZSET */
unsigned encoding : 4 ; /* 具体的数据结构 */
unsigned lru : LRU_BITS ; /* 24 位,对象最后一次被命令程序访问的时间,与内存回收有关 */
int refcount ; /* 引用计数。当 refcount 为 0 的时候,表示该对象已经不被任何对象引用,则可以进行垃圾回收了
*/
void * ptr ; /* 指向对象实际的数据结构 */
} robj ;
底层字符串存储类型是redis自定义的数据类型:
1.int 8个字节长度 2^63-1
2. embstr 存储小于44字节的字符串(SDS字符串)
3.raw存储大于44字节的字符串 (3.2版本之前是 39)
应用场景:
1)缓存:热点数据缓存(例如报表,明星出轨),对象缓存,全页缓存
2)分布式服务数据共享
3)分布式锁
4)全局ID
5) 计数器 incr
6)限流 incr
7)位统计
2.Hash哈希类型
typedef struct dictEntry {
void * key ; /* key 关键字定义 */
union {
void * val ;
uint64_t u64 ; /* value 定义 */
int64_t s64 ;
double d ;
} v ;
struct dictEntry * next ; /* 指向下一个键值对节点 */
} dictEntry ;
typedef struct dictht {
dictEntry ** table ; /* 哈希表数组 */
unsigned long size ; /* 哈希表大小 */
unsigned long sizemask ; /* 掩码大小,用于计算索引值。总是等于 size-1 */
unsigned long used ; /* 已有节点数 */
} dictht ;
typedef struct dict {
dictType * type ; /*
字典类型
*/
void * privdata ; /*
私有数据
*/
dictht ht [ 2 ]; /* 一个字典有两个哈希表 */
long rehashidx ; /* rehash 索引 */
unsigned long iterators ; /* 当前正在使用的迭代器数量 */
} dict ;
dictEntry——>dictht——>dict
3.List类型
quicklist(快速列表)是 ziplist 和 linkedlist 的结合体
typedef struct quicklist {
quicklistNode *head; /* 指向双向列表的表头 */
quicklistNode *tail; /* 指向双向列表的表尾 */
unsigned long count; /* 所有的 ziplist 中一共存了多少个元素 */
unsigned long len; /* 双向链表的长度,node 的数量 */
int fill : 16; /* fill factor for individual nodes */
unsigned int compress : 16; /* 压缩深度,0:不压缩; */
} quicklist;
4.Set类型(无序)
使用hashtable 使用hash类型的key
5.ZSet类型(有序)
ziplist skiplist 实现
typedef struct zskiplistNode {
sds ele ; /* zset 的元素
*/
double score ; /* 分值
*/
struct zskiplistNode * backward ; /* 后退指针 */
struct zskiplistLevel {
struct zskiplistNode * forward ; /* 前进指针,对应 level 的下一个节点 */
unsigned long span ; /* 从当前节点到下一个节点的跨度(跨越的节点数) */
} level []; /* 层 */
} zskiplistNode ;
typedef struct zskiplist {
struct zskiplistNode * header , * tail ; /* 指向跳跃表的头结点和尾节点 */
unsigned long length ; /*
跳跃表的节点数 */
int level ; /* 最大的层数
*/
} zskiplist ;
typedef struct zset { 咕泡出品,必属精品 www.gupaoedu.com
41
dict * dict ;
zskiplist * zsl ;
} zset ;