【java八股文】之Redis基础篇

【java八股文】之JVM基础篇-CSDN博客

【java八股文】之MYSQL基础篇-CSDN博客

【java八股文】之Redis基础篇-CSDN博客

【java八股文】之Spring系列篇-CSDN博客

【java八股文】之分布式系列篇-CSDN博客

【java八股文】之多线程篇-CSDN博客

【java八股文】之JVM基础篇-CSDN博客

【java八股文】之计算机网络系列篇-CSDN博客

1、Redis有哪几种基本的数据类型

  • 字符串类型:用于存储文章的访问量
  • Hash:用来存储key-value的数据结构,当单个元素比较小和元素数量比较少的时候 ,底层是用ziplist存储。通常可以用来存储一些对象之类的
  • List: 底层采用的quicklist 和 ziplist进行存储的,quicklist就是类似于双端的链表,这样做的好处就是提高存取的效率。通常用作微信公众号的推送消息队列
  • Set:底层就是hashtable的value为空的数据结构,通常用作点赞 + 收藏 之类
  • ZSet: 底层使用的跳表和字典,调表方便于对排好序的数据查询 , 通常用作类似于微博的热搜
  • bitmap:一般用于签到功能或者是统计是否登录的功能上

2、Redis持久化机制

  • 快照持久化RDB

在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。

​ redis的默认持久化机制,通过父进程fork一个子进程,子进程可以共享主线程的所有内存数据。bgsave 子进程 运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读操作, 那么,主线程和 bgsave 子进程相互不影响。但是,如果主线程要修改一块数据,那么,这块数据就会被复制 一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程 仍然 可以直接修改原来的数据。

  • 追加持久化AOF

​ 以日志形式记录每一次的写入和删除操作,策略有每秒同步、每次操作同步、不同步,优点是数据完整性高, 缺点是运行效率低,恢复时间长

3、Redis是单线程吗

redis单线程仅局限于他的网络IO流,和他的键值对读写操作。但是redis对于其他的功能,比如持久化、异步的删除、集群同步等操作,都是额外的线程操作的。

4、为什么Redis单线程还这么快

因为redis所有数据都是在内存中,所有的运算都是内存级别的,而且单线程避免了多线程切换的性能损耗问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。

5、Redis单线程还能处理那么多的并发客户端连接

Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。

6、什么是缓存穿透

缓存穿透就是查询到一些不存在的数据,本来缓存层就是为了保护存储层的,而这样直接穿透到存储层就起不到保护的作用。

如何解决:在缓存存这是访问的key 为 一个null的值,并设置一个过期时间。或者提前在接口层做好校验工作

7、什么是缓存击穿

由于大批量的缓存在同一时刻失效,大量请求过来就穿透缓存到达存储层,可能造成存储层压力过大甚至挂掉。

如何解决:设置一个随机的过期时间,而不是同一时刻都过期。或者加上互斥锁。

8、什么是缓存雪崩

缓存雪崩指的是缓存层支撑不住或宕掉后,流量会像奔逃的野牛一样, 打向后端存储层。由于缓存层承载着大量请求, 有效地保护了存储层, 但是如果缓存层由于某些原因不能提供服务(比如超大并发过来,缓存层支撑不住,或者由于缓存设计不好,类似大量请求访问bigkey,导致缓存能支撑的并发急剧下降), 于是大量请求都会打到存储层, 存储层的调用量会暴增, 造成存储层也会级联宕机的情况。

预防和解决缓存雪崩问题:

  • 保证缓存层服务高可用性,比如使用Redis Sentinel或Redis Cluster。
  • 依赖隔离组件为后端限流熔断并降级。比如使用Sentinel或Hystrix限流降级组件。比如服务降级,我们可以针对不同的数据采取不同的处理方式。当业务应用访问的是非核心数据(例如电商商品属性,用户信息等)时,暂时停止从缓存中查询这些数据,而是直接返回预定义的默认降级信息、空值或是错误提示信息;当业务应用访问的是核心数据(例如电商商品库存)时,仍然允许查询缓存,如果缓存缺失,也可以继续通过数据库读取。
  • 提前演练。 在项目上线前, 演练缓存层宕掉后, 应用以及后端的负载情况以及可能出现的问题, 在此基础上做一些预案设定。


9、Redis如何实现key的过期删除?

采用的定期过期 + 惰性过期

  • 定期删除 :Redis 每隔一段时间从设置过期时间的 key 集合中,随机抽取一些 key ,检查是否过期,如果已经过期做删除处理。
  • 惰性删除 :Redis 在 key 被访问的时候检查 key 是否过期,如果过期则删除。

10、缓存与数据库双写不一致

在大并发下,同时操作数据库与缓存会存在数据不一致性问题

1)双写不一致情况


2)读写并发不一致


3)解决方案

  • 对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致,可以给缓存数据加上过期时间,每隔一段时间触发读的主动更新即可。
  • 就算并发很高,如果业务上能容忍短时间的缓存数据不一致(如商品名称,商品分类菜单等),缓存加上过期时间依然可以解决大部分业务对于缓存的要求。
  • 如果不能容忍缓存数据不一致,可以通过加读写锁保证并发读写或写写的时候按顺序排好队,读读的时候相当于无锁。
  • 也可以用阿里开源的canal通过监听数据库的binlog日志及时的去修改缓存,但是引入了新的中间件,增加了系统的复杂度。


11、Redis集群方案

(1)主从模式:多个master节点,多个slave节点,master节点宕机slave自动变成主节点

(2)哨兵模式:在主从集群基础上添加哨兵节点或哨兵集群,用于监控master节点健康状态,通过投票机制选择slave成为主节点

(3)分片集群:主从模式和哨兵模式解决了并发读的问题,但没有解决并发写的问题,因此有了分片集群。分片集群有多个master节点并且不同master保存不同的数据,master之间通过ping相互监测健康状态。客户端请求任意一个节点都会转发到正确节点,因为每个master都被映射到0-16384个插槽上,集群的key是根据key的hash值与插槽绑定

12、Redis集群主从同步原理

主从同步第一次是全量同步:slave第一次请求master节点会根据replid判断是否是第一次同步,是的话master会生成RDB发送给slave。

主从复制(全量复制)流程图:

后续为增量同步:在发送RDB期间,会产生一个缓存区间记录发送RDB期间产生的新的命令,slave节点在加载完后,会持续读取缓存区间中的数据。

主从复制(部分复制,断点续传)流程图:

13、Redis集群为什么至少需要三个master节点,并且推荐节点数为奇数?

新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。

奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。

14、Redis集群选举原理分析

当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

  • slave发现自己的master变为FAIL
  • 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息
  • 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
  • 尝试failover的slave收集master返回的FAILOVER_AUTH_ACK
  • slave收到超过半数master的ack后变成新Master(这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)
  • slave广播Pong消息通知其他集群节点。
     

 可以查看学习以下关于Redis的博文,希望对您有用。

Redis入门学习笔记【一】-CSDN博客

Redis入门学习笔记【二】Redis缓存-CSDN博客

Redis入门学习笔记【三】Redis淘汰策略-CSDN博客

Redis入门学习笔记【四】Redis持久化-CSDN博客

Redis入门学习笔记【五】Redis在分布式环境下常见的应用场景_redis与分布式id的运用场景-CSDN博客

Redis入门学习笔记【六】如何解决 Redis 的并发竞争Key问题_redis中的key并发获取-CSDN博客

Redis入门学习笔记【七】Redis如何保证缓存与数据库双写时的数据一致性-CSDN博客

【Redis读书笔记】Redis集群的三大模式_redis master挂了,启动如何成为 salve-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/323016.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony—Docker编译环境

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下: 独立Docker环境:适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

视频和音频怎么合并在一起?分享3个轻松合并的实用技巧

视频和音频怎么合并在一起?在数字媒体时代,视频和音频是制作多媒体内容不可或缺的元素。有时我们需要将视频和音频合并在一起,以创建更丰富、更有趣的多媒体内容。那么,如何将视频和音频合并在一起呢?下面将介绍一些实…

【C++】__declspec含义

目录 一、__declspec(dllexport)如果这篇文章对你有所帮助,渴望获得你的一个点赞! 一、__declspec(dllexport) __declspec(dllexport) 是 Microsoft Visual C 编译器提供的一个扩展,用于指示一个函数或变量在 DLL(动态链接库&…

scrapy爬虫实战

scrapy爬虫实战 Scrapy 简介主要特性示例代码 安装scrapy,并创建项目运行单个脚本代码示例配置itemsetting 爬虫脚本 代码解析xpath基本语法:路径表达式示例:通配符和多路径:函数:示例: 批量运行附录1&…

自动化测试 - Web自动化测试原理

目前市面上有很多Web UI自动化测试框架,比如WatiN, Selinimu,WebDriver,还有VS2010中的Coded UI等等. 这些框架都可以操作Web中的控件,模拟用户输入,点击等操作,实现Web自动化测试。其实这些工具的原理都一样&#xff…

谷达冠楠:抖店新手小白适合卖什么

随着抖音平台的不断发展,越来越多的人开始尝试在抖音上开设自己的店铺,希望通过这个平台实现创业梦想。然而,对于新手小白来说,如何选择合适的商品进行销售是一个非常重要的问题。本文将为您介绍一些适合抖店新手小白销售的商品类…

若依框架实现排序【升序或降序】很简单

前端实现 1. 在表格上加监听函数sort-change。如下红框所示: 2. 在表行上加排序字:sort-orders,可排序字sortable。如下红框所示: 3. 添加监听函数实现。代码如下: handleSortChange(column) {this.queryParams.orderByColumn …

什么是云服务器ECS - 云服务器 ECS - 阿里云

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云百科aliyunbai…

云渲染农场渲染和自己搭建农场渲染怎么选?哪个更划算?

当我们面临繁重或紧急的渲染任务时,通常会选择云渲染的解决方案。可能很多人会问,我们是否能够自行建立一个小型的个人农场进行渲染呢?与云渲染农场相比,哪个更划算?更方便?接下来就带大家看看…

Yii实现邮件发送

一:yiisoft/yii2-swiftmailer拓展安装 composer require yiisoft/yii2-swiftmailer github地址:https://github.com/yiisoft/yii2-swiftmailer 文档地址:https://www.yiichina.com/doc/guide/2.0/tutorial-mailing 二:开启邮箱…

一刀切转为精细化,门店如何进行「体检式」巡查(一)

在品牌经营过程中,无论是直营店还是加盟商,都需要做好统一的品牌门店管理。比如总部对门店环境卫生、员工服务质量、货品质量等进行定期或不定期的巡检抽查,以确保各门店保持统一标准。 以往,传统巡店只能通过有纸质表格或微信汇报…

线程之间如何传递上下文信息

文章目录 源码解读1. 扩展ThreadPoolExecutor2. 扩展Runnable3. 整体流程 源于工作中一个业务场景的需求。 源码 话不多说&#xff0c;先贴完整的源码&#xff1a; public class ContextPassingBetweenThread {private static ThreadLocal<String> CONTEXT new Thread…

如何构建高质量,低成本的移动机器人(AGV/AMR)?

中国移动机器人行业规模的不断扩大&#xff0c;低成本无人化是现市场需求突出的特点之一。然而研发一套完整的移动机器人导航方案不仅需要耗费大量的人力成本&#xff0c;还要经过漫长的市场验证&#xff0c;这将滞后整个产业的发展&#xff0c;并有可能错失市场的抢占先机。 如…

coala,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - coala。 Github地址&#xff1a;https://github.com/coala/coala/ 在现代软件开发中&#xff0c;代码质量和一致性是非常重要的。然而&#xff0c…

多合一小程序商城系统源码:支持全平台端口 附带完整的搭建教程

现如今&#xff0c;随着移动互联网的飞速发展&#xff0c;小程序已经成为电商行业的新宠。罗峰给大家分享一款多合一小程序商城系统源码。该系统旨在为商家提供一个功能强大、易于搭建和管理的电商平台&#xff0c;帮助商家快速占领市场&#xff0c;提高品牌影响力。 以下是部…

springmvc内嵌tomcat、tomcat整合springmvc、自研国产web中间件

springmvc内嵌tomcat、tomcat整合springmvc、自研国产web中间件 这是由于公司老项目转化springboot存在太多坑&#xff0c;特别是hibernate事务一条就坑到跑路&#xff0c;你又不想搞没听说过的国产中间件兼容&#xff0c;又不想搞weblogic、WebSphere等中间件的适配&#xff…

Linux信号之信号的保存

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、阻塞信号 1.信号递达、未决、阻塞 2.内核…

flutter给组件设置背景图的操作

可以设置背景图的组件只有一个&#xff0c;那就是Container容器&#xff0c;要想设置背景图&#xff0c;可以使用网路图片&#xff0c;也可以使用本地图片&#xff0c;要是使用本地图片&#xff0c;需要在本地添加一个资源路径&#xff0c;用来管理这些文件&#xff0c;在本地项…

大量文件重命名数字排序有什么好方法?快来看这里

随着数字时代的到来&#xff0c;我们每天都会处理大量的文件&#xff0c;无论是工作还是生活。为了更好地管理和查找这些文件&#xff0c;我们通常会使用数字排序来对它们进行排列。那么&#xff0c;为什么要给大量文件添加数字排序呢&#xff1f; 首先&#xff0c;数字排序可以…

开关电源如何覆铜

开关电源如何覆铜 开关电源覆铜是一个很重要的技术方法&#xff0c;如果没有很好的覆铜&#xff0c;就有可能会造成开关电源芯片的损坏。先介绍常见的开关电源电路&#xff1a; 图 1开关电源电路 从左到右分别是非同步整流Buck电路和同步整流Buck电路&#xff0c;第二排从左到…