设为首页 加入收藏

TOP

Redis源码分析(八)---t_hash哈希转换(一)
2015-07-24 12:04:41 来源: 作者: 【 】 浏览:87
Tags:Redis 源码 分析 ---t_hash 哈希 转换

在上次的zipmap分析完之后,其实关于redis源代码结构体部分的内容其实已经全部结束了,因为下面还有几个和结构体相关的操作类,就页把他们归并到struct包下了。这类的文件有:t_hash.c,z_list,z_set.c,t_string.c,t_zset.c,这些文件的功能其实都差不多,就是用来实现Client和Server之间的命令处理的操作类,通过robj的形式,把dict,ziplist等存入robj中,进行各个转换,实现命令操作。避开了结构体原先的复杂结构,相当于是封装了结构体的操作类,今天我所讲的是t_hash,是dict哈希字典,ziplist压缩列表与robj之间的转换。统称hashType类型。由于此文件无头文件,只有.c文件,所以为了方便学习,我把方法拉了出来。

/* 下面是方法的归类 */
void hashTypeTryConversion(robj *o, robj **argv, int start, int end) /* 当hashType为ziplist时,判断对象长度是否超出了服务端可接受的ziplist最大长度,超过则转成哈希字典类型*/
void hashTypeTryObjectEncoding(robj *subject, robj **o1, robj **o2) /* 当robj用的是字典的编码方式的时候,则经过编码转换 */
int hashTypeGetFromZiplist(robj *o, robj *field,unsigned char **vstr,unsigned int *vlen,long long *vll) /* 获取ziplist压缩列表中的某个索引位置上的值 */
int hashTypeGetFromHashTable(robj *o, robj *field, robj **value) /* 获取哈希字典中的某个值 */
robj *hashTypeGetObject(robj *o, robj *field) /* 获取某个key对应的对象类型 */
int hashTypeExists(robj *o, robj *field)?? /* hastType类型判断某个键是否存在 */
int hashTypeSet(robj *o, robj *field, robj *value) /* hashType设置操作,分2种情况,ziplist,和字典hashtable */
int hashTypeDelete(robj *o, robj *field)? /* hashType删除操作,分为ziplist的删除操作,和hashtable的删除操作 */
unsigned long hashTypeLength(robj *o)?? /* hashType求长度操作 */
hashTypeIterator *hashTypeInitIterator(robj *subject)? /* 获取hashType迭代器 */
void hashTypeReleaseIterator(hashTypeIterator *hi) /* 释放hashType迭代器 */
int hashTypeNext(hashTypeIterator *hi) /* 通过hashType迭代器获取下一个元素 */
void hashTypeCurrentFromZiplist(hashTypeIterator *hi, int what,unsigned char **vstr,unsigned int *vlen,long long *vll) /* 根据当前迭代器的位置,获取当前ziplist的所在位置的key位置,或value该位置上的值 */
void hashTypeCurrentFromHashTable(hashTypeIterator *hi, int what, robj **dst) /* 根据当前迭代器的位置,获取当前dict的所在位置的key位置,或value该位置上的值 */
robj *hashTypeCurrentObject(hashTypeIterator *hi, int what) /* 根据当前迭代器的位置,获取当前key对象 */
robj *hashTypeLookupWriteOrCreate(redisClient *c, robj *key) /* 根据c客户端对象,找到key是否存在,创建或实现添加操作? */
void hashTypeConvertZiplist(robj *o, int enc) /* 从ziplist压缩表到hashtable的转换 */
void hashTypeConvert(robj *o, int enc) /* 对象转换操作,例如从ziplist到dict的转换 */

hashType的相关操作命令类,其实就是对上面方法的结合调用:
/* 哈希命令类型 */
void hsetCommand(redisClient *c)  /* 客户端设置指令 */
void hsetnxCommand(redisClient *c) /* 客户端设置下一个位置指令 */
void hmsetCommand(redisClient *c) /* 客户单设置命令,如果没有key,还有后续操作 */
void hincrbyCommand(redisClient *c) /* 客户端添加value值操作 */
void hincrbyfloatCommand(redisClient *c) /* 客户端添加float类型value值操作 */
static void addHashFieldToReply(redisClient *c, robj *o, robj *field) /*  */
void hgetCommand(redisClient *c) /* 客户端获取操作,如果没找到,直接不做任何操作 */
void hmgetCommand(redisClient *c) /* 客户端获取key操作,如果为空,会返回一些了NULL值 */
void hdelCommand(redisClient *c) /* 客户端删除操作 */
void hlenCommand(redisClient *c) /* 客户端求长度命令 */
static void addHashIteratorCursorToReply(redisClient *c, hashTypeIterator *hi, int what) /* 客户端添加hashType迭代器操作 */
void genericHgetallCommand(redisClient *c, int flags) /* 客户端获取操作原始方法,可以添加flag参数 */
void hkeysCommand(redisClient *c) /* 客户端获取key值命令 */
void hvalsCommand(redisClient *c) /* 客户端获取val值命令 */
void hgetallCommand(redisClient *c) /* 客户端获取key;value 2个值都获取 */
void hexistsCommand(redisClient *c) /* 客户端判断记录是否存在操作 */
void hscanCommand(redisClient *c) /* 客户端扫描操作 */
robj的操作实现转换的原理很简单,rob通过里面的ptr指针,存的就是真实的ziplist或者dict哈希总类,然后后面的操作都是基于此进行的,比如说下面的方法:?
/* Ge
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇toadfororacle,格式化配置备份Fm.. 下一篇知道归档日志sequence#,查处该归..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: