Skip to content

面试速答(先看这里)

**一句话结论:**对于String类型,要存储对象的话,需要把对象序列化成一个JSON字符串,然后把整个字符串保存在Redis的String结构中,而使用Hash接口的话,则只需要把对象转成map(比如使用fastjson可以直接转),就可以直接把这个map存储到Redis的hash结构中了。

60秒标准回答:

不知道最近为啥这个问题出现的概率很高,这俩有啥好比较的,使用的场景都不一样,唉

String就是字符串,用于存储简单的值,而Hash是一种哈希表结构,用于存储本身具有k-v结构的数据。一般来说他俩没啥对比的必要,只不过他们有个共同特点,那就是都可以用来存储对象

对于String类型,要存储对象的话,需要把对象序列化成一个JSON字符串,然后把整个字符串保存在Redis的String结构中,而使用Hash接口的话,则只需要把对象转成map(比如使用fastjson可以直接转),就可以直接把这个map存储到Redis的hash结构中了

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**不知道最近为啥这个问题出现的概率很高,这俩有啥好比较的,使用的场景都不一样,唉。
  • **要点2:**String就是字符串,用于存储简单的值,而Hash是一种哈希表结构,用于存储本身具有k-v结构的数据。
  • **要点3:**相比之下,同样是存储对象的话, 使用hash结构有一个好处,那就是如果要修改某个特定的字段,可以直接修改,而使用String的话,需要把整个字符串查出来,做反序列化以后再修改,然后再序列化之后存储到Redis中。
  • **要点4:**而且如果要做一次修改的话,操作也要复杂的多,会存在多次网路交互,而且因为修改是在内存中做的,这个过程如果没做好分布式锁,会导致并发问题。
  • **要点5:**但是这么做的话,相比用一个hash结构存储来说,key就多了很多,浪费很多空间。

**记忆锚点:**String → Redis → hash → Hash → map → key

加分表达:

  • 不知道最近为啥这个问题出现的概率很高,这俩有啥好比较的,使用的场景都不一样,唉。
  • 相比之下,同样是存储对象的话, 使用hash结构有一个好处,那就是如果要修改某个特定的字段,可以直接修改,而使用String的话,需要把整个字符串查出来,做反序列化以后再修改,然后再序列化之后存储到Redis中。
  • 而且如果要做一次修改的话,操作也要复杂的多,会存在多次网路交互,而且因为修改是在内存中做的,这个过程如果没做好分布式锁,会导致并发问题。

追问准备:

  • 围绕「String」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Redis」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「hash」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

不知道最近为啥这个问题出现的概率很高,这俩有啥好比较的,使用的场景都不一样,唉。

典型回答 ​

String就是字符串,用于存储简单的值,而Hash是一种哈希表结构,用于存储本身具有k-v结构的数据。一般来说他俩没啥对比的必要,只不过他们有个共同特点,那就是都可以用来存储对象。

对于String类型,要存储对象的话,需要把对象序列化成一个JSON字符串,然后把整个字符串保存在Redis的String结构中,而使用Hash接口的话,则只需要把对象转成map(比如使用fastjson可以直接转),就可以直接把这个map存储到Redis的hash结构中了。

相比之下,同样是存储对象的话,使用hash结构有一个好处,那就是如果要修改某个特定的字段,可以直接修改,而使用String的话,需要把整个字符串查出来,做反序列化以后再修改,然后再序列化之后存储到Redis中。所以,非常直观的可以看见Hash结构的操作更加简单。

而且如果要做一次修改的话,操作也要复杂的多,会存在多次网路交互,而且因为修改是在内存中做的,这个过程如果没做好分布式锁,会导致并发问题。

当然,也可以不把一个对象都存在一个key里面,也可以拆分一下,比如用独立键的方式,如

plain
# String 方案(3个独立键)
SET user:1000:name "Alice"
SET user:1000:age 30
SET user:1000:email "alice@example.com"

但是这么做的话,相比用一个hash结构存储来说,key就多了很多,浪费很多空间。