| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Redis cache-aside模型-分布式锁等问题研究 -> 正文阅读 |
|
[大数据]Redis cache-aside模型-分布式锁等问题研究 |
目录 Cache-aside模型包括两种模式:read模式和write模式 1.Read模式:Note:查询不能保证强一致性。 下面讲述这种模式下会遇到的问题,以及解决方案。 并发读缓存可能遇到的问题:缓存穿透,缓存击穿,雪崩,预热,都是Redis缓存里没有对应数据的情况,这种时候如果发生并发读怎么办?分两种情况:
1.布隆过滤器:缓存穿透2.并发排他?现在我们单就缓存击穿和预热的情况(缓存里没有数据,但是数据库中有数据)来研究一下。 并发排他说白了就是并发请求来了,但是Redis缓存中没有数据,这时候应该只让一个线程去数据库拿数据,然后放入缓存,然后其它线程从缓存中取数据。 下面以我们在实际项目中遇到的问题,来讲述一下并发排他 预热: 为了达到预期的并发处理能力,我们在查询的时候采用Redis缓存,但是一开始Redis里并没有缓存对应的数据,我们需要先将数据从数据库中取出,然后存储到Redis中,在高并发情况下应该怎么处理?所有请求都去数据库取数据,然后存储到Redis中?显然这是不合理的,只要由一个线程(请求)去访问数据库,将获取的数据存入Redis,其它请求只需要从Redis中获取就好了。 要达到上述效果,就需要加锁,如果系统做了集群,那么就要考虑使用分布式锁,正好Redisson为我们提供了分布式锁功能,就用它了。 下面这段代码就是用了Redis分布式锁保证只有一个线程去访问数据库并将结果存入Redis。 但是能看出来这里有什么问题吗??? 在并发的情况下,如果有几百个请求在同一时刻打过来,同时发现缓存里没有数据,那肯定不能都去数据库里取数据,然后再写入缓存,只需要一个线程去做这件事情就行了。 这一个线程拿到锁,然后从数据库拿到数据,并且存入Redis缓存,然后其它的请求从Redis缓存里取数据就行了。 其它请求不用每次都在那里(while循环里)等着拿锁,在拿锁之前先看看能不能从Redis缓存里取出数据(第一个线程大概率已经写入了),如果有Redis数据,我不用再去拿锁了,拿锁的话线程要在这里干等着。 直接能从Redis里拿到数据,我还去拿锁干什么?正常情况下,一个线程(请求)拿锁然后把事情做了(数据写到Redis缓存),其它请求不需要拿到锁之后才能从Redis缓存里取,可以在拿锁之前取一次,一般就取到了。 现在是每个请求都要拿锁之后才能从Redis取数据,这是一个挨着一个,排队取。while循环里就只有拿锁的操作,拿到锁之后才能继续从Redis里获取数据。在while循环里,我拿锁之前,先获取一次Redis缓存数据,不要先去获取Redis分布式锁。 代码应该改成这样: 3.小总结:2.Write模式:双写一致性?在需要修改数据的时候,怎样保证数据库和Redis缓存中数据一致性??? 类似的理论:拿java中的volatile举例说明,其实就是无缓存性质保证数据的一致性。 下面是双写的四种方案的介绍: ? canal不知道知道哪些数据是热点数据,需要放入Redis缓存。? ?以上3种方案因为各种各样的原因,都被否定了,只剩先写数据库后删缓存这一种方案。目前我们用的是这种方案。 不过它也有自己的问题,例如删除失败,等待过期的这段时间内,数据是不一致的,所以无法保证强一致性,但是能保证最终一致性(过期后,从数据库拿数据放入缓存),符合CAP中的AP。 3.Redis分布式锁:redLock红锁,解决单点故障问题: 例如3个互相之间没有联系的Redis实例 Zookeeper分布式锁比红锁更好用: 4.Redis缓存存什么数据:Redis也可以做为存储store,存储全量数据,但是如果做为缓存,那么肯定不需要存储全量数据,只存储静态字典数据,热点数据等。 缓存是存储热数据的,不是什么数据都要往redis存。 如果Redis缓存快满了,导致LRU比较频繁,那么会导致redis性能急剧下降。 参考文章:Cache-Aside pattern - Azure Architecture Center | Microsoft Docs |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:23:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |