当前位置: 首页 > news >正文

JavaRedis-主从集群-分片-数据结构-回收处理-缓存问题

一、主从集群

1.主从集群

主从集群读写分离,主能读能写,从只能读,读的数据是同步主的

docker搭建:

docker-compose

这里设置网络模式为model,就直接暴露在了宿主机中,就不用映射端口了
不改就是默认的桥接模式

建立主从关系:

进入从redis:

输入命令:

2.主从同步原理

①怎么判断第一次同步

建立主从关系后每个主从replicationID变成一样

②如何把所有数据发送

主会先将自己的数据持久化存入RDB文件中,然后直接把文件给从,从删除自己原有数据,再加载这个文件中的数据

③主怎么知道从缺少什么数据

首先建立主从关系后就会有一个repl_backlog缓存区来记录从一开始的命令,并有一个值offset来记录执行命令条数。只要是断开重连的还会携带offset,与repl_backlog中进行比较,然后就会把差的命令传给从。

④主从集群优化

repl_backlog是一个环形数组,写满后会覆盖原先的数据

因为宕机重连的时间不会很长,就算一直往主中写数据,从也会不断赶着去写,只要主停下来就会追上

但是如果宕机时间太长,长到未同步的数据也被覆盖了就会数据不同步,只能全量同步

所以判断是否第一次来时还会判断是否被覆盖

优化方案:

前两个是对全量同步的优化

3.哨兵原理

①怎么发现服务故障

②怎么选取新的slave为master

slave-piority是默认的为1不配置的话
运行id大小是随机的,就是随机挑
最重要的就是:offset

③如何实现故障转移

4.搭建哨兵集群

哨兵配置:

第一个是哨兵的ip,第二个是监控的集群名字,主从集群的master节点端口,以及超过多少数量哨兵算客观下线,第三个是多久不连接判断是下线,第四个是多久进行一次故障恢复,只要失败就过多久再故障恢复

搭建步骤:

day10-Redis面试篇 - 飞书云文档 (feishu.cn)

二、Redis分片

主从和哨兵是备份的,所以它的容量上限是单节点的。而且不能设置的太高,太高主从同步,数据持久化的效率都会非常低,一般不超过8g

分片集群,就是不同主从集群保存了不同的数据,且主节点互相监控健康状态,如果宕机会让宕机的集群中从节点变成主节点。

缺点:集群结构很复杂,成本很高,只有在大型企业中有应用。

1.分片集群搭建

①以cluster模式运行redis

可以在compose文件中直接部署。

②建立分片集群连接

2.散列插槽

就是怎么分配数据

三、Redis数据结构

1.RedisObject

lru和refcount是判断是否回收的依据

编码方式眼熟即可:

2.SkipList

链表查询效率低,因为查询跨度是1,只能从一个一个去查

允许32级指针

通过跳着和后面节点建立连接,当需要查询后面的节点时就可以跳着向后面进行查询,空间换时间

3.SortedSet

就是ZSet

就是首先会使用哈希表进行数据的存储,放入member再用链表将每一个member连起来。
其次还会使用跳表,根据score将数据进行排序,每个节点包含了score和member

当我想知道一个member的排名时就会先从哈希表中拿到它的score,然后再去跳表中,查询到score对应的排序。

四、Redis回收处理

1.过期KEY处理

可以给Key设置过期时间

①如何知道键过期

②过期处理

2.内存淘汰策略

之前说到,一个数据RedisObject包含了lru:最后访问时间,可以根据它们对过期KEY回收。这是其中淘汰策略会用到的数据

基本使用LRU或者LFU中进行选择。但是LRU可能就重要的没有不重要的被访问最近,所以最优是LFU。

底层怎么知道最后访问时间和访问频率就是redisObject中的一个lru字段。

逻辑访问次数是:只有频率足够大的时候才会加一。往上加很难,还会随时间衰减。

五、缓存问题

1.缓存一致性

这里对缓存数据设置了TTL就可以有兜底方案,如果更新数据库缓存失败,也会在一个时间段后去更新缓存。

  1. 这里有些增可以不同步,当别人查的时候再去更新缓存。例如当我添加菜品分类时,可以不添加相应缓存,但是添加菜品的一个信息还是需要更新缓存。
  2. 然后删可以直接删除。
  3. 改的话也删除,当查了就会进行缓存。

如果增删改先操作redis后操作数据库,并发情况下会造成数据不一致的问题:

如果一个查一个改线程同时来,改了redis还没来得及改数据库,查的发现redis没了去查数据库。查比改数据库快,就会返回旧数据库的数据。数据不一致

所以得先操作数据库,再操作redis:
但是在极端情况下也会出现不一致:

查发现Redis中数据刚好过期,去读数据库并缓存redis之前发生了另一个线程去更新数据库,删除redis的操作。这两个操作后再去缓存数据,缓存的是旧数据。
条件很苛刻

2.缓存穿透

布隆过滤器的作用方式就是将存入redis中的所有key利用哈希函数做运算在一个很长的二进制数上做标记,这样就可以在空间占用率很低的情况下判断key是否存在。

3.缓存雪崩

避免同一时段大量缓存key同时失效采用失效值为随机

避免宕机采用集群的方式

兜底方案:
(1)有redis宕机后,对查询的业务限流或者直接熔断不让访问

(2)添加多级缓存:

浏览器本地缓存,缓存静态资源
nginx建立缓存,缓存更新麻烦,缓存都是一致性低,更新频率低的缓存
可以jvm进行本地缓存
再考虑缓存redis

4.缓存击穿

互斥锁就是当一个线程发现失效后就会拿到锁去进行重建,其他线程访问到时拿不到锁就一直等待查看是否命中。

逻辑过期就是不设置TTL,数据中多一个过期时间的字段。在程序中实现,发现如果这个字段已经过期,拿到锁就开启一个线程去重建,自己就返回旧数据。其他线程在还没重建完前发现拿不到锁就也返回旧数据结束。

相关文章:

JavaRedis-主从集群-分片-数据结构-回收处理-缓存问题

一、主从集群 1.主从集群 主从集群读写分离,主能读能写,从只能读,读的数据是同步主的 docker搭建: docker-compose 这里设置网络模式为model,就直接暴露在了宿主机中,就不用映射端口了 不改就是默认的桥…...

Java原生JDBC概览

Java原生JDBC概览 一、是什么? JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。 Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现对数据库的访…...

C# 跨线程访问UI组件,serialPort1串口接收数据

在Windows应用程序(例如WinForms或WPF)中,UI组件(如按钮、文本框等)都在主线程(也称为UI线程)上运行。当你在一个非UI线程(例如,一个后台线程或者网络请求线程&#xff0…...

D - New Friends(AtCoder Beginner Contest 350)

题目链接: D - New Friends (atcoder.jp) 题目大意: 题目解析: 题目的大致意思: 假如A和B是朋友 B和C也是朋友 那么当A和C不是朋友的时候 可以通过B让A和C也成为朋友 问你增加了多少对的朋友关系 题目分析: 咱们可以从图论去考虑 当这一群是一个连通块 那么这一群点(人) 都…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(2)

1.问题描述: 怎么判断登录的华为帐号有变动? 解决方案: 华为帐号登录成功后会返回唯一标识OpenID和UnionID,如果切换不同的华为帐号登录,这个唯一标识会变。 OpenID是华为帐号用户在不同类型的产品的身份ID&#x…...

Web组态可视化编辑器 快速绘制组态图

演示地址:by组态[web组态插件] 随着工业智能制造的发展,工业企业对设备可视化、远程运维的需求日趋强烈,传统的单机版组态软件已经不能满足越来越复杂的控制需求,那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于…...

怎样在网上赚点零花钱?推荐十个正规的赚钱兼职平台

今天要和大家探讨一个激动人心的话题——网络赚钱。在这个互联网日新月异的时代,网络赚钱已经变成了触手可及的现实。如果你正打算在网上赚取一些额外收入,那么这篇文章绝对值得一读! 在这个信息泛滥的时代,网络赚钱的机遇随处可…...

手动操作很麻烦?试试这个自动加好友神器吧!

你是不是也觉得手动逐一输入号码或是微信号,再搜索添加很麻烦?试试这个自动加好友神器——个微管理系统,帮助你省去繁琐的手工操作,节省时间和精力。 首先,在系统上登录微信号,无论你有多少个微信号&#…...

金额转大写

金额转大写 /*** 金额转大写* param n* returns {string}*/ export const moneyUppercase (n) > {let fraction [角, 分];let digit [零, 壹, 贰, 叁, 肆,伍, 陆, 柒, 捌, 玖];let unit [[圆, 万, 亿],[, 拾, 佰, 仟]];let head n < 0 ? 欠 : ;n Math.abs(n);let…...

vue的axios配置超时时间;单个接口配置响应时间

vue项目中axios请求统一配置了超时时间&#xff0c;单独接口请求时重设超时时间 根据官网推荐&#xff1a;axios中文文档 1.配置的优先顺序 配置会以一个优先顺序进行合并。这个顺序是&#xff1a;在 lib/defaults.js 找到的库的默认值&#xff0c;然后是实例的 defaults 属性&…...

leetcode-盛水最多的容器-109

题目要求 思路 1.正常用双循环外循环i从0开始&#xff0c;内循环从height.size()-1开始去计算每一个值是可以的&#xff0c;但是因为数据量太大&#xff0c;会超时。 2.考虑到超时&#xff0c;需要优化一些&#xff0c;比如第一个选下标1&#xff0c;第二个选下标3和第一个选下…...

VMware ESXi中安装Proxmox VE

0、巴拉巴拉 前几天某行业HW&#xff0c;闲暇的时候几个技术人员聊天&#xff0c;臭味相投的聊到自己玩的东西。有个玩家说家里用工作站安装Proxmox VE&#xff0c;然后在上面安装软路由、安装NAS。我以前一直想玩玩&#xff0c;没有付诸行动&#xff0c;所以也想弄个集中的方案…...

Java(其十二)--集合·初级

ArrayList集合 集合有很多种&#xff0c;ArrayList 是最常用的一种&#xff0c;集合的作用相当于C中的STL 最显著的特点就是&#xff1a;自动扩容。 一般定义式 ArrayList list new ArrayList(); //该 list 是可以储存各种类型的数据的&#xff0c;要想约束储存的数据&#x…...

疯狂“造人”!美国两党共推新法案,5年培养100万AI及量子人才

当前&#xff0c;全球量子计算人才的短缺已成为制约该领域快速发展的关键瓶颈。 为了解决量子计算人才短缺的问题&#xff0c;各国政府和企业采取了积极措施&#xff0c;加大了对量子教育和培训的投入。根据美国参议院官网消息&#xff0c;2024年5月23日&#xff0c;美国两党议…...

Python 文件操作指南:使用 open 和 with open 实现高效读写

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本系列文章主要分享文件操作&#xff0c;了解如何使用 Python 进行文件的读写操作&#xff0c;介绍常见文件格式的读取和写入方法&#xff0c;包括TXT、 CS…...

FasterNet代码阅读

FasterNet 类参数初始化 将图像切分为非重叠的图像块 PatchEmbed 类 将图像分解为非重叠的图像块有以下几个好处&#xff1a; 1. 缩小计算量&#xff1a;对于大尺寸的图像&#xff0c;直接对整个图像进行处理可能会导致计算和内存消耗过大。将图像切分为小块可以降低计算量…...

Rust开源Web框架Salvo源码编译

1.克隆源码: https://github.com/salvo-rs/salvo.git 2.进入salve目录并运行cargo build编译 编译成功 3.编译生成的库 4.安装salve-cli git clone --recursive https://github.com/salvo-rs/salvo-cli.git 编译salve-cli...

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 新闻资讯 的设计与实现

一.项目介绍 本系统分为 后端 和 小程序端 后端&#xff1a;点击登录按钮 设置个人中心、 管理员账号数据维护、 基础数据维护、 短视频信息维护(包括查看短视频留言、短视频收藏)、 论坛维护(增删改查帖子信息&#xff0c;包括查…...

TCP—三次握手和四次挥手

目录 一、三次握手和四次挥手的目的 二、TCP可靠的方面 三、什么是三次握手 四、第三次握手的目的 五、什么是四次挥手 六、超时时间的目的 七、SYN包、ACK包、FIN包 八、解决丢包和乱序 九、参考资料 一、三次握手和四次挥手的目的 TCP三次握手的目的主要是为了确保两…...

基于UDP的网络聊天室

一.项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 二.服务器端 #include <myhead.h&…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...