java 缓存篇2

缓存的部署方式

  • 单机
  • 主从
  • 哨兵
  • 集群
特性主从(Master-Slave)哨兵(Sentinel)集群(Cluster)
数据分片不支持不支持支持,基于 slot 进行水平分片
高可用性部分支持(手动故障转移)高可用性,自动故障转移高可用性,自动故障转移及数据分片
配置复杂度
扩展性低至中
适用场景中小规模应用,读多写少需要高可用性且不需要分片的应用大规模分布式应用,需水平扩展和高可用性
一致性弱(异步复制,可能有延迟)弱(同主从)强(单 slot 内一致)
数据备份支持,通过从节点实现支持,通过 Sentinel 管理的从节点支持,通过集群内的从节点和分片

CAP

  • 分区容忍性(P):
    在Redis集群模式中,数据自动分片到不同节点。即使部分节点由于网络故障而无法访问,其余节点仍可继续提供服务。

  • 可用性(A):
    使用哨兵模式(Sentinel)进行故障转移。当主节点宕机时,哨兵能自动将一个从节点提升为新的主节点,确保服务的持续可用性。

  • 一致性(C):
    在Redis的事务特性中,可以使用WATCH命令实现乐观锁,这提供了一种条件式的一致性。此外,通过等待多个从节点应答,可以提高数据一致性的保证。

cp还是ap

连接池

  • jedis
  • Lettuce
  • Redisson
类型优点缺点
jedis简单易用,API直观。
支持完整的Redis命令集。
性能较高,因为它是同步的,并且直接与Redis服务进行交互
不支持Redis集群的自动重定向。
在4.0版本之前,不支持Redis哨兵。
连接池管理相对简单,可能不如Lettuce灵活。
4.0版本开始支持Redis集群和哨兵,但社区认为它在这方面的支持不如Lettuce成熟。
Lettuce基于Netty的事件驱动架构,性能优越,尤其在高并发环境下。
支持Redis集群的自动重定向。
支持Redis哨兵和主从复制。
提供了高级功能,如异步操作、发布订阅、超时处理等。
连接池管理功能强大,支持多种配置。
API相对复杂,学习曲线较陡。
由于是异步的,对于习惯同步编程的开发者来说可能不太直观。
Redisson提供了丰富的分布式数据结构,如分布式集合、队列、锁等。
基于Jedis,但封装了更多的高级功能,简化了分布式环境下的操作。
支持Redis集群和哨兵。
提供了分布式锁的实现,这对于分布式系统中的同步问题非常有用。
支持自动重连和故障转移。
由于提供了更多的封装和功能,性能可能略低于Jedis和Lettuce。
学习曲线相对较陡,因为需要理解额外的分布式数据结构和概念。
社区和生态系统相对较小,可能不如Jedis和Lettuce成熟。

多级缓存

过期和淘汰策略

  • 惰性删除(Lazy Expiration):
    键的过期检查只在以下两个时刻进行:
    • 当你访问这个键时,如果键已经过期,那么它会被删除。
    • 当你向数据库添加一个新的键时,如果内存超出了 maxmemory 指令指定的最大限制,那么 Redis 会从数据库中删除一些键以释放内存。
    • 这种方法的优点是节省 CPU 资源,因为不需要定期检查键是否过期。
    • 缺点是可能会有过期键在内存中停留较长时间,直到它们被访问或者触发内存淘汰机制。
  • 定期删除(Active Expiration):
    • Redis 每隔一段时间(默认是 100 毫秒)就会随机抽取一些设置了过期时间的键进行检查,如果发现它们已经过期,就会将它们删除。
    • 这种方法可以保证过期键尽快被删除,减少内存占用。
    • 缺点是会消耗更多的 CPU 资源,因为需要定期执行检查。

更新策略

更新策略存在问题
先更新数据库,再更新缓存1、更新缓存的时候失败了(或者更新的时候晚了被其他线程读取到的还是旧值),导致缓存中存的一直都是脏数据;
2、多个线程在更新时,因为两个更新步骤执行顺序不一致,可能会导致数据错乱
先更新缓存,再更新数据库1、不太推荐,业务上一般把mysql最后保障
2、多线程环境下,A、B两个线程有快有慢,最后可能导致缓存与数据库不一致;
先删除缓存,再更新数据库1、多线程下,A还没更新完数据库;B进来查缓存没查到,就会读取数据库的旧值写入缓存(延迟双删:可以等一会再删除一遍缓存)
2、删了缓存假如这个时候流量激增查询这个key,会导致缓存击穿数据库
先更新数据库,再删除缓存(推荐)假如删除失败或者来不及,就会被其他线程读取到旧值(存在一定时间数据不一致但是会保证最终一致性)

使用场景

优化

集群有偏移问题
大key问题
热点Key问题
慢查询问题
内存碎片问题
缓存雪崩;
缓存击穿;
缓存穿透
数据预热

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot快速使用

一些名词的碎碎念: 1> 俩种网络应用设计模式 C/S 客户端/服务器 B/S 浏览器/服务器 俩者对比: 2> 集群和分布式的概念 集群: 分布式: 例子: 一个公司有一个人身兼多职 集群: 招聘N个和上面这个人一样身兼多职 分布式: 招聘N个人,分担上面这个人的工作,进行工作的拆分. 工…

苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片

美股快讯:苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片 苹果公司计划从明年开始在其设备上改用国产芯片进行蓝牙和Wi-Fi连接,此举将逐步淘汰目前由博通提供的部分部件。这种代号为Proxima的芯片已经开发了数年,现在计划用于…

Linux 切换用户的两种方法

sudo -su user1 与 su - user1 都可以让当前用户切换到 user1 的身份执行命令或进入该用户的交互式 Shell。但它们在权限认证方式、环境变量继承和 Shell 初始化过程等方面存在一些差异。 权限认证方式 su - user1 su 是 “switch user” 的缩写,默认情况下需要你输…

快速理解分布式事务Seate基本知识

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 一.Seate的三大角色 在 Seata 的架构中,一共有三个角色:…

前端项目初始化搭建(二)

一、使用 Vite 创建 Vue 3 TypeScript 项目 PS E:\web\cursor-project\web> npm create vitelatest yf-blog -- --template vue-ts> npx > create-vite yf-blog --template vue-tsScaffolding project in E:\web\cursor-project\web\yf-blog...Done. Now run:cd yf-…

SQL最佳实践:避免使用COUNT=0

如果你遇到类似下面的 SQL 查询: SELECT * FROM customer c WHERE 0 (SELECT COUNT(*)FROM orders oWHERE o.customer_id c.customer_id);意味着有人没有遵循 SQL 最佳实践。该语句的作用是查找没有下过订单的客户,其中子查询使用了 COUNT 函数统计客…

多模态大模型(二)——用Transformer Encoder和Decoder的方法(BLIP、CoCa、BEiTv3)

文章目录 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要,一个很有效的、根据图片生成caption的工具1. BLIP的研究动机2. BLIP的模型结构3. CapFilt Model4. BLIP的训练过程 CoCa: C…

【理想汽车中科院】基于模仿学习的端到端自动驾驶数据缩放规律

论文: https://arxiv.org/pdf/2412.02689 项目: https://github.com/ucaszyp/Driving-Scaling-Law 0. 摘要 端到端自动驾驶范式因其可扩展性而最近吸引了大量关注。然而,现有方法受到现实世界数据规模有限的制约,这阻碍了对端到端自动驾驶相关扩展规律…

【工具介绍】可以批量查看LableMe标注的图像文件信息~

在图像处理和计算机视觉领域,LabelMe是一个广泛使用的图像标注工具,它帮助我们对图像中的物体进行精确的标注。但是,当标注完成后,我们常常需要一个工具来批量查看这些标注信息。 今天,我要介绍的这款exe程序&#xf…

链式栈的实现及其应用

目录 一、链式栈结构模型 二、链式栈的实现 2.1创建 2.2压栈 2.3出栈 2.4判断栈是否为空 2.5查看栈顶 2.6释放栈 三、应用 链式栈实际上就是基于链表,压栈和弹栈可分别看作头插和头删,链表尾部就是栈底,头指针就是栈顶指针 一、链式…

day12 接口测试 ——入门→精通→实战(1)

【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、接口测试分类 1.1 内部接口: 1.2 外部接口: 2、目前接口架构设计 2.1、基于SOAP架构, 2.2、基于RPC架构, 2.3、基于RestFul架构, 2.3.1…

程序的调试

一名优秀的程序员也是一名出色的侦探,每一次调试都是尝试破案的过程 目录 前言 一、什么是调试? 二、调试 1.调试是什么 2.基本步骤 三、调试注意事项 1.怎么写出易于调试的代码 assert(断言) const 2.常见错误 总结 前言 主要是怎么调试,调…

FPGA实现GTP光口数据回环传输,基于Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案 3、工程详细设计方案工程设计原理框图用户数据发送模块基于GTP高速接口的数据回环传输架构GTP IP 简介GTP 基本结构GTP 发送和接收…

如何快速切换更新电脑网络的ip地址

1.ADSL拨号更换IP地址 这种更换 IP地址的方法其实就是我们平时使用的宽带拨号,每次拨号得到的IP地址都不同,但是这种方法无法使用于光纤宽带,并且使用这种方法更换的IP地址,一般只会变更最后一个号段,前三个号段的数字…

25.DDD数量关系

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗?领域对象之…

每天40分玩转Django:Django视图和URL

Django视图和URL 一、课程概述 学习项目具体内容预计用时视图基础函数视图、类视图、视图装饰器90分钟URL配置URL模式、路由系统、命名URL60分钟请求处理请求对象、响应对象、中间件90分钟 二、视图基础 2.1 函数视图 # blog/views.py from django.shortcuts import render…

SAS - Subtractive Port

在SAS(串行连接SCSI,Serial Attached SCSI)协议中,subtractive port 是一种特殊类型的端口,主要用于设备间的路由功能。它的作用是在路径选择过程中充当默认路径,以处理未明确指定路径的请求。以下是它的定…

vue实现文件流形式的导出下载

文章目录 Vue 项目中下载返回的文件流操作步骤一、使用 Axios 请求文件流数据二、设置响应类型为 ‘blob’三、创建下载链接并触发下载四、在 Vue 组件中集成下载功能五、解释与实例说明1、使用 Axios 请求文件流数据:设置响应类型为 blob:创建下载链接并…

用Keytool和OpenSSL生成和签发数字证书

一)keytool生成私钥文件(.key)和签名请求文件(.csr),openssl签发数字证书 J2SDK在目录%JAVA_HOME%/bin提供了密钥库管理工具Keytool,用于管理密钥、证书和证书链。Keytool工具的命令在JavaSE6中已经改变,不过以前的命令仍然支持。Keytool也可以用来管理对称加密算法中…

语言模型(序列模型)

终于快要毕业了,乘着还在还在研究室,把最后一章sequence模型也学完吧。 Sequence Model 一:基础知识1:符号的定义2:词典(Vocabulary) 与编码(Encoding) 二:RNN(Recurrent Neural Networks) 循环神经网络1&…