| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Redis的经典面试题 -> 正文阅读 |
|
[大数据]Redis的经典面试题 |
1.你用过Redis 吗? Redis是什么??有用过redis 。Redis是基于内存的数据结构存储服务器。常用作数据库、缓存、消息队列。是目前最主流的nosql数据库之一。 2.我们常用的数据类型有哪些?你能说说分别在那些场景中使用?reids中常用的数据类型有 String、list、set、hash、zset (1)String类型:redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据,byte字节等,也就是string类型能存储任何数据,你可以用它存储序列化后的用户对象,json化的对象,甚至图片,视频等 ????????使用场景:可以用来做计数器、常用命令:set、get、incr、decr、incrby、decrby (2)list类型:可以存储一个字符串列表,按照数据加入的顺序排列,它非常方便的在列表头部和尾部添加元素。列表类型内部使用双向链表实现,所以向列表两端添加元素非常快, 但是如果尝试访问一个非常大的列表的中间元素,则速度会很慢 ????????使用场景:类似时间点的访问。每个时间点的重大事件存入list形成时间轴;例如好友动态、评论等; 常用命令:lpush、rpush; 记住最近的操作:往list列表头部放元素,取头部的几个元素即为最近记录,常用命令:lpush、ltrim (3)Set类型:无顺序的字符串集合,集合中每个元素都是不同的不允许有重复数据。其内部存储是一个值为空的散列表,所以增删速度也很快。 ????????使用场景:可以使用set做抽奖,把名单放入set、set不会重复,随机弹出元素。 (4)zset类型:与set类似,也是一个无重复数据的集合,不同的是zset的每个元素会关联一个分数,这个分数用于对集合元素进行排序;(从小到达)zset中的元素是唯一的,但是每个元素的分数是可以重复的。 ????????使用场景:实时的数据排行,每次数据的更新会更新分数 (5)hash类型:是一个string类型的field和value的映射表 使用场景:hash用于存储对象、例如关注数、粉丝数等。 注:一个对象中的某一个属性是唯一的,对同一个属性进行操作会进行覆盖操作。 3.Redis可以设置过期吗?你能说说Redis的过期清理原理吗?在Redis中提供了Expire命令设置一个键的过期时间,到期以后Redis会自动删除它。 (1)Redis删除过期key的方法主要有两种:????????1.消极方法:????????在key被访问时如果发现它已经失效,那么就删除它。 ????????2.积极方法:????????周期性地从设置了过期时间的key中选择一部分过期的key删除,对于那些从未被查询的key,即便它们已经过期,消极方式也无法清除,因此Redis会周期性地随机测试一些key,已过期的key将会被删掉。 扩充:Redis积极方法删除过期key
4.缓存 有什么作用缓存是解决系统性能问题的利器,通过缓存技术来降低后端服务器压力,提升系统整体性能,缩短响应时间。特别是在大流量高并发场景下,缓存可以说是解决大流量高并发,优化系统性能首要考虑的因素。 5.什么是缓存穿透?如何解决?缓存穿透是指大量不存在的key请求,由于缓存没有,便开始查询数据库,但数据库也没有查到数据库比如一些恶意攻击,爬虫等造成大量空命中。 解决方案:方案一:缓存空结果,对数据库查询不存在的数据仍然记录在缓存中缓存一条数据,比如缓存一条空值unknow,这样能有效减少查询数据库的次数。 ?方案二:布隆过滤器布隆过滤器是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 6.什么是缓存击穿?如何解决?高并发条件下,对于热点数据访问,在某个时刻数据失效了;或者刚开始时缓存中还没有对数据进行缓存,所有请求都被发送到数据库去查询,数据库被压垮。 解决方案:方案一:使用分布式锁,就是在访问数据库之前都先请求分布式锁,获得锁的那个线程才有资格去访问数据库,其他线程必须等待。整体思路:拿到锁的线程查询出来的数据结果会重新放入redis缓存,然后释放锁,这样当后面排队的人拿到锁的时候,再次进行缓存判断,这时缓存已经有数据了,那么直接不再对数据库进行操作。 方案二:对即将过期的数据主动刷新,比如起一个后台定时任务轮询,主动跟新缓存数据,保证缓存不会全部失效。 7.什么是缓存雪崩?如何和解决?缓存雪崩是指比如我们给所有的数据设置了同样的过期时间,然后在某一个历史性时刻,整个缓存的数据全部过期了,然后瞬间所有的请求都落到数据库,数据库被压垮。或者是缓存服务器发生故障,导致所有的请求都落入到数据库,数据库被压垮。 解决 方案:事前:redis要高可用(搭建集群或者哨兵),避免redis不可用。 事中:本地ehcache缓存(mybatis二级缓存)+限流&降级,避免数据库被压垮。 事后:redis持久化,快速恢复缓存数据。 8.如何解决数据库与缓存的双写不一致问题?1.为缓存设置过期时间从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。
2.使用延迟双删策略9.Redis中使用lua脚本的好处是什么?10.Redis的淘汰机制策略你知道那些?11.Redis的持久化有那些方法?有什么区别?12.Redis的集群模式有那几种13.Redis中查询大量的key要怎么办?14.Redis为什么那么快? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:03:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |