【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两种编码之间的转换,可能会造成较大的内存损耗
相关推荐
小小程序猴11 分钟前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途4 分钟前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
程序猿编码7 分钟前
两张 3090 扛 27B:Qwen3.8-27B 大模型 DFlash2 加速版生产级落地
开发语言·gpt·深度学习·神经网络·大模型·qwen
welfare96217 分钟前
新号别搞:内存管理+模板初阶+STL简介
开发语言·c++
彧azz22 分钟前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
敲代码的瓦龙30 分钟前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio
白远山34 分钟前
智慧场馆解决方案软件开发实战:从架构设计到落地部署指南
java·开发语言·架构·需求分析
IT笔记1 小时前
Rust 迭代器多级链式调用执行顺序笔记
开发语言·笔记·rust
宣宣猪的小花园.1 小时前
【机器学习】损失函数与梯度下降:机器如何通过“犯错”不断变好
人工智能·算法·机器学习
雪落漂泊1 小时前
C++11(上)
开发语言·c++