大家好,我是一个狂野的国王。最近,我一直听说Moutai很热。我今天无事可做。我准备吃饭,尝试自己。
好吧,我不会说太多胡说八道,我得到了干货
在同时编程中,我们可以避免通过锁定引起的竞争引起的数据不一致。通常,我们已经使用了(单个机器情况)
让我们看一个案例:
问题分析:
实施思维:锁的实现主要基于redis命令:
setnx键值
密钥的值是阀门,只有在不存在密钥的情况下。
如果给定键已经存在,则SETNX无需做任何事情。
setnx是“如果不存在的设置”的缩写(如果不存在,则设置)。
返回值:成功设置,返回1个设置失败,返回0
使用同步锁的过程和事项如下:
实施代码版本1:
问题分析:
2.错误解锁(如何确保铃铛也是铃铛:向锁中添加一个唯一的徽标)
错误解锁问题解决方案:
锁定期/锁定生活
拉特森
Redisson概述具有一系列分布式对象,分布式集合,分布式锁,分布式服务和许多其他功能特性。它是基于Redis实现的基于工具包的工具包。系统体系结构中的高速缓存中间件的最佳选择。
下载地址:https://github.com/redisson/redisson
完成
源代码分析
介绍:
问题1:什么是REDIS缓存渗透?如何解决缓存渗透?
问题2:如何快速确定一个元素是否存在于大量元素中(例如10亿,无限期长,不重复)?
伯顿·霍华德·布鲁姆(Burton Howard Bloom)于1970年提出了布鲁姆过滤器,这是具有高空间效率的概率数据结构。
本质上,它实际上是一个长的二进制向量和一系列随机映射功能。特别是用于检测集合中是否有特定元素
回顾生成的机会,我们通常在测试集中有一个元素时使用比较方法。考虑以下内容:
总而言之,当集合中的元素数量很大时,不仅搜索会变得非常慢,而且所占用的空间也很大,以至于无法想象。BF是解决这一矛盾的武器。
数据结构和设计思想BF是由位数组组成的数据结构,K具有哈希函数。位数组初始化为0,所有哈希函数都可以尽可能均匀地分布在输入数据中。
基于位图:
如果我们想将一个值映射到Bloom过滤器,则需要使用多个不同的哈希功能来生成多个哈希值并将位设置为每个生成的哈希值。设置为1比1
例子:
当您要插入元素时,请单独输入k Hash函数以生成k HASH值。将哈希值作为位中的出价列为bid,所有相应的k的位置都设置为1。
当您要查询(即,要确定是否存在)时,数据也将输入到哈希函数中,然后检查相应的k位。如果有0的位,则表明元素必须不在集合中。如果所有位均为1,则表明(较大)(较大)(较大)可能性的可能性。当时不得在集合中?,这是如此被称为“假阳性”。相比之下,“假否定”永远不会出现在BF中。
分析错误判断率的问题
哈希函数具有以下两个特征:
Bloom过滤器的错误判断意味着哈希之后的多个输入位置1位于同一位位置1,因此无法确定生成哪个输入。SET1。
这种情况不支持删除哈希碰撞,这也会导致删除Bloom过滤器的问题。传统的Bloom滤波器不支持删除操作,因为每一位Bloom滤波器都不是独有的,它可能具有多个。该元素共享某个元素。如果我们直接删除此元素,它将影响其他元素。
如何选择哈希函数的数量和Bloom过滤器的长度很明显。太小的花朵过滤器很快所有的钻头都是1,然后查询将返回“可能的”。余长的长度将直接影响误解率。闭合过滤器越长,错误率越小。
此外,哈希功能的数量也需要称重。Bloom滤波器位位置1的数量越多,位置位置的位置越快,并且Bloom滤波器的效率越低;但是,如果有太多的报告率将会变得更高。
如何选择适合业务的K值,以下是一个直接的公式:
第一个方法:1。介绍Guava POM配置
2.代码实现
操作结果:
有947个错误判断100,000个数据,约为0.01%,即代码中设置的错误判决率:fpp = 0.01
代码分析:
核心方法:
这里有四个参数:
让我们专注于参数
FPP错误判断率场景1:
方案2 :(默认参数)
总结第二种方法:番石榴在redisson上使用的绽放过滤器是将数据放在本地内存中。分布式场景不合适,并且无法共享内存
您也可以使用Redis实现Bloom滤镜。这是Redis封装的客户端工具Redisson
POM配置:
Java代码:
1.1.1简介
ACT.TWEMPROXY是REDIS认可的最广泛认可的实施解决方案。
特征:
备忘录的时代可以称为国王,但是随着Redis本身的发展,尤其是高版本集群的出现,它逐渐被削弱
优势:
简单可靠,具有生产级别的应用功能
减少重新连接的数量并降低重新连接的成本。群集的所有节点都需要建立彼此的连接。
除了Redis外,Twemproxy还可以充当模拟协议的代理,并且是缓存世界中的通用解决方案。
缺点:
与群集相比,性能有一定的损失(约为Twitter测试的20%)
这也将成为一个点,因此重要的是要进行双重工作!
这只是一个代理转发,基本的主切换仍依赖Redis自己的,通过Sentinel或Cluster。集群在这一点上滥用了它
1.1.2下载和部署
1.1.3配置和开始1)首先准备两个Redis
2)配置Twemproxy
3)连接和验证
1.1.4尺寸策略1)读写原理
在写作时,TWEMProxy计算到相应的背端redis机器的多个相应的键计算哈希值。
当检查REDIS群集中的相应键/值时,Twemproxy还计算从相应的后端redis收集的哈希值,然后将其索成并返回给用户。
2)策略
可以通过以下算法分配后台的Redis或Memcached群集以分配密钥/值(分布属性):
回答:
REDIS6.0引入了多线程,主要是为了改善网络io读取和写入性能(Redis的瓶颈不在CPU中,而是在内存和网络中。)
尽管redis6.0引入了多线程,但使用了网络数据的读取-write操作的多线程多线程使用,并且仍然以单线序列执行执行命令。因此,您不需要担心线程安全问题。
该过程简要描述如下:
该设计具有以下特征:
1. IO线程要么同时读取插座,要么同时读取插座。它不会同时读写
2. IO线程仅负责读取和编写套接字分析命令,对命令处理不负责
redis6.0的多线程默认值是禁用的,仅使用主线程
如果需要打开,则需要修改Redis配置文件:
打开多线程后,需要线程数,否则将不会生效。还需要修改redis配置文件:
概念:缓存渗透是指不在缓存和数据库中的数据,用户继续启动请求,从而导致数据库的压力使压力加倍
示例:ID值的ID值的数据或ID是一个特别大且不存在的数据
解决方案:
(1)添加接口层的验证,例如用户验证验证,参数验证,例如:ID作为基本验证,ID <= 0的直接拦截
(2)非法请求像ID一样直接过滤为负号,并使用Bloom过滤器
(3)对于那些无法在数据库中找到记录的人,我们仍然将空数据保存到缓存中。当然,通常设置较短的到期时间。
概念:缓存服务器在一定时间段内即将死亡或大量的缓存浓缩液,这会导致所有请求进入数据库,从而导致数据库压力加倍。这是针对多个键
解决:
(1)意识到高速缓存的可用性,并且可以通过REDIS群集在不同的Redis库中均匀分布热点数据。
(2)分批存入数据时,将每个键的随机值添加到故障时间
概念:REDIS到期时的时刻,大量用户请求相同的缓存数据,这导致这些请求请求数据库,这导致数据库压力使情况增加一倍。对于钥匙,
缓存崩溃和缓存雪崩之间的区别在于,这里是针对流行的钥匙缓存,而雪崩则针对大量的缓存浓度故障。
解决方案
●
●
好吧,我今天在这里的代码,然后我去移动砖块。Moutai并没有抓住它,但是我学到了很多技能。
我希望你不要刺你的小手,也不喜欢野外的国王。您的认可是我最大的动力。
将来,我将继续为每个人发送干货,欢迎大家注意以避免迷路
以下是Redis的干货,欢迎收集
哦,天哪,事实证明,微博,微信,购物车和绘图程序使用了数据结构!
新来了,您是否说Redis的耐用机制可以解决我们遇到的业务问题?
我如何快速成为一名建筑师?
原始:https://juejin.cn/post/7098957369224200200