下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:课课家教育     来源: 今日头条点击数:1136发布时间: 2020-04-15 16:59:49

标签: IT业界计算机Redis

软考,您想通过吗?一次通过才是硬道理

01 面试题突击题目

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

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

IT业界:面试突击Redis:Redis都有哪些数据类型?分别适用于哪些场景?_IT业界_计算机_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

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的学习路线图(xmind文件),看看怎么学习比较好

(注意:关于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常备的面试题...

  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是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。