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. 1.Redis面试宝典

    1.八股文带你吊打面试官之Redis 我们很多小伙伴平时会看很多面试八股文,但是经常遇到一个问题,结论是知道了,但是面试官继续深剖,问我们底层实现,这时我们懵圈了,因此我专门出一期面试突击专题,帮助各 ...

  2. 【2022最新Java面试宝典】—— Redis面试题(70道含答案)

    目录 一.概述 1. 什么是Redis? 2. Redis有哪些优缺点? 3. 使用redis有哪些好处? 4. 为什么要用 Redis / 为什么要用缓存 5. 为什么要用 Redis 而不用 ma ...

  3. Java面试宝典(2018版)

    置顶 2018年11月10日 23:49:18 我要取一个响亮的昵称 阅读数:8893 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen_28 ...

  4. 2021超全大数据面试宝典,吐血总结十万字,大数据面试收藏这一篇就够了

    本文最新版已发布至公众号[五分钟学大数据] 获取此套面试题最新pdf版,请搜索公众号[五分钟学大数据],对话框发送 面试宝典 扫码获取最新PDF版: 版本 时间 描述 V1.0 2020-02-18 ...

  5. very very good,Java面试宝典+Java核心知识集

    这几天刚整理出炉的两份最全"Java面试宝典+Java核心知识集"(very very good!!!),因此有了今天咱这篇文章,没错,我又来分享干货了!!! Java面试宝典 说 ...

  6. 【2022最新Java面试宝典】—— Java虚拟机(JVM)面试题(51道含答案)

    目录 一.Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 2. 为什么说java是跨平台语言 3. Jdk和Jre和JVM的区别 4. 说一下 JVM由那些部分组成,运行流程 ...

  7. 【2022最新Java面试宝典】—— Java并发编程面试题(123道含答案)

    目录 一.基础知识 1. 为什么要使用并发编程 2. 多线程应用场景 3. 并发编程有什么缺点 4. 并发编程三个必要因素是什么? 5. Java 程序中怎么保证多线程的运行安全? 6. 并行和并发有 ...

  8. about云大数据面试宝典 大公司面试一般用不到

    阿里四轮面试总结 第一轮面试电话(**5** 月 6 号): 1.自我介绍,包括做过项目. 2.有看过哪些 JDK 源码,了解哪些常用库. 3.集合框架 HashMap 的扩容机制,Concurrne ...

  9. 2019史上最全java面试题题库大全800题含答案(面试宝典)

    2019史上最全java面试题题库大全800题含答案(面试宝典) 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中 ...

  10. java面试宝典备份

    转自:  https://blog.csdn.net/HuaZi_Myth/article/details/93894334 java面试宝典备份 1.[ meta标签的作用是什么](http://w ...

最新文章

  1. 爬取--- https://www.exploit-db.com/ 下载POC较完善的代码【2】
  2. 如何初始化一个定长ListT
  3. H5直播系列四 RTMP HTTP-FLV HLS MPEG-DASH
  4. Packet tracer软件安装,模拟网络搭建【Packet tracer安装和使用】
  5. sourceinsight4 quicker._我要以一打十!Quicker:新一代Windows必备效率神器!
  6. RequestToViewNameTranslator
  7. 微软Build 2018展示Visual Studio功能:跨系统云编程
  8. eclipse xml文件中按没有提示
  9. Boostrap技能点整理之【按钮样式】
  10. 利用Python把四张图片按照顺序拼接起来
  11. kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
  12. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...
  13. 论文笔记_S2D.74_2021_ICRA_PENet:面向精确和高效的图像引导的深度补全
  14. java 创建线程的三种方式、创建线程池的四种方式
  15. 3.关于python函数,以及作用域,递归等知识点
  16. 肇庆学院计算机论文选题,肇庆学院本科毕业论文(设计)写作与印制规范
  17. ConneR and the A.R.C. Markland-N
  18. macOS Big Sur 安装 CH340 串口转 USB 驱动
  19. 记Vivado使用,报错记录本
  20. 2021011086解祎梦实验五

热门文章

  1. 计算机一级win7win10,win7升级win10数据是否会丢失?
  2. 《LaTeX入门》刘海洋的杂谈勾股定理的完整源码
  3. 《上帝给我一个任务,叫我牵一只蜗牛去散步》
  4. 我的java语法基础篇刷题2
  5. python有没有网页版的pyqt_Python PyQT Web浏览器书签
  6. html实现手机截屏,iPhone手机如何实现网页长截图?
  7. 【计算机图形学 】绘制椭圆 | OpenGL+鼠标交互
  8. java 里大于且小于_java-浮点数大于或小于零
  9. linux下查看网卡vid,Linux下查看USB设备的VID、PID命令
  10. ubuntu 校准时间_ubuntu server自动校正时间 | 学步园