Redis-带你深入学习数据类型Hash【面试重点】

目录

1、基础知识

2、相关命令

2.1、hset、hget

2.2、hexists

2.3、hdel

2.4、hkeys、hvals、hgetall

2.5、hmget、hmset

2.6、hlen

2.7、hsetNX

2.8、Hincrby、Hincrbyfloat

3、应用场景-缓存

4、缓存方式对比


1、基础知识

redis中存储数据本身就是以键值对的形式,而这里的hash类型,指的是redis的key value中的value是以键值对的形式存储的,也就是说,键值对中的值也是键值对~


2、相关命令

2.1、hset、hget

hset:设置hash中指定字段的值

  • 语法:hset key field value [field value ...]
  • 如果没有key,则会设置一个key再存入field value;否则直接在对应的key中存入field value
  • field其实和key一样,就是键值对中的键,为了区分开来,所以用field表示
  • 返回值:成功插入的field value值的对数
  • hset支持一次在一个key中存入多组field value
  • 时间复杂度O(1)

举例:

hget:取出key中指定字段的值

  • 语法:hget key field
  • 返回值:对应value值,无则返回 nil
  • 时间复杂度O(1),k组filed value则为O(k)

举例:

2.2、hexists

  • hexists:判断是否存在指定的字段
  • 语法:hexists key filed
  • 返回值:存在返回1 ;不存在返回0
  • 时间复杂度O(1)

举例:

2.3、hdel

  • hdel:删除hash中指定的字段
  • 语法:hdel key filed [field ...]
  • 返回值:成功删除的字段个数
  • 时间复杂度O(1)---O(k)
  • 与命令del的区别:del删除的是key;hdel删除的是field

举例:

2.4、hkeys、hvals、hgetall

hkeys:取出key中的所有field

  • 语法:hkeys key
  • 返回值:该key下的所有field
  • 时间复杂度O(1)
  • 该操作存在风险:可能一个key下有很多个field value的键值,此方法就可能会造成一个方法执行时间过长~

举例:

hvals:取出key中的所有value

  • 语法:hvals key
  • 返回值:该key下的所有value
  • 时间复杂度O(1)
  • 风险同上

举例:

hgetall:取出key下的所有field和value

  • 语法:hgetall key
  • 返回值:该key下的所有field和value
  • 时间复杂度O(1)
  • 风险同上

举例:

2.5、hmget、hmset

hmget:一次获取hash中多个字段的值

  • 语法:hmget key field [field...]
  • 返回值:对应的value值,无则返回nil
  • 时间复杂度O(1)---O(k)

举例:

hmset:一次存入多个字段,几乎和hset一样,因此这个命令很少使用~

2.6、hlen

  • hlen:获取hash中的对应key中所有的字段个数
  • 语法:hlen key
  • 时间复杂度O(1)
  • 返回值:字段个数

举例:

2.7、hsetNX

  • hsetNX:在字段不存在时,才能成功设置hash中的字段的值
  • 语法:hsetNX key field value
  • 时间复杂度O(1)
  • 返回值:设置成返回1;失败返回0

举例:

2.8、Hincrby、Hincrbyfloat

Hincrby:将hash中字段对应的数值添加指定的值

  • 语法:Hincrby key field increment
  • 时间复杂度O(1)
  • 返回值:字段value变化后的值

举例:

Hincrbyfloat:将hash中字段对应的数值添加指定的浮点数

  • 语法:hincrbyfloat key field increment
  • 时间复杂度O(1)
  • 返回值:字段value变化后的值

举例:


3、应用场景-缓存

在上一片博客中,提到string类型的应用场景为缓存,hash也可以是吗?对的,这两种方法有各自的优缺点,具体使用按照具体的业务场景来选择就好,相对来说,9存储结构化的数据,使用hash其实是更加适合滴~【结构化数据-->类似于数据库表这种的】

使用hash存储结构化数据举例:

倘若使用string来存储,需要利用到json这样的数据格式,只不过在修改一个key中指定的field对应value值会比较麻烦,需要我们先取出json,然后解析出内部的value值,做出修改后,再合成json,后再存入key中指定的field处~


4、缓存方式对比

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

  • 优点:实现简单,针对个别属性变更更灵活
  • 缺点:占用过多的键,内存占用量较大,用户信息在redis中分布比较分散,缺少内聚性-几乎不使用

序列化字符串类型,例:JSON格式

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

哈希

  • 优点:简单、直观、灵活;尤其针对信息的局部变更或者获取操作
  • 缺点:需要控制哈希在ziplist和hashtable两种内部编码的转换,可能会造成内存较大的消耗

好啦,我们下期见咯~

相关推荐
Villiam_AY2 小时前
Redis 缓存机制详解:原理、问题与最佳实践
开发语言·redis·后端
GEM的左耳返5 小时前
Java面试全攻略:Spring生态与微服务架构实战
spring boot·redis·spring cloud·微服务·kafka·java面试
遇见尚硅谷6 小时前
C语言:*p++与p++有何区别
c语言·开发语言·笔记·学习·算法
程序员勋勋16 小时前
Redis的String数据类型底层实现
数据库·redis·缓存
艾莉丝努力练剑6 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
jz_ddk7 小时前
[HarmonyOS] 鸿蒙LiteOS-A内核深度解析 —— 面向 IoT 与智能终端的“小而强大”内核
物联网·学习·华为·harmonyos
颜颜yan_7 小时前
Python面向对象编程详解:从零开始掌握类的声明与使用
开发语言·redis·python
试着7 小时前
零基础学习性能测试第五章:Tomcat的性能分析与调优-Tomcat原理,核心配置项,性能瓶颈分析,调优
学习·零基础·tomcat·性能测试
老虎06277 小时前
JavaWeb(苍穹外卖)--学习笔记13(微信小程序开发,缓存菜品,Spring Cache)
笔记·学习·微信小程序
@蓝莓果粒茶9 小时前
LeetCode第350题_两个数组的交集II
c++·python·学习·算法·leetcode·职场和发展·c#