您当前的位置:首页 > 电脑百科 > 数据库 > Redis

Redis哈希类型

时间:2019-09-27 09:51:53  来源:  作者:

我们知道在redis中有5种数据类型,之前的文章中我们已经介绍过了String类型,也就是字符串类型,今天我们学习第二种数据类型,哈希类型。大部分语言基本都提供了哈希类型,如JAVA语言中的Map类型及Python语言中的字典类型等等。虽然语言不同,但它们基本使用都是一样的。也就是都是键值对结构的。例如:

value={{field1, value1}

下面我们通过下图来直观感受一下字符串类型和哈希类型的区别。

Redis哈希类型

 

Redis中哈希类型都是键值对结构的,所以要特别注意这里的value并不是指的是Redis中的key的value,而是Redis中哈希类型中的field所对应的value。

下面我们还是和介绍字符串类型一样,先是了解一下Redis中哈希类型的相关命令。

命令


一. 设置值

hset key field value 
Redis哈希类型

 

我们看上图执行的命令知道,hset命令也是有返回值的。如果hset命令设置成功,则返回1,否则则返回0。除此之外Redis也为哈希类型提供了hsetnx命令。在字符串那篇文章中,我们知道,nx命令则表示key不存在的时候,才能设置成功,而在Redis中hsetnx命令则表示field不存在的时候,才能设置成功。


二. 获取值

hget key field
Redis哈希类型

 

 

我们看hget命令和get有很大的不同,get命令在获取的时候,只要写一个名字就可以了,而hget命令则要写两个名字,第一个名字就是key 第二个名字就是field。除此之外,当然key或者field不存在时,返回的结果都是nil。


三. 删除field

hdel key field [field ...]
Redis哈希类型

 

hdel命令删除的时候,也会有返回值,并且这个返回就是成功删除field的个数。当field不存在时,并不会报错,而是直接返回0。


四. 计算field个数

hlen key
Redis哈希类型

 

hlen命令返回的就是当前key中field的个数,如果key不存在,则返回0。


五. 批量设置或获取field-value

hmget key field [field ...]
hmset key field value [field value ...]
Redis哈希类型

 

hmset命令和hmget命令分别都是批量设置和获取值的,hmset命令没有什么要注意的,但hmget命令要特别注意,当我们获取一个不存在的key或者不存在的field时,Redis并不会报错,而是返回nil。并且有几个field不存在,则Redis返回几个nil,当整个key都不存在时,则返回全部nil(有几个field返回几个nil)。


六. 判断field是否存在

hexists key field
Redis哈希类型

 

当执行hexists命令时,如果当前key包括field,则返回1,否则返回0。

七. 获取所有field

hkeys key
Redis哈希类型

 


八. 获取所有value

hvals key
Redis哈希类型

 


九. 获取所有的field-value

hgetall key
Redis哈希类型

 

hgetall命令会返回当前key中的所有field-value,并按照顺序依次返回,也就是field-value field-value等等。


十. hincrby hincrbyfloat

hincrby key field increment
hincrbyfloat key field increment
Redis哈希类型

 

hincrby命令和incrby命令的使用功能基本一样,都是对值进行增量操作的。唯一不同的就是incrby命令的作用域key,而hincrby命令的作用域则是field。


十一. 计算value的字符串长度

hstrlen key field
Redis哈希类型

 

hstrlen命令返回的是当前key中field中字符串的长度,如果当前key中没有field则返回0。


哈希类型命令的时间复杂度

Redis哈希类型

 

 

内部编码

在Redis哈希类型的内部编码只有两种它们分别是:

  • ziplist(压缩列表):当哈希类型中元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现。
  • hashtable(哈希表):当上述条件不满足时,Redis则会采用hashtable作为哈希的内部实现。

下面我们通过以下命令来演示一下ziplist和hashtable这两种内部编码。

  1. 当field个数比较少并且value也不是很大时候Redis哈希类型的内部编码为ziplist。
  2. 当value中的字节数大于64字节时(可以通过hash-max-ziplist-value设置),内部编码会由ziplist变成hashtable。
  3. 因为在Redis中中文的字节数比英文的字节数大大,正常来说,一个中文占用3个字节。
  4. 当field个数超过512(可以通过hash-max-ziplist-entries参数设置),内部编码也会由ziplist变成hashtable。
  5. 由于直接创建512个field不方便,为了更好的验证该功能,我将用程序的方式,动态创建512个field来验证此功能,下面为具体的代码。
Redis哈希类型

 


Redis哈希类型

 

 


以上就是Redis中哈希类型的相关命令及内部编码,如本文有不正确的地方欢迎指出。



Tags:Redis 哈希类型   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
我们知道在Redis中有5种数据类型,之前的文章中我们已经介绍过了String类型,也就是字符串类型,今天我们学习第二种数据类型,哈希类型。大部分语言基本都提供了哈希类型,如Java语言...【详细内容】
2019-09-27  Tags: Redis 哈希类型  点击:(129)  评论:(0)  加入收藏
▌简易百科推荐
来源: my.oschina.net/xiaomu0082/blog/2990388首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应...【详细内容】
2021-12-08  Java识堂    Tags:Redis   点击:(18)  评论:(0)  加入收藏
我不知道为什么你会选择对特定数量的“错误”(或警告)如此具体。听起来您正在寻找将要发布到 Yahoo! 的某些文章的内容。 Insider (N Foos to Blah for the BlahBlah)。那说:...【详细内容】
2021-12-07  富集云科技有限公司    Tags:Redis   点击:(14)  评论:(0)  加入收藏
目录 一、背景 二、步骤 0.理论支持 1、获取数据 2、结果 3、分析数据并评估大小 三、关于repl-backlog-size 一、背景 repl-backlog-size控制这个环形缓冲区. ​ 主从断...【详细内容】
2021-11-05  弈秋的美好生活    Tags:redis   点击:(41)  评论:(0)  加入收藏
Redis 性能测试是通过同时执行多个命令实现的。1,Redis-benchmarkRedis性能命令:redis性能命令格式: redis-benchmark [option] [option value] redis 性能测试工具可选参数如...【详细内容】
2021-11-02  川石信息    Tags:Redis   点击:(41)  评论:(0)  加入收藏
1 概述数据结构和内部编码 无传统关系型数据库的 Table 模型schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。 key...【详细内容】
2021-11-01  JavaEdge    Tags:Redis   点击:(28)  评论:(0)  加入收藏
普通java中使用引用Java redis 驱动,即可连接:import redis.clients.jedis.Jedis; public class RedisTestJava { public static void main(String[] args) { //连...【详细内容】
2021-10-13  faesuite    Tags:Redis   点击:(34)  评论:(0)  加入收藏
Redis常用的数据结构有 string list set zset hashstringstring 是 Redis 的基本的数据类型,一个 key 对应一个 value。string 类型是二进制安全的,Redis的string可以包含任...【详细内容】
2021-10-12  语霖    Tags:Redis   点击:(36)  评论:(0)  加入收藏
列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。> LPUSH fruit apple(integer) 1> RPUSH fruit banana(integer)...【详细内容】
2021-09-17  深夜敲代码    Tags:Redis   点击:(54)  评论:(0)  加入收藏
Redis持久化意义 是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你的redis整个挂了,然后redis就不可用了,你要做的事情是让redis变得可用,尽快变得可用 大量的请...【详细内容】
2021-08-12  小李说IT    Tags:Redis   点击:(77)  评论:(0)  加入收藏
当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据...【详细内容】
2021-07-30  随便t    Tags:缓存穿透   点击:(91)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条