【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两种编码之间的转换,可能会造成较大的内存损耗
相关推荐
敲代码的奥豆24 分钟前
C++:日期类的实现
开发语言·c++
问道飞鱼36 分钟前
分布式中间件-redis相关概念介绍
redis·分布式·中间件
看山还是山,看水还是。37 分钟前
c#进度条实现方法
c语言·开发语言·笔记·c#
孑么40 分钟前
C# 委托与事件 观察者模式
开发语言·unity·c#·游戏引擎·游戏程序
敲代码不忘补水1 小时前
Python Pickle 与 JSON 序列化详解:存储、反序列化与对比
开发语言·python·json
蜡笔小新星1 小时前
机器学习和深度学习的区别
开发语言·人工智能·经验分享·深度学习·学习·机器学习
liwulin05061 小时前
java-在ANTLR中BaseListner的方法和词法规则的关系0.5.0
java·开发语言
梦里花乡1 小时前
Matlab 的.m 文件批量转成py文件
开发语言·matlab
redcocal1 小时前
地平线内推码 kbrfck
c++·嵌入式硬件·mcu·算法·fpga开发·求职招聘
归去来兮★1 小时前
c++面向对象
java·开发语言·c++