面试必问之Redis数据类型/适宜场景等,你真的懂吗?

Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

01 面试题突击题目

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

02 面试官心理分析

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

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

  • 第一,看看你有没有全面的了解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

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

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

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

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如

1zadd board 85 Jobs
2zadd board 72 Jerry
3zadd board 96 Walking
4zadd board 62 Tom

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

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

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

196 Walking
285 Jobs
372 Jerry

查看排名zrank board Tom,返回4

04 Redis怎么学?如何复习?

redis学习脑图

  1. 由于文章内容太全面了,篇幅有限就不一一截图展示了,【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必备的面试题...

  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. ... ....
    内容比较齐全,希望大家都仔细阅读,内容比较多,花时间慢慢去消化,希望我整理的这些对大家都有帮助。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值