redis 哈希类型以及实现原理

一种以存储键值对的形式字典结构(key-value)。

哈希类型适合存储对象;使用对象类别和ID构成键名,使用字段表示独享的属性。而字段存储属性值。

hset key field value field2 value2 field3 value3 //这条语句等价于 

hmset key field value field2 value2 field3 value3

例如一扫地机器人, 可以称它为ROBOT:1, 它的功能(function)为清洁(cleaning),它的名称(name)为joy。 价格(price)为200元。

那么就可以这样使用语句:

hset ROBOT:1    function  cleaning name joy  price 200

 

hgetall key 获取某个哈希的所有类型的字段以及字段对应的值。

 

hget key field

 

使用type查询键值类型时, 只能查询到key,使用hgetall才能查询到key和field的值。

 

HSET的命令不需要区分插入和更新操作。所以修改数据之前不需要判断字段是否存在。

 

底层实现: 哈希表。 一个哈希表里有有多个哈希表节点,每个哈希表节点就保存一个键值对。

//哈希表
typedef struct dictht {
    //哈希表数据
    dictEntry **table;
    //哈希表大小
    unsigned long size;
    //哈希表大小掩码, 用于计算索引值。总等于-1。
    unsinged long sizemask;
    //哈希表已有节点数量。
    unsigned long used;
    
}dictht;

//哈希表节点
typedef struct dictEntry {
    //key
    void *key;
    //value
    union {
        void *val;
        uint64_tu64;
        int64_ts64;
    } v;
    struct dictEntry *next;
}

//字典
typedef struct dict {
    // 类型特定函数
    dictType *type;
    // 私有数据
    void *privdata; 
    //哈希表
    dictht ht[2];
    //rehash索引, 当rehash不存在时,值为-1
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */
} dict;

 

typdef struct dictType {

unsigned int (*hashFunction) (const void *key);

void *(*keyDup) (void *privdata, const void *obj);

void *(*valDup) (void *privdata, const void *ojb);

void (*keyCompare) (void *privdata, const void *key1, const void *key2);

void (*keyDestructor) (void *privdata, void *key);

void (*valDestructor) (void *privdata, void *obj);

} dictType;

//TODO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值