面试突击Redis:Redis都有哪些数据类型?分别适用于哪些场景?

01 面试题突击题目

Redis都有哪些数据类型?分别适用于哪些场景?

面试突击Redis:Redis都有哪些数据类型?分别适用于哪些场景?

02 面试官心理分析

除非是面试官看你的简历,感觉你就是一个工作3年以内的、比较初级的一个同学,可能对技术没有很深入的研究,面试官才会问这类问题。

其实问这个问题主要就俩原因:

  • 第一,看看你有没有全面的了解redis的功能,一般怎么来用。有没有认真思考过什么场景比较适合用什么数据类型,就怕你只会最简单的kv操作,平时也没思考过怎么设计才更好。
  • 第二,看看你在实际项目里都怎么用Redis,是不是思考过Redis的这些数据类型,是不是爱学习的人。

要是你回答的不好,没说出几种数据类型,也没说什么场景,支支吾吾的你就完了,面试官对你印象肯定不好,觉得你平时就是做个简单的set和get。

03 深入剖析

看一下这道面试题怎么回答。

(1)string

这是Redis中最基本的类型了,也最常用,没啥可说的,就是普通的set和get,做简单的kv缓存。

(2)hash

这个是类似map的一种结构,一般可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在redis里,然后每次读写缓存的时候,可以就操作hash里的某个字段,而不是把整个对象都拿出来,这样节省了IO操作,效率更高。

使用HSET key field value命令存储一个对象,如我们有一个用户,key=user:id:1

<code>1value={
2  "id": 1,
3  "name": "walking",
4  "age": 24
5}/<code>

hash类的数据结构,主要是用来存放一些对象,把一些简单的对象给缓存起来,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。

<code>1value={
2  "id": 1,
3  "name": "walking",
4  "age": 18
5}/<code>

HGET user:id:1 age获取用户ID为1的age值。

(3)list

有序列表,这个是可以玩儿出很多花样的。

比如在微博里,有个大v的粉丝,就可以以list的格式放在Redis里去缓存。

key=某大v

value=[zhangsan, lisi, wangwu]

比如可以通过list存储一些列表型的数据结构,类似粉丝列表了、文章的评论列表了之类的东西。

还可以通过lrange命令,从某个元素开始读取多少个元素,还可以基于list实现分页查询,这个很棒的一个功能。基于redis实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能很高,一页一页的走。

比如还可以用来搞个简单的消息队列,从list头塞进去,从list尾巴那里弄出来。

(4)set

set无序集合,可以自动去重。

直接基于set将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于jvm内存里的HashSet进行去重。但是如果你的某个系统部署在多台机器上呢?就得基于Redis进行全局的set去重了。

当然还可以基于set玩儿交集、并集、差集的操作,比如交集吧,可以把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁?对吧。

把两个大v的粉丝都放在两个set中,对两个set做交集,看到共同关注的人。

(5)sorted set

排序的set,去重但是可以排序,写进去的时候给一个分数,自动根据分数排序,这个可以玩儿很多的花样。这个数据类型的最大的特点是有个分数的概念,可以自定义排序规则。

比如说你要是想根据时间对数据排序,那么可以写入进去的时候用某个时间作为分数,人家自动给你按照时间排序了。

另外,这个数据类型很适合最排行榜这类的功能。

排行榜: 将每个用户以及其对应的分数写入进去命令zadd board score username如

<code>1zadd board 85 Jobs
2zadd board 72 Jerry
3zadd board 96 Walking
4zadd board 62 Tom/<code>

接着使用命令zrevrange board start stop,就可以获取排名从start到stop的用户。

使用命令zrank board username,可以看到用户在排行榜里的排名。

如:zrevrange board 0 3获取排名前3的用户

<code>196 Walking
285 Jobs
372 Jerry/<code>

查看排名zrank board Tom,返回4

04 Redis怎么学?如何复习?

首先,一起来瞄一眼Redis的学习路线图(xmind文件),看看怎么学习比较好

(注意:关于Redis怎么学?如何复习?这一块小编提供了一些学习复习笔记,有需要即可免费分享, 私信 小编 “Redis” 即可!!)

面试突击Redis:Redis都有哪些数据类型?分别适用于哪些场景?

其次,说到复习,一起来看看我自己整理的一份Redis学习笔记

  1. 为什么要用 redis /为什么要用缓存(高性能、高并发)
  2. 为什么要用 redis 而不用 map/guava 做缓存?
  3. redis 常见数据结构以及使用场景分析(String、Hash、List、Set、Sorted Set
  4. redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?
  5. redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复
  6. Redis 常见异常及解决方案(缓存穿透、缓存雪崩、缓存预热、缓存降级
  7. 分布式环境下常见的应用场景(分布式锁、分布式自增 ID
  8. Redis 集群模式(主从模式、哨兵模式、Cluster 集群模式
  9. 如何解决 Redis 的并发竞争 Key 问题?
  10. 如何保证缓存与数据库双写时的数据一致性?
  11. ... ..
面试突击Redis:Redis都有哪些数据类型?分别适用于哪些场景?

最后,再来看一份Redis常备的面试题...

  1. 什么是 Redis?简述它的优缺点?
  2. Redis 与 memcached 相比有哪些优势?
  3. Redis 支持哪几种数据类型?
  4. Redis 主要消耗什么物理资源?
  5. Redis 有哪几种数据淘汰策略?
  6. 为什么 Redis 需要把所有数据放到内存中?
  7. Redis 集群方案应该怎么做?都有哪些方案?
  8. Redis 集群方案什么情况下会导致整个集群不可用?
  9. MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
  10. Redis 有哪些适合的场景?
  11. Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
  12. Redis 和 Redisson 有什么关系?
  13. Jedis 与 Redisson 对比有什么优缺点?
  14. Redis 集群的主从复制模型是怎样的?
  15. Redis 集群会有写操作丢失吗?为什么?
  16. 怎么理解 Redis 事务?
  17. Redis 如何做内存优化?
  18. Redis 回收进程如何工作的?
  19. watch dog 自动延期机制
  20. 锁互斥机制
  21. 释放锁机制|
  22. ... ....
面试突击Redis:Redis都有哪些数据类型?分别适用于哪些场景?

关于上面说的这些Redis学习笔记和复习大纲以及面试常备题目(附详细解析),皆可免费赠送给阅读此篇文章的你,转发+私信我 “Redis” 即可找小编免费分享下载!!


分享到:


相關文章: