首页 > 其他分享 >分布式缓存

分布式缓存

时间:2023-06-06 19:01:16浏览次数:39  
标签:缓存 删除 数据库 更新 线程 key 分布式


常见缓存中间件:Memcached mongoDB Redis
Memcached: 简单 key-value 数据结构,不支持持久化(可重启缓存功能并不算),不支持集群(客户端自己控制),性能强。
mongoDB: 数据结构非常全面的文档型数据库,支持持久化,支持集群,性能中等。
Redis:技能五种基本数据类型和扩展类型,支持持久化,支持集群,性能强。

缓存穿透:意指透过,表示缓存层形同虚设,没有发挥一点拦截功能,当恶意请求获取的 key 并不存在于数据库中,而无法创建缓存。解决方案:能在业务层校验的则校验,或为该key 存放一个空值。

缓存击穿:单一数据过期或不存在时。解决方案:当key不存在时,先加锁,从数据库读取写入缓存后,再释放锁。

缓存雪崩:同一时刻,缓存大面积过期或redis 宕机。解决方案:设置缓存过期时间随机分布。

更新缓存的过程:就两个操作,更新数据库和更新缓存。由于不是原子操作,所以每一步都有可能失败,怎么才能保证线程交替和中途失败的影响最小呢?

1,先更新缓存,再更新数据库:如果数据库更新失败,缓存也无法回滚。
2,先删除缓存,再更新数据库:假如线程A更新数据库之前,正好线程B又把旧数据更新到缓存中了。
3,先更新数据库,再更新缓存:假如更新缓存失败,总不可能为此回滚数据库吧?
4,先更新数据库,再删除缓存:删除缓存也有可能失败,但概率比较低。两个线程交替完成,也不会有问题。
5,先删除缓存,再更新数据库,再删除缓存:假如线程A删了缓存,B写入了旧缓存,A刚更新完数据库,C又读了缓存,C读到的就是旧数据。 但这需要三个缓程存恰好配合才会出问题,所以,这个才是相对最好的方案。

任何一个方案都不是完美的,但如果剩下1%的问题需要花好几倍的代码去解决,从技术来讲,得不偿失,所以我们要平衡技术成本和收益。

标签:缓存,删除,数据库,更新,线程,key,分布式
From: https://www.cnblogs.com/zbseoag/p/17461453.html

相关文章

  • Mybatis 一级缓存与二级缓存
    本文转载于:Mybatis一级缓存与二级缓存的区别你知道吗Mybatis缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库进行交互,从而提高查询响应速度。MyBatis提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:我们先大致了解下MyBatis一......
  • Taurus.mvc .Net Core 微服务开源框架发布V3.1.7:让分布式应用更高效。
    前言:自首个带微服务版本的框架发布:Taurus.MVCV3.0.3微服务开源框架发布:让.NET架构在大并发的演进过程更简单已经过去快1年了,在这近一年的时间里,版本经历了N个版本的迭代。如今,是时候写文章介绍一下了:以下介绍中,仅以.NetCore6为示例代码。框架支持在.NetFramework2.0+......
  • 9.4. 分布式与微服务架构
    在本章节中,我们将介绍分布式系统和微服务架构的基本概念。分布式系统解决了单体应用面临的可扩展性、高可用性等问题,而微服务架构进一步提升了系统的可维护性和灵活性。9.4.1.分布式系统基本概念分布式系统是由多个独立的计算节点组成的系统,这些节点通过网络进行通信和协作。......
  • 应用问题解决-分布式锁(LUA保证删除原子性)
    问题:删除操作缺乏原子性场景1、index1获得锁、执行具体操作、比较lock的uuid值确实和自己生成的uuid是否相等,相等则删除锁。uuid=v1set(lock,uuid)uuid.equals(get("lock"))2、但是index1执行删除前,lock刚好过期时间已经到了,被redis自动释放3、此时index2获取锁,执行具体......
  • 分布式搜索elasticsearch集群监控工具bigdesk
    bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu、内存使用情况,索引数据、搜索情况,http连接数等。项目git地址: https://github.com/lukas-vlcek/bigdesk。和head一样,它也是个独立的网页程序,使用方式和head一样。插件安装运行......
  • 分布式事务的解决方案及中间件
    方案一:XA两阶段提交方案是一种比较重的操作,其中有有以下三个角色:事务管理器(TM)、事务协调者(TC)、资源管理器(RM),资源锁定时间长,效率低。方案二:TCC采用冻结预留的方式锁定资源,开发量较大,常用于资金交易类的场景。方案三:本地消息表严重依赖消息表来管理事务,并不适用高......
  • 手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)
    前言这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题。性能问题一般用什么来解决呢?小明第一时间想到了缓存。什么是缓存缓存是实际工作中非常常用的一种提高性能的方法。缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能......
  • 分布式锁(设置锁和过期时间)
    问题描述:随着业务发展的需要,原单体单机部署的系统被演化分成分布式集群系统后,由于分布式系统多线程、多进程且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的JavaAPI并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的......
  • Hash 缓存
    原文点此跳转输出文件名(Hash)静态资源缓存是前端性能优化的一个点,所以在前端开发过程中,一般会最大限度的利用缓存(这里主要是强缓存)。如果设置了强缓存后,每次当我们部署了新的项目文件到线上的时候,因为文件名称没有变化,浏览器就会读取本地缓存中的bundle.js文件,导致了我们新的bund......
  • 应用问题解决——缓存穿透、缓存击穿、缓存雪崩
    一、缓存穿透缓存穿透:key对应的数据在数据源并不存在,每次针对key的请求从缓存中获取不到,请求都会压到数据源,从而可能压垮数据源,比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库现象:1、应用服务器压力变大2、redis命中率......