【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两种编码之间的转换,可能会造成较大的内存损耗
相关推荐
Tony Bai7 分钟前
【Go 网络编程全解】12 本地高速公路:Unix 域套接字与网络设备信息
开发语言·网络·后端·golang·unix
爱coding的橙子9 分钟前
每日算法刷题Day78:10.23:leetcode 一般树7道题,用时1h30min
算法·leetcode·深度优先
Swift社区12 分钟前
LeetCode 403 - 青蛙过河
算法·leetcode·职场和发展
地平线开发者13 分钟前
三种 Badcase 精度验证方案详解与 hbm_infer 部署实录
算法·自动驾驶
oioihoii17 分钟前
深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发
java·开发语言·c++
报错小能手21 分钟前
项目——基于C/S架构的预约系统平台 (1)
开发语言·c++·笔记·学习·架构
papership23 分钟前
【入门级-算法-5、数值处理算法:高精度的减法】
算法·1024程序员节
lingran__28 分钟前
算法沉淀第十天(牛客2025秋季算法编程训练联赛2-基础组 和 奇怪的电梯)
c++·算法
DuHz39 分钟前
基于MIMO FMCW雷达的二维角度分析多径抑制技术——论文阅读
论文阅读·物联网·算法·信息与通信·毫米波雷达
MYX_30942 分钟前
第四章 多层感知机
开发语言·python