【Redis】redis5种数据类型(哈希)

目录

基本介绍

命令

HSET

HGET

HEXISTS

HKEYS

HVALS

HGETALL

HMGET

HLEN

HSETNX

HINCRBY

HINCRBYFLOAT

HSTRLEN

内部编码

原生字符串类型、哈希类型、序列化字符串json作缓存的区别


基本介绍

哈希类型中的映射关系是field-value,用于区分redis整体的键值对(key-value)

命令

HSET

设置hash中指定的字段(field)和值(value)

语法:

HSET key field value [field value ..]

时间复杂度:O(1);

返回值:添加的字段的个数。

HGET

获取hash中指定字段的值

语法:

HGET key field

时间复杂度:O(1)

返回值:如果查询的key或者field不存在,返回nil

HEXISTS

判断hash中是否有指定的字段

语法:

HEXISTS key field

时间复杂度:O(1)

返回值:1表示存在,0表示不存在

HDEL

删除hash中指定的字段

语法:

HDEL key field [field ....]

时间复杂度:O(1);

返回值:本次删除字段的个数。

和del区分,del删除的是key,hdel删除的是field

HKEYS

获取hash中的所有字段

语法:

HKEYS key

时间复杂度:O(N),这个操作先根据key找到对应的hash,然后再遍历hash,这里的N是hash的元素个数

返回值:字段列表field

注意!这个操作也是存在一定的风险,与key * 类似,如果元素多的话,遍历的时间就比较久,就会把我们的redis阻塞很久。

HVALS

获取hash中所有的值

语法:

HVALS key

时间复杂度:O(N)

返回值:所有的值

HGETALL

获取hash中的所有字段以及对应的值

语法:

HGETALL key

时间复杂度:O(N)

返回值:字段和对应的值。

HMGET

一次查询多个field对应的值

语法:

HMGET key field1 field2 ..

返回值:多个value的顺序和field的顺序是匹配的。

HLEN

获取hash中所有字段的个数

语法:

HLEN key

时间复杂度:O(1)

返回值:字段个数

HSETNX

在字段不存在的情况下,设置hash中的字段和值

语法:

HSETNX key field value

时间复杂度:O(1)

返回值:1表示设置成功,0表示失败

HINCRBY

将hash中字段对应的数值添加指定的值(整数)

语法:

HINCRBY key field increment

时间复杂度:O(1)

返回值:该字段变化之后的值

HINCRBYFLOAT

将hash中字段对应的数值添加指定的值(小数)

语法:

HINCRBYFLOAT key field increment

时间复杂度:O(1)

返回值:该字段变化之后的值

HSTRLEN

计算value的字符串长度

语法:

HSTRLEN key field

内部编码

哈希的内部编码有两种:

ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。

hashtable(哈希表):当哈希类型无法满足ziplist 的条件时,redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度是O(1)。

原生字符串类型、哈希类型、序列化字符串json作缓存的区别

1、原生字符串类型--使用字符串类型,每个属性一个键

set user:1:name James

set user:1:age 23

  • 优点:实现简单,针对个别属性变更也很灵活。
  • 缺点:占用过多的键,内存占用量较大,同时用户信息在redis中比较分散,缺少内聚性,没有实用性。

2、序列化字符串类型,例如json格式

  • 优点:针对总是以整体作为操作的信息比较合适,编程也简单,同时,如果序列化方式合理的话,内存利用率也比较高。
  • 缺点:本身序列化和反序列需要一定开销,同时如果总是操作个别属性则非常不灵活。

3、哈希类型

  • 优点:简单、直观、灵活,尤其针对信息局部的修改或获取操作。
  • 缺点:需要控制哈希在ziplist和hashtable两种编码之间的转换,可能会造成较大的内存损耗
相关推荐
快乐飒男几秒前
哈希表(c语言)
c语言·哈希算法·散列表
Edingbrugh.南空37 分钟前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
半新半旧39 分钟前
python 整合使用 Redis
redis·python·bootstrap
go54631584651 小时前
基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究
图像处理·人工智能·深度学习·神经网络·算法
CodeCraft Studio1 小时前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_4376643141 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
aramae1 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
大锦终1 小时前
【算法】前缀和经典例题
算法·leetcode
封奚泽优2 小时前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui
想变成树袋熊2 小时前
【自用】NLP算法面经(6)
人工智能·算法·自然语言处理