Redis系列(十):数据结构Hash之HDEL、HEXISTS、HGETALL、HKEYS
发布时间:2020-12-16 04:38:02 所属栏目:安全 来源:网络整理
导读:1.HDEL 从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。 如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回0。 时间复杂度:O(N)?N是被删除的字段数量 127.0 . 0.1 : 6379 hset myhash field1 " foo " (integer)
1.HDEL从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。 如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回0。 时间复杂度:O(N)?N是被删除的字段数量 127.0.0.1:6379> hset myhash field1 "foo" (integer) 1 6379> hdel myhash field1 (integer) 6379> 源码解析 // t_hash.c, void hdelCommand(client *c) { robj *o; int j,deleted = 0,keyremoved = 0; if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL || checkType(c,o,OBJ_HASH)) return; 循环删除给定字段列表 for (j = 2; j < c->argc; j++) { if (hashTypeDelete(o,c->argv[j]->ptr)) { deleted++; 当没有任何元素后,直接将key删除 if (hashTypeLength(o) == ) { dbDelete(c->db,1)">1]); keyremoved = ; break; } } } if (deleted) { signalModifiedKey(c->db,1)">]); notifyKeyspaceEvent(NOTIFY_HASH,hdel",c->db->id); (keyremoved) notifyKeyspaceEvent(NOTIFY_GENERIC,1)">del],c->db->id); server.dirty += deleted; } addReplyLongLong(c,deleted); } 具体删除 field,同样区分编码类型,不同处理逻辑 /* Delete an element from a hash. * Return 1 on deleted and 0 on not found. */ int hashTypeDelete(robj *o,sds field) { int deleted = if (o->encoding == OBJ_ENCODING_ZIPLIST) { unsigned char *zl,*fptr; zl = o->ptr; fptr = ziplistIndex(zl,ZIPLIST_HEAD); if (fptr != NULL) { ziplist 删除,依次删除 field,value fptr = ziplistFind(fptr,(unsigned char*)field,sdslen(field),); NULL) { ziplistDelete 为原地删除,所以只要调用2次,即把kv删除 zl = ziplistDelete(zl,&fptr); zl = ziplistDelete(zl,1)">fptr); o->ptr = zl; deleted = ; } } } else OBJ_ENCODING_HT) { if (dictDelete((dict*)o->ptr,field) == C_OK) { deleted = ; /* Always check if the dictionary needs a resize after a delete. */ hash 删除的,可能需要进行缩容操作,这种处理方法相对特殊些 if (htNeedsResize(o->ptr)) dictResize(o->ptr); } } else { serverPanic(Unknown hash encoding); } deleted; } server.c,是否需要进行 resize int htNeedsResize(dict *dict) { long long size,used; size = dictSlots(dict); used = dictSize(dict); HASHTABLE_MIN_FILL=10,即使用率小于 1/10 时,可以进行缩容操作了 return (size && used && size > DICT_HT_INITIAL_SIZE && (used*100/size < HASHTABLE_MIN_FILL)); } 2.HEXISTS返回hash里面field是否存在 时间复杂度:O(1) hexists myhash field1 (integer) hexists myhash field2 (integer) 0 void hexistsCommand(client *if ((o = lookupKeyReadOrReply(c,1)">; addReply(c,hashTypeExists(o,c->argv[2]->ptr) ? shared.cone : shared.czero); } hashTypeExists
int hashTypeExists(robj *char *vstr = NULL; unsigned int vlen = UINT_MAX; long vll = LLONG_MAX; if (hashTypeGetFromZiplist(o,field,&vstr,&vlen,&vll) == 0) return ; } if (hashTypeGetFromHashTable(o,field) != NULL) ; } ziplist的类型判断 Get the value from a ziplist encoded hash,identified by field. * Returns -1 when the field cannot be found. int hashTypeGetFromZiplist(robj *char **vstr,1)">int *vlen,long *vll) { unsigned NULL; int ret; serverAssert(o->encoding == OBJ_ENCODING_ZIPLIST); zl = o->ptr; fptr = NULL) { fptr = ziplistFind(fptr,1)">); Grab pointer to the value (fptr points to the field) */ vptr = ziplistNext(zl,fptr); serverAssert(vptr != NULL); } } if (vptr != NULL) { ret = ziplistGet(vptr,vstr,vlen,vll); serverAssert(ret); ; } return -ziplistFind void hlenCommand(client *o; ; addReplyLongLong(c,hashTypeLength(o)); } ? Return the number of elements in a hash. long hashTypeLength(const robj *o) { unsigned long length = ULONG_MAX; OBJ_ENCODING_ZIPLIST) { length = ziplistLen(o->ptr) / OBJ_ENCODING_HT) { length = dictSize((const dict*)o->ptr); } length; } ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- axis2开发并调用webservice
- RMI、Hessian、Burlap、Httpinvoker、WebService
- atlas学习系列之二(AutoCompleteExtender篇)
- 如何在Vim中保存自动格式化JSON
- angularjs – Angular Jasmine测试函数调用然后
- 【数据结构】——-线性表分析(顺序表与链表的对比
- webpack AngularCompilerPlugin hostReplacement
- angular 2:TypeError:this.form.updateValueAn
- Bootstrap CSS组件之按钮组(btn-group)
- scala – 将构造函数作为返回类型
热点阅读