Redis数据结构和内部编码--哈希(hash)

本文介绍了Redis中的哈希类型,包括哈希的概念、相关命令如hset、hmset、hget、hdel等,以及内部编码的ziplist和hashtable。通过实例展示了哈希类型的操作,并提及了哈希在节省内存和提高效率方面的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.概念

在Redis中,也提供了和其他语言一样键值对结构的hash类型,Redis的hash类型的键值本身又是一个键值对结构.

如:

key

value

user:1

key

value

code

01

name

shl

user:2

key

value

code

02

name

zyc

二.命令

2.1 设置值

命令:hset key field value

例如: hset user:1 name shl

返回:0

2.2 批量设置值

命令:hmset key field1 value1 field2 value2 …

例如:

hmset user:1 name shl age 32

   返回 ok

2.3 获取值

命令:hget key field

例如:hset user:1 name shl

hget user:1 name

返回shl

2.4 批量获取值

命令:hmget key field1 field2

例如:hmset user:1 name shl age 32

hmget user:1 name age

返回: shl

 32

2.5 删除field

命令:hdel key field

例如:hset user:2 name zyc

hdel user:2 name

返回: 1 表示删除成功

2.6 计算field的个数

命令:hlen key

例如:hmset user:3 name shl age 32 city tianjin

     hlen user:3

返回:3

2.7 判断field是否存在

命令:hexists key field,包含返回1,不包含返回0.

例如hset user:2 name zyc

     hexistsuser:2 name

     返回:1

2.8 获取指定key的所有field

命令:hkeys key   获取指定key的所有field

例如:hmset user:4 name shl age 32

     hkeys user:4

返回:name

age

2.9 获取指定key的所有value

命令:hvals key

例如:hmset user:4 name shl age 32

hvals user:4

返回:shl

 32

2.10 获取指定key的所有field-value

命令:hgetall key

例如:hmset user:4 name shl age 32

hgetall user:4

返回:name

 shl

 age

 32

2.11 指定field的value的计数。

命令:

(1)hincrby key field

例如:hset user:1 age 32

     hincrby user:1 age 10

     返回:42

(2)hincrbyfloat key field

例如:hset user:1 age 32

hincrbyfloat user:1 age -8.1

     返回:23.9

2.12 计算指定field的value的内容的字符串长度

命令:hstrlen key field

例如:hset user:1 name shl

       hstrlen user:1 name

       返回:3

三. hash类型命令的时间复杂度

四.内部编码

hash类型的内部编码有两种:

(1)      ziplist(压缩列表)

当哈希类型的元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值都小于hash-maxziplist-value配置(默认为64字节),Redis会使用ziplist做为哈希的内部实现。Ziplist可以使用更加紧凑的结构来实现多个元素的连续存储,所以在节省内存方面更加优秀。

(2)      hashtable(哈希表)

当哈希类型无法满足ziplist要求时,redis会采用hashtable做为哈希的内部实现,因为此时ziplist的读写效率会下降

知识小贴士:作者尽心运营的知识星球社群【请点击:简道源码&&架构分析 加入】(可添加运营同学WX:wx454876882)持续拉新中...,定期的jdk与核心框架源码解析,主流行业解决方案与架构设计资料查阅与下载尽在其中。帮助行业新人和有志于技术的专业人士体系化的学习源码与系统架构,获取业界知名技术峰会和厂商对外公布的主流业务场景的解决方案。同时这个星球也是一个社群,大家可以在社群中结识有识之士,共同探讨,答疑解惑。希望可以通过这个星球帮助大家每日进步一点点,一年持续365天,共勉

本星球 聚焦于Java源码分析,架构解析。低代码,可扩展和高可用架构设计。帮助你更好地学编程,欢迎想进步的同学!仅精品案例的资料整理即物超所值。让我们大家一起每日进步一点点~~,你可以:

1. 阅读星球专属的编程知识和优质文章

2.JAVA知识从点和面,深度挖掘。通过点,形成面。提升自身的技术广度和深度。

3. 加入星球专属交流群,帮你找到学习伙伴、获取每日优质文章推送等

4.业界优秀案例资料学习及下载

5. 和伙伴们一起学习打卡,增加动力,共同进步

6.工作、学习和方法论。如何提升软实力,比如写文章、画架构图、技术产品的营销、社区的运营等等。

7.招聘、面试和晋升。如何提前准备面试,有什么套路?如何提升硬实力,少走弯路?

8.提供简历优化服务哟。本人常年招聘,也就面试了1000+程序员和架构师~~

9.解答你的疑问。

10.每日进步一点点(最重要的一点): 让自己与众不同,每天学习1-2小时源码和架构知识,365天后再回首,1年前的自己可能是个SB吧。用通勤的时间让自己成长,让优秀变成一种习惯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大道化简

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值