当前位置: 代码网 > it编程>数据库>Redis > Redis远程字典服务器 hash类型示例详解

Redis远程字典服务器 hash类型示例详解

2024年08月15日 Redis 我要评论
一,hash基本情况哈希是我们目前接触到的数据结构中最重要的一个:日常开发中,出场频率非常高面试中,非常重要的考点redis自身已经是键值对结构了,就是通过哈希的方式来组织的,而hash类型,就是把k

一,hash基本情况

哈希是我们目前接触到的数据结构中最重要的一个:

日常开发中,出场频率非常高面试中,非常重要的考点

 redis自身已经是键值对结构了,就是通过哈希的方式来组织的,而hash类型,就是把key这一层组织完之后,到了value这一层,其中的一种类型还可以再是一个哈希表:

哈希类型中的映射关系通常称为 field-value,⽤于区分 redis 整体的键值对(key-value), 注意这⾥的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下文的作用。

关于哈希的详细解释以前已经介绍过,传送门:c++&&数据结构——哈希表_c++哈希表

二,hash常用命令详解

2.1 hset,hget,hexists,hdel

hset就是同时建立key-valuefield-value键值对,前者是redis的键值对,后者是value的键值对;hget就是查询键值对:

2.2 hexists,hdel

hexists的作用是判断指定key的field是否存在,存在就返回1,否则返回0;hdel就是删除,删除key的某一个field-value,当key的field数量为0时,会顺带把key一起删了:

2.3 hkeys,hvals

hkeys作用是根据key找到所有的field并打印出来;hvals作用是获取所有的field和value,但不会显示field:

当然,像这样的“查询所有”的这种操作,也会有和keys *一样的问题的,但是也有解决方法,就是hscan遍历redis的hash类型,属于“渐进式遍历”,我们后面再讲~ 

2.4 hgetall,hmget

hgetall相当于把上面两个命令合起来,同时显示field和value,以两两交替的方式打印出来;hgetall是一次查所有,但是我们有时只要查一部分,所以可以用hmget,就是根据命令行输入field获取对应value,可以一次查多个:

注意:

hgetall同样有keys * 的问题hmget的显示顺序和我们命令行输入的field的顺序是一致的也有hmset一次设置多个field和value,但是不用,因为hset已经可以支持一次设置多个field和value了

2.5 hlen,hsetnx

hlen是获取hash中field-value键值对的个数;hsetnx和前面的setnx一样,如果field不存在就创建,存在就直接返回:

2.6 hincrby,incrbyfloat

hash类型中field的value也可以当作int处理,hincrby可以加减整数,incrbyfloat可以加减小数:

三,hash编码方式

3.1 ziplist

我们经常用到的压缩有rar,zip,7z等,通常是一些具体的压缩算法,本质是针对数据进行重新编码,不同的数据有不同的特定,结合这些特点进行精妙的计算,重新编码过后,就嫩缩小数据的体积:

 ziplist同理,内部的数据结构也是精心设计的,表示一个普通的哈希表,可能会浪费一定的空间(哈希是一个数组,数组上有些位置有元素,有些没有),使用ziplist就可以节省空间,内部的具体实现我们以后再看源码解析

当然,有好处自然会有坏处:读写元素较慢,如果元素较少,慢的并不明显,所以当哈希的元素个数较少,就会用ziplist去优化

当哈希类型元素个数⼩于 hash-max-ziplist-entries 配置(默认 512 个,我们一般会根据业务修改)、 同时所有值都⼩于 hash-max-ziplist-value 配置(默认 64 字节)时,redis 会使⽤ ziplist 作为哈 希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐ hashtable 更加优秀。

3.2 hashtable

只有“元素个数太少”,“长度比较短”两个条件都具备,才会优化成ziplist,当hash类型⽆法满⾜ 这两个条件时,redis 会使⽤ hashtable 作为哈希 的内部实现,因为此时 ziplist 的读写效率会下降,⽽ hashtable 的读写时间复杂度为 o(1)。

3.3 演示

元素很多时就用hashtable来存 

四,应用场景

最主要的应用场景还是作为缓存来使用,但是hash类型作为缓存有点特别,下面来具体讲讲

string也是可以用作缓存的,但是redis是经常和mysql打交道的,所以如果要存储mysql表里面那样的结构化数据,使用hash类型更合适一些:

其实上述场景也可以用strin类型也能做到,需要用到 json 这样的数据格式

  • 但是如果使用json的格式来表示上面的user时,如果我只想获取或修改其中的一个field,就需要把整个json都读出来,解析成对象,然后重写对应的field,再写回去,效率变低
  • 而使用hash,就可以使用field表示对象的每个舒徐(相当于操作mysql的每个列),次数就可以非常方便地修改任何一个属性的值了
  • 但是使用hash的方式,确实读写field更直观和高效,但是付出的是空间的代价,而且还需要控制hash再ziplist和hashtable两种内部编码的转换,可能会造成较大的内存消耗

到此这篇关于redis远程字典服务器 hash类型详解的文章就介绍到这了,更多相关redis hash类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • redis延时队列zset实现的示例

    redis延时队列zset实现的示例

    在分布式系统中,延时队列是一种常用的设计模式,用于处理那些需要在未来某个时间点执行的任务,如订单超时未支付自动取消、消息延迟发送等场景。redis作为高性能的内... [阅读全文]
  • redis 亿级数据读取的实现

    redis 亿级数据读取的实现

    引言随着数据量的爆炸式增长,如何在亿级数据规模下实现高效的数据读取成为了许多企业和开发者面临的重大挑战。redis 作为一款高性能的键值数据库,以其卓越的性能和... [阅读全文]
  • Redis用GEO实现附近的人功能

    Redis用GEO实现附近的人功能

    ☃️概述geo就是geolocation的简写形式,代表地理坐标。redis在3.2版本中加入了对geo的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数... [阅读全文]
  • Redis压缩列表的设计与实现

    Redis压缩列表的设计与实现

    压缩列表(ziplist)其应用场景主要包括以下几个方面:1. 哈希表(hash)在 redis 中,当哈希表(hash)的键值对数量较少且每个键和值的长度较短... [阅读全文]
  • Redis过期时间的设计与实现代码

    Redis过期时间的设计与实现代码

    1. 设置过期时间redis 提供了多个命令来设置键的过期时间,如 expire、pexpire、expireat 和 pexpireat。这些命令可以以秒或毫... [阅读全文]
  • nginx中配置sse的方法示例

    nginx中配置sse的方法示例

    我是自己的项目在本地上运行的时候正常,但是挂在服务器上的时候就出现了sse问题,打开控制台发现只有预览没有响应。然后就去nginx的项目中配置,但是我建议你们,... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com