String类型和Hash类型的结构比较
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
Hash类型的常见命令 HSET key field value:添加或者修改hash类型key的field的值 HGET key field:获取一个hash类型key的field的值 HMSET:批量添加多个hash类型key的field的值 HMGET:批量获取多个hash类型key的field的值 HGETALL:获取一个hash类型的key中的所有的field和value HKEYS:获取一个hash类型的key中的所有的field HVALS:获取一个hash类型的key中的所有的value HINCRBY:让一个hash类型key的字段值自增并指定步长 HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
以下是 String 类型和 Hash 类型的结构比较:
重点看下 Hash 类型的几个重要数据结构。
哈希表节点结构定义: typedef struct dictEntry { // key:键 void *key; // v:值 union { void *val; uint64_t u64; int64_t s64; } v; // 指向下个哈希表节点,形成链表 struct dictEntry *next; } dictEntry;
哈希表节点使用 dictEntry 结构表示, 每个 dictEntry 结构都保存着一个键值对: key 属性保存着键值对中的键, 而 v 属性则保存着键值对中的值; next 属性是指向另一个哈希表节点的指针。
『 参考 Redis设计与实现 』
哈希表结构定义: typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引值 // 总是等于 size - 1 unsigned long sizemask; // 该哈希表已有节点的数量 unsigned long used; } dictht;
哈希表由 dictht 结构定义: table 属性是一个数组, 数组中的每个元素都是一个指向 dictEntry 结构的指针。 size 属性记录了哈希表的大小 used 属性则记录了哈希表目前已有节点(键值对)的数量。 sizemask 属性的值总是等于 size - 1 , 这个属性和哈希值一起决定一个键应该被放到 table 数组的哪个索引上面。
『 参考 Redis设计与实现 』
字典结构定义: typedef struct dict { // 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashidx; /* rehashing not in progress if rehashidx == -1 */ } dict;
字典由 dict 结构定义: type 属性是一个指向 dictType 结构的指针, 每个 dictType 结构保存了一簇用于操作特定类型键值对的函数, Redis 会为用途不同的字典设置不同的类型特定函数。 而 privdata 属性则保存了需要传给那些类型特定函数的可选参数。
type 属性和 privdata 属性是针对不同类型的键值对,为创建多态字典而设置的.
『 参考 Redis设计与实现 』 typedef struct dictType { // 计算哈希值的函数 unsigned int (*hashFunction)(const void *key); // 复制键的函数 void *(*keyDup)(void *privdata, const void *key); // 复制值的函数 void *(*valDup)(void *privdata, const void *obj); // 对比键的函数 int (*keyCompare)(void *privdata, const void *key1, const void *key2); // 销毁键的函数 void (*keyDestructor)(void *privdata, void *key); // 销毁值的函数 void (*valDestructor)(void *privdata, void *obj); } dictType;
ht 属性是一个包含两个项的数组, 数组中的每个项都是一个 dictht 哈希表,
一般情况下, 字典只使用 ht[0] 哈希表, ht[1] 哈希表只会在对 ht[0] 哈希表进行 rehash 时使用。
除了 ht[1] 之外, 另一个和 rehash 有关的属性就是 rehashidx :它记录了 rehash 目前的进度, 如果目前没有在进行 rehash , 那么它的值为 -1 。
『 参考 Redis设计与实现 』
普通状态下字典的展示
rehash 机制:
随着业务的增长,或者QPS的增加,哈希表保存的键值对会不断变化,如果节点数量比哈希表的大小要大很多的话,那么哈希表就会退化成多个链表,哈希表本身的性能优势便不复存在。出于对于链表的性能考虑, 会进行 rehash 操作。整个 rehash 过程较为复杂,这里就不展开讲解,在后续的文章中会一一展开,敬请期待。
内部编码:
Hash 类型内部编码有 ziplist 和 hashtable 两种: ziplist hashtable
02
常用命令
1. 创建一个 Hash Key
命令
HSET key field value redis> HSET uid:1 name "zhangsan" (integer) 1 redis> HSET uid:1 age 18 (integer) 1
2. 获取 Hash Key 对应的 field 的 value
命令
HGET key field redis> HGET uid:1 name "zhangsan" redis> HGET uid:1 age "18"
3. 删除 Hash Key 的 field [field...]
命令
HDEL key field [field ...] redis> > HDEL uid:1 name (integer) 1 # 删除成功
4. 判断 Hash Key 是否有指定 field
命令
HEXISTS key field redis> HEXISTS uid:1 name (integer) 0 # 不存在 redis> HEXISTS uid:1 age (integer) 1 # 存在
5. 获取 Hash Key field 的数量
命令
HLEN key redis> HLEN uid:1 (integer) 2
6. 获取 Hash Key 对应所有的 field 和 value
命令
HGETALL key redis> HGETALL uid:1 1) "age" 2) "18" 3) "name" 4) "zhangsan"
7. 设置 Hash Key 对应 field 的 value(如果field已经存在,则失败)
命令
HSETNX key field value redis> HSETNX uid:2 name "wangwu" (integer) 1 # 设置成功 redis> HSETNX uid:2 name "zhaoliu" (integer) 0 # 设置失败
8. Hash Key 的 INCR 操作
命令
HINCRBY | HINCRBYFLOAT key field increment redis> HINCRBY uid:1 age 1 (integer) 19 redis> HINCRBYFLOAT uid:1 account 200.4 "1200.5"
9. 批量获取 Hash Key 的 field 的 value
命令
HMGET key field [field ...] redis> HMGET uid:1 name age account 1) "zhangsan" 2) "19" 3) "1200.5"
10. 批量设置 Hash Key 的 field 的 value
命令
HMSET key field value [field value ...] redis> HMSET uid:2 name "wangwu" age 20 account 1000.1 OK
2022新版Redis入门到精通
java面试专题课
Java与JavaScript有什么区别?
java核心知识整理-阶段一java开发入门
自学java怎么入门?
Java常用框架大全
如何自学java怎么入门?
学习Java需要学些什么知识?
Java开发主流框架是什么?
江泽民伟大光辉的一生江泽民是全党全军全国各族人民公认的享有崇高威望的卓越领导人,伟大的马克思主义者,伟大的无产阶级革命家政治家军事家外交家,久经考验的共产主义战士,中国特色社会主义伟大事业的杰出领导者
30,最令人绝望的分区诞生!感谢沙特,阿根廷总算逃过一劫2022世界杯北京时间12月5日,世界杯2场18决赛落幕,法国31波兰,英格兰30塞内加尔,双双进入8强。这2场比赛可以说是毫无悬念,法国和英格兰全场都牢牢掌控着局面,除了波兰在补
世界杯历史上排名前十的足球少年2022世界杯参加世界杯被认为是任何有抱负的球员的巅峰之作,在全球舞台上代表你的国家的机会可能只有一次,如果有的话。然而,对于一些人来说,这种机会的大门比其他人打开得早得多。虽然大
一个陌生女人的来信我很喜欢徐静蕾对这个故事的演绎,一个陌生女人的来信。此时我仿佛也回到了第一次体会悸动感受的年纪,应该不光是我,每个姑娘心理都有那样一个存在,即是一个人也是一段回忆,一开始以为重要的
12。5国际志愿者日志愿服务,从心开始别问我是谁,春天的细雨中有我别问我是谁,夏天的山川里有我别问我是谁,秋日的暖阳里有我别问我是谁,冬季的火影中有我。我们拥有一个共同的名字,那就是志愿者12。5国际志愿者日,践行公益
冬天里温暖人心的文案,适合冬日发朋友圈唯美治愈句子头条创作挑战赛01。昏聩的老藤,在贫瘠中吮吸,似榨干了的魂灵,游荡于麻木的蛮荒。寒风怒号,冲刷坚挺的栋梁,风沙掠过的每一个角落,都隽刻着一个闪光的精神!坚冰下的消融,无声无痕,悄然
走一趟黄泉路是什么体验?地府到底是什么样子?有一个很古老的传说,一个人在黄泉路上走着就会想起自己的亲人,就不会觉得孤单,可是这个人却在这条路尽头的那座山上永远的睡着了。这个人叫女娲。有人说黄泉路是虚构的,但在这条路上确实存在
中国最北第一村有多冷?大兴安岭洛古河村全村只有36户人家众所周知,我国的地理位置离俄罗斯非常近。在我国的黑龙江漠河市,就可以看到俄罗斯的高楼大厦和风景,省去了出国旅游的费用。中国和俄罗斯只有一河之隔,所以欣赏俄罗斯的风光非常方便。我国的
房车旅行选几座?六座四卧简直不要太爽!多人出行,轻松搞定房车旅行,一般都是几个人出行呢?相信大多数应该是夫妻两人出行,毕竟房车生活空间有限,属于比较私密的空间!长期出行在外的话,两人是最舒服的状态,但是有时也不排除一家四口,或者是带着父
北京不只有八达岭长城,推荐北京周边21座长城许多年来,长城都是来北京旅行的人必去的景点之一。然而,一提到长城,大家都会想到北京八达岭长城。其实,万里长城可不只有这一点。据文物和测绘部门的全国性长城资源统计显示万里长城总长度超
反向旅游,你可以相信岭南的这五座小城广东肇庆,一座繁华了上千年的低调城市肇庆的知名度其实不低,作为岭南名郡,即使从隋置端州算起也有上千年的历史。肇庆通过流经辖区的西江水运繁华了上千年,光是文房四宝中能突破江南包围而独
欧洲制造业外逃,中国和美国谁会是真正赢家?我在头条搞创作第二期由于天然气和电价高涨有3,500万人的欧洲制造业,也就是占了欧洲劳动力15的制造业,正在经历一个大逃亡,逃亡的是两个方向,一个,是有廉价能源的美国,另外一个就是
美团亏损超200亿,滴滴亏近500亿,快手亏780亿,钱去哪里了?亏损盈利是企业经营的必然结局,大众对于企业盈利并不感冒,毕竟企业的存在就是为了赚钱,但是企业亏损往往能让引起大众的质疑和讨论,尤其是大幅亏损。10月28日,苹果公司公布最新一个季度
中国手机市场三季度降幅收窄,前五厂商仅苹果出货量正增长全球手机市场和中国手机市场三季度继续延续疲软,各大厂商都在集中精力去库存。10月28日,第三方数据调查公司IDC最新的报告显示,第三季度全球智能手机出货量为3。02亿部,同比下滑9
中国芯片逐渐取代美国芯片,让英特尔英伟达都傻眼了本文原创,禁止抄袭,违者必究自从华为率先突破5G技术和推出麒麟5G芯片之后,华为以及一些中国企业就遭到老美的芯片断供和打压。英特尔英伟达高通以及三星和台积电等芯片半导体企业不能够向
手中有30万,是买保险的增额终身寿还是存银行大额存单什么是大额存单大额存单是银行面向个人非金融企业机关团体等发行的一种大额存款凭证。与一般存单不同的是,大额存单在到期之前可以转让,期限不低于7天,投资门槛较高,一般20W起,存单期限
热搜里的个人信息保护监管行动受关注,人脸识别等受热议自2021年11月1日起,个人信息保护法实施已一年。如何在释放数据潜在价值的同时保护个人信息,已成为时代之问,时代之盼。值此之际,南方都市报从个人平台司法等角度出发,推出个人信息保
钢琴家陈萨登台东艺听老朋友肖邦感受悠长生命弧线舞台上的她,在琴键交错间穿越古典与浪漫生活中的她,洒脱随性地捕捉生命的美好,用独特的视角观察着世界,并把它融入自己的艺术创作中。昨晚,钢琴家陈萨登台上海东方艺术中心,献演俄罗斯重量
周婉京口音是烙印,越更改就越清晰周婉京出生在北京的部队大院,但16岁就到了香港,后入香港城市大学创意媒体学院学习电影,之后入香港中文大学学习视觉艺术,但她的博士学位却是在北京大学哲学系拿到的,博士论文讨论的是康德
孙红雷李小璐申请对乐视限制高消费企查查APP显示,近日,乐视控股(北京)有限公司新增两则限制高消费信息,申请人为李小璐孙红雷。限制消费令显示,北京市第三中级人民法院立案执行申请人孙红雷申请执行乐视公司国内非涉外仲
素人写作普通人离第一本书有多远?素人写作正成为一种潮流,名不见经传从没受过专业写作训练的普通人,将自己的故事出成书。图为素人作者许路(左上)吴为(左下,和外公外婆)杨岚(右下)李一洋(右上)。(资料图图)黄昏的光
坚定奉行互利共赢的开放战略开放是当代中国的鲜明标识。习近平总书记在党的二十大报告中强调,中国始终坚持维护世界和平促进共同发展的外交政策宗旨,致力于推动构建人类命运共同体。十年来,中国构建面向全球的高标准自由