Redis面试宝典12道法
Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库
1. 谈下你对 Redis 的了解?
三点:
- 为什么要引入
一般用mysql,oracle,由于数据库持久化数据主要是面向磁盘,而磁盘的读写比较慢,一般的管理系统上,由于不存在,因此没有需要瞬间读写大量数据的要求,这时候传统数据库是没有问题的。但是如果面对一个高并发的场景,比如抢票、发红包等,或者是主页访问量瞬间比较大的时候,一瞬间会有成千上问的请求的到来高并发,需要系统在极短的时间内完成成千上万次的读写操作。这时候数据库根本承受不来,很容易造成数据库系统的瘫痪,最终导致服务器宕机。
为了解决这个问题,我们可以引入nosql技术。nosql也是一种数据库,它是基于内存的,并提供一定的持久化功能。redis和mongodb是当前使用最广泛的nosql技术。
- 是什么?
Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人用C语言所创
redis不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久化支持
redis支持丰富的数据类型,包括string、list、set、zset、hash等多种数据结构,因此它也被称为【数据结构服务器
redis支持主从同步,即master-slave主从复制模式。数据可以从主服务器向任意数量的从服务器上同步,有效的保证数据的安全性
Redis 支持多种编程语言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言。
与SQL型数据不同,redis没有提供新建数据库的操作,因为它自带了16(0-15)个数据库(默认使用0库)。在同一个库中,key是唯一存在的、不允许重复的,它就像一把“密钥”,只能打开一把“锁”。键值存储的本质就是使用key来标识value,当想要检索value时,必须使用与value对应的key进行查找
- redis架构
客户端和服务端可以位于同一台计算机上,也可以位于不同的计算机上。服务端是整个架构的“大脑”,能够把数据存储到内存中,并且起到管理数据的作用 .Redis 基于内存来实现数据的存储,因此其速度非常快。但是我们知道,计算机的内存是非常珍贵的资源,所以 Redis 不适合存储较大的文件或者二进制数据,否则会出现错误,Redis 适合存储较小的文本信息。理论上 Redis 的每个 key、value 的大小不超过 512 MB
2. Redis 一般都有哪些使用场景?
- 缓存—热数据
- 计数器
- 队列
- 分布式锁与单线程机制
- 排行榜
- 最新列表
- 高并发读写
- 位操作大数据处理)redis中setbit(位操作)的实际应用 - 云+社区 - 腾讯云 (tencent.com)
3. Redis 有哪些常见的功能?
- 哨兵(sentinel)和复制(replication)
- 事务
- LUA脚本
- 持久化(Persistence)
- 集群(Cluster)
4. Redis 支持的数据类型有哪些?
- string(字符串)
- hash(哈希散列)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
- HyperLogLog 类型(来统计一个集合中不重复的元素个数)
- Redis 5.0 提供的 Stream(支持消息队列)
注意:这里指的数据类型是 Value(值) 的数据类型,而非 key。
5. Redis 为什么这么快?
- Redis 是一款纯内存结构,避免了磁盘 I/O 等耗时操作。
- Redis 命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。
- 采用了 I/O 多路复用机制,大大提升了并发效率。
- 高效的数据结构(简单动态字符串、内存重新分配、双端链表等)
- 底层模型不同,Redis并没有使用OS提供的Swap,而是自己实现构建了VM的工作机制。
6. 什么是缓存穿透?怎么解决?
如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。
解决方式:
- 把空对象缓存起来。当第一次从数据库中查询出来的结果为空时,我们就将这个空对象加载到缓存,并设置合理的过期时间,这样,就能够在一定程度上保障后端数据库的安全
- 第二种解决缓存穿透问题的解决方案:就是使用布隆过滤器
7. 什么是缓存雪崩?该如何解决?
如果在某一时刻缓存集中失效,或者缓存系统出现故障,所有的并发流量就会直接到达数据库。
解决方式:
- 保证 Redis 的高可用。
- 使用限流降级的方式防止缓存雪崩。
- 通过数据预热的方式将可能大量访问的数据加载到缓存,在即将发生大并发访问的时候,提前手动触发加载不同的数据到缓存中,并为数据设置不同的过期时间,让缓存失效的时间点尽量均匀,不至于在同一时刻全部失效。
8. 怎么保证缓存和数据库数据的一致性?CAP理论?
- 双清延迟清理策略:数据变化前和后都进行缓存清理,事务完成后再次清理。也可以最后监听binlog,再把数据刷入缓存中。
- 队列清理,mq中间件接入redis,这样做小型系统能支撑业务并发,大型系统会产生较高延迟,影响使用。
9. Redis 持久化有几种方式?
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化:
- RDB快照持久化:
时间间隔内将内存的数据集快照写到磁盘。恢复快,节省数据空间,但是当redis故障,仍会丢失部分数据
命令:
BGSAVE:Redis会调用fork来创建一个子进程,然后子进程负责将所有数据的快照写入硬盘,而父进程则继续处理命令请求。
save 60 10000:Redis最近一次创建快照之后开始算起,当“60秒之内有10000次写入”这个条件被满足时,Redis就会自动触发BGSAVE命令
- AOF(append only file)持久化
AOF持久化 的实时性更好,原理是将Redis的操作日志以追加的方式写入文件,但是不加以控制的话,AOF文件的体积可能会比快照文件大好几倍,恢复慢,可以通过冗余命令(BGREWRITEAOF)来重写(rewrite)AOF文件来减小AOF文件的体积
参数:
appendonly yes 开关
appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no #让操作系统决定何时进行同步
10. Redis 怎么实现分布式锁?
- 使用MySQL,基于唯一索引。
- 使用ZooKeeper,基于临时有序节点。
- 使用Redis,基于setnx命令
加锁:使用setnx key value命令,如果key不存在,设置value(加锁成功)。如果已经存在lock(也就是有客户端持有锁了),则设置失败(加锁失败)。
解锁:使用del命令,通过删除键值释放锁。释放锁之后,其他客户端可以通过setnx命令进行加锁
1.防止死锁:要有个超时的机制,在设置key的值时,需要加上有效时间,如果有效时间过期了,就会自动失效,就不会出现死锁。
2.支持可重入锁:加锁成功后使用hset命令value=1,使用hincrby自增,解锁时,先判断可重复次数是否大于0,大于0则减一,否则删除键值,释放锁资源
3.加锁失败后阻塞等待,等锁释放后再次尝试加锁
11. Redis 淘汰策略有哪些?
在Redis中,允许用户设置最大使用内存大小server.maxmemory,当Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
- volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰
- volatile-ttr:从已设置过期的数据集中挑选将要过期的数据淘汰
- volatile-random:从已设置过期的数据集中任意挑选数据淘汰
- allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
- allkeys-random:从数据集中任意挑选数据淘汰
- noenviction:禁止淘汰数据
redis淘汰数据时还会同步到aof
12. Redis 常见性能问题和解决方案?
- Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
- 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
- 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内,尽量避免在压力很大的主库上增加从库
- Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
- 为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master
- redis并发问题可以使用分布式锁
- redis持久化数据和缓存可以通过集群模式扩容
番外篇
混合持久化方式
Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。
redis和memcached比较
- memcached所有的值都是简单的字符串,redis支持更多的数据类型
- redis速度比memcached快很多
- redis可以持久化数据
- redis支持数据备份,即master-slave模式的数据备份
QPS和TPS
- QPS:应用系统每秒钟最大能接受的用户访问量
- TPS:每秒钟最大能处理的请求数
Redis面试宝典12道法相关推荐
- 1.Redis面试宝典
1.八股文带你吊打面试官之Redis 我们很多小伙伴平时会看很多面试八股文,但是经常遇到一个问题,结论是知道了,但是面试官继续深剖,问我们底层实现,这时我们懵圈了,因此我专门出一期面试突击专题,帮助各 ...
- 【2022最新Java面试宝典】—— Redis面试题(70道含答案)
目录 一.概述 1. 什么是Redis? 2. Redis有哪些优缺点? 3. 使用redis有哪些好处? 4. 为什么要用 Redis / 为什么要用缓存 5. 为什么要用 Redis 而不用 ma ...
- Java面试宝典(2018版)
置顶 2018年11月10日 23:49:18 我要取一个响亮的昵称 阅读数:8893 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen_28 ...
- 2021超全大数据面试宝典,吐血总结十万字,大数据面试收藏这一篇就够了
本文最新版已发布至公众号[五分钟学大数据] 获取此套面试题最新pdf版,请搜索公众号[五分钟学大数据],对话框发送 面试宝典 扫码获取最新PDF版: 版本 时间 描述 V1.0 2020-02-18 ...
- very very good,Java面试宝典+Java核心知识集
这几天刚整理出炉的两份最全"Java面试宝典+Java核心知识集"(very very good!!!),因此有了今天咱这篇文章,没错,我又来分享干货了!!! Java面试宝典 说 ...
- 【2022最新Java面试宝典】—— Java虚拟机(JVM)面试题(51道含答案)
目录 一.Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 2. 为什么说java是跨平台语言 3. Jdk和Jre和JVM的区别 4. 说一下 JVM由那些部分组成,运行流程 ...
- 【2022最新Java面试宝典】—— Java并发编程面试题(123道含答案)
目录 一.基础知识 1. 为什么要使用并发编程 2. 多线程应用场景 3. 并发编程有什么缺点 4. 并发编程三个必要因素是什么? 5. Java 程序中怎么保证多线程的运行安全? 6. 并行和并发有 ...
- about云大数据面试宝典 大公司面试一般用不到
阿里四轮面试总结 第一轮面试电话(**5** 月 6 号): 1.自我介绍,包括做过项目. 2.有看过哪些 JDK 源码,了解哪些常用库. 3.集合框架 HashMap 的扩容机制,Concurrne ...
- 2019史上最全java面试题题库大全800题含答案(面试宝典)
2019史上最全java面试题题库大全800题含答案(面试宝典) 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中 ...
- java面试宝典备份
转自: https://blog.csdn.net/HuaZi_Myth/article/details/93894334 java面试宝典备份 1.[ meta标签的作用是什么](http://w ...
最新文章
- 爬取--- https://www.exploit-db.com/ 下载POC较完善的代码【2】
- 如何初始化一个定长ListT
- H5直播系列四 RTMP HTTP-FLV HLS MPEG-DASH
- Packet tracer软件安装,模拟网络搭建【Packet tracer安装和使用】
- sourceinsight4 quicker._我要以一打十!Quicker:新一代Windows必备效率神器!
- RequestToViewNameTranslator
- 微软Build 2018展示Visual Studio功能:跨系统云编程
- eclipse xml文件中按没有提示
- Boostrap技能点整理之【按钮样式】
- 利用Python把四张图片按照顺序拼接起来
- kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
- 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...
- 论文笔记_S2D.74_2021_ICRA_PENet:面向精确和高效的图像引导的深度补全
- java 创建线程的三种方式、创建线程池的四种方式
- 3.关于python函数,以及作用域,递归等知识点
- 肇庆学院计算机论文选题,肇庆学院本科毕业论文(设计)写作与印制规范
- ConneR and the A.R.C. Markland-N
- macOS Big Sur 安装 CH340 串口转 USB 驱动
- 记Vivado使用,报错记录本
- 2021011086解祎梦实验五
热门文章
- 计算机一级win7win10,win7升级win10数据是否会丢失?
- 《LaTeX入门》刘海洋的杂谈勾股定理的完整源码
- 《上帝给我一个任务,叫我牵一只蜗牛去散步》
- 我的java语法基础篇刷题2
- python有没有网页版的pyqt_Python PyQT Web浏览器书签
- html实现手机截屏,iPhone手机如何实现网页长截图?
- 【计算机图形学 】绘制椭圆 | OpenGL+鼠标交互
- java 里大于且小于_java-浮点数大于或小于零
- linux下查看网卡vid,Linux下查看USB设备的VID、PID命令
- ubuntu 校准时间_ubuntu server自动校正时间 | 学步园