首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

干掉 GuavaCache:Caffeine 才是本地缓存

Caffeine提供了灵活构造方法,从而创建可以满足如下特性本地缓存: 自动把数据加载到本地缓存中,并且可以配置异步; 基于数量剔除策略; 基于失效时间剔除策略,这个时间是从最后一次访问或者写入算起...如果你用过GuavaCache,那就更简单了,因为CaffeineAPI设计大量借鉴了GuavaCache。...举个例子,假如我们申明了10秒刷新一次。我们在时间T访问并获取到值v1,在T+5秒时候,数据库中这个值已经更新为v2。...在这个获取过程中,Caffeine发现时间已经过了10秒,然后会将v2加载到本地缓存中,下一次获取时才能拿到v2。...可以参考「CountMin Sketch」算法,它由计数矩阵和多个哈希方法实现。发生一次读取时,矩阵中每行对应计数器增加计数,估算频率时,取数据对应是所有行中计数最小值。

1.9K40

如何在云原生中监控JVM指标

client_java 访问指标 现在可以通过http://localhost:8080/metrics访问指标 grafana可配置指标 使用 Prometheus 指标准备示例 Grafana 仪表盘,我们可以获取到已经抓取到指标..., springboot 提供了如下指标可用于grafana展示使用。...重要 tomcat.cache.access tomcat读取缓存次数 tomcat.cache.hit tomcat缓存命中次数 CPU system.cpu.count CPU数量 system.load.average...GC 运行频率,每次 GC 花费时间。因此,当 GC 发生过于频繁或收集未引用对象所花费时间太长时,它会影响您应用程序性能。...足够空闲线程来接受所有用户请求是很重要。如果您没有足够线程,这将增加用户请求等待时间,进而增加应用程序响应时间。当线程需要较长时间来完成用户请求时,它会将引用对象在堆内存中保存较长时间

1.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

SpringBoot2 整合JTA组件,多数据源事务管理

一、JTA组件简介 1、JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。...一个JTA事务可以多个参与者,而一个JDBC事务则被限定在一个单一数据库连接。...JTA规范定义了事务管理器与其他事务参与者交互接口,其他事务参与者与事务管理器进行交互。 二、SpringBoot整合JTA 项目整体结构图 ? 1、核心依赖 <!...但是暴露出问题也非常明显,就是比较严重性能问题,由于同时操作多个数据源,如果其中一个数据源获取数据时间过长,会导致整个请求都非常长,事务时间太长,锁数据时间就会太长,自然就会导致低性能和低吞吐量...最后作为Java下API,原理和用法还是值得学习一下,开阔眼界和思路。

66710

还不懂缓存穿透?Redis缓存穿透深度剖析

数据库中也没有该数据,如果处于高并发情况下这种场景直接造成数据库宕机,因此我们可以将查询出来null结果存入到缓存,只需要第一次查询时候检索数据库,后面直接命中缓存返回结果。修改service。...因为多线程场景下存在线程抢占机制,都在查询缓存然后查询数据库,第一个线程来了,看到缓存没有,就去查询数据库,第二个线程来了发现缓存还没有,继续查询数据库,当在查询出来数据与存入缓存环节空隙时间内,多个请求已经打到数据库了...由于springboot所有的组件都是单例,即使批量请求也让他访问查询和存入缓存操作是使用同一把锁,所以可以使用synchronized (this)来加锁,第一个请求来时获取锁,查询数据库,在查询之前再次确认下缓存中是否有数据...缓存命中... null 缓存命中... null 多次执行结果是不一样,线程优先级和时间片分配可能影响线程执行顺序和时长,进而影响多线程程序结果。...布隆过滤器可以用于检测一个元素是否在一个集合中,它优点是空间效率和查询时间都远远超过一般算法,缺点是一定误识别率和删除困难。

22710

EhCache

EhCache2.x和3.x两个常用大版本,两个版本API差异巨大,这里咱们以3.x为讲解内容应用官方入门文档:https://www.ehcache.org/documentation/3.10...,不过现在SpringBoot项目居多,大多是没有xml配置信息,所以这里核心以Java编码方式配置三、EhCache详细配置首先在获取Cache时,可以提升指定好几个信息,依次把核心配置搞一下3.1...5.1 @Cacheable这个是命中缓存注解,也就是在查询时候,根据当前注解查看缓存中有木有数据,木就走业务,让后扔缓存里,后面就可以命中缓存了。...EhCache2.x和3.x两个常用大版本,两个版本API差异巨大,这里咱们以3.x为讲解内容应用官方入门文档:https://www.ehcache.org/documentation/3.10...5.1 @Cacheable这个是命中缓存注解,也就是在查询时候,根据当前注解查看缓存中有木有数据,木就走业务,让后扔缓存里,后面就可以命中缓存了。

62740

动态内容缓存

缓存目的是把花费昂贵开销计算结果保存起来,以后需要时候直接取出,避免重复计算,一切缓存本质都是如此。...如果缓存文件多的话,那么Cache目录下会拥挤大量文件,这样CPU花费在遍历目录时间就非同异常,如果写缓存比较频繁,那么CPU很容易100%,这时可以采用缓存目录分级来解决这个问题。...所以动态内容缓存机制必须能够判断缓存何时失效,何时重新生成新缓存。 为每个缓存标记一个过期时间,动态内容每次对缓存进行过期检查,这是种常见缓存过期检查策略,当然方法很多。...两者区别在:应用第2种方法时,在缓存过期前,如果修改了缓存有效期长度,是不会影响上一次缓存过期时间。而第1种方法,修改缓存有效期长度会影响每一次过期检查。...缓存有效期取值不能太长,虽然这样缓存命中率高了,但动态内容更新却不能及时实现 。如果缓存有效期取值太短,虽然动态内容更新内容可以及时实现,但这样频繁创建缓存不如不使用缓存。

2.3K110

性能设计 - 缓存

所以,基础很重要,我已经说过不止一次了。 Write Back 套路就是,在更新数据时候,只更新缓存,不更新数据库,而我们缓存会异步地批量更新数据库。...在软件设计上,我们基本上不可能做出一个没有缺陷设计,就像算法设计中时间换空间、空间换时间一个道理。有时候,强一致性和高性能,高可用和高性能是冲突。...另一方面,我们不能在 Service 内放 Local Cache,一是每台机器内存不够大,二是我们 Service 多个实例,负载均衡器会把请求随机分布到不同实例。...缓存数据时间周期也需要好好设计,太长太短都不好,过期期限不宜太短,因为可能导致应用程序不断从数据存储检索数据并将其添加到缓存。...对此,一般来说,我们需要有一个爬虫保护机制,或是我们引导这些人去使用我们提供外部 API。在那边,我们可以针对性地做多租户缓存系统(也就是说,把用户和第三方开发者缓存系统分离开来)。

46520

Feed流应用重构-架构篇

▍ 代码可维护性 服务端端代码已经四年左右历史,随着时间推移,人员变动,不断修复Bug,不断添加新功能,代码可读性越来越差。而且很多维护功能是在没有完全理解代码情况下做修改。...每次调用命令时候,一次步长可以设置稍微长一点,保持在本地缓存里,每次生成唯一主键时候,先从本地缓存里预取一次,若没有,然后再通过redis命令获取。...流程大致如下: 1)先从数据库查询当前页博客id列表,sql类似: select id from blogs limit 0,10 2)批量从缓存中获取博客id列表对应缓存数据 ,并记录没有命中博客...id,若没有命中id列表大于0,再次从数据库中查询一次,并放入缓存,sql类似: select id from blogs where id in (noHitId1, noHitId2) 3)将没有缓存博客对象存入缓存中...4)返回博客对象列表 理论上,要是缓存都预热情况下,一次简单数据库查询,一次缓存批量获取,即可返回所有的数据。

47220

SpringBoot性能优化大全,贼好使!

监控才有方向 在开始对 SpringBoot 服务进行性能优化之前,我们需要做一些准备,把 SpringBoot 服务一些数据暴露出来。...下图便是一张典型监控图,可以看到 Redis 缓存命中率等情况。 Java生成火焰图 火焰图是用来分析程序运行瓶颈工具。在纵向,表示是调用栈深度;横向表明是消耗时间。...这是因为,浏览器每次访问后端资源,都需要先查询一次 DNS,然后找到 DNS 对应 IP 地址,再进行真正调用。 DNS 多层缓存,比如浏览器会缓存一份、本地主机会缓存、ISP 服务商缓存等。...从 DNS 到 IP 地址转变,通常会花费 20-120ms 时间。减少域名数量,可加快资源获取。 开启 gzip 开启 gzip,可以先把内容压缩后,浏览器再进行解压。...由于 controller 只是充当了一个类似功能组合和路由角色,所以这部分对性能影响就主要体现在数据集大小上。如果结果集合非常大,JSON 解析组件就要花费较多时间进行解析。

1K30

Spring Boot 整合 Redis 实现缓存操作

缓存应用场景哪些呢? 比如常见电商场景,根据商品 ID 获取商品信息时,店铺信息和商品详情信息就可以缓存在 Redis,直接从 Redis 获取。减少了去数据库查询次数。...命中:应用程序从cache中取数据,取到后返回。 更新:先把数据存到数据库中,成功后,再让缓存失效。 大致流程如下:获取商品详情举例 a....所以用 postman 工具可以如下操作: 根据 ID,获取城市信息 GET http://127.0.0.1:8080/api/city/1 再请求一次获取城市信息会发现数据获取耗时快了很多。...更新城市信息 PUT http://127.0.0.1:8080/api/city 删除城市信息 DELETE http://127.0.0.1:8080/api/city/2 这两种操作中,如果缓存有对应数据...ValueOperations 插入缓存是可以设置失效时间,这里设置失效时间是 10 s。

65311

EhCache

EhCache2.x和3.x两个常用大版本,两个版本API差异巨大,这里咱们以3.x为讲解内容应用官方入门文档:https://www.ehcache.org/documentation/3.10...,不过现在SpringBoot项目居多,大多是没有xml配置信息,所以这里核心以Java编码方式配置三、EhCache详细配置首先在获取Cache时,可以提升指定好几个信息,依次把核心配置搞一下3.1...,生存多久}四、SpringBoot整合EhCache配置单独使用EhCache需要考虑内容还是比较多,所以可以直接用SpringBoot整合EhCache,使用起来就更加方便。...5.1 @Cacheable这个是命中缓存注解,也就是在查询时候,根据当前注解查看缓存中有木有数据,木就走业务,让后扔缓存里,后面就可以命中缓存了。...5.1.2 缓存存储方式在添加注解之后,必须添加上要采用哪个cacheNames,明显可以缓存到多个cache中,当然value也是一样

85830

MySQL查询执行基础

,如果命中了缓存,则立刻返回存储在缓存中结果,否则进入下一阶段。...客户端使用一个单独数据包将查询传给服务器,当查询语句太长时,服务端就会拒绝接受更多数据并且抛出相应错误。因此,当查询语句很长时,参数max_allowed_packet就特别重要。...换而言之,当客户端从服务器获取数据时,MySQL会一直向客户端推送数据,客户端也没法让服务器停下来。...查询和缓存中查询即使只有一个字节不同,也不会匹配缓存结果。这种情况下查询就会进入下一个阶段。 如果当前查询恰好命中了查询缓存,那么在返回查询结果之前MySQL会检查一次用户权限。...这样做两个好处:服务器端无需存储太多结果,也就不会因为要返回太多结果而消耗太多内存。这样处理也会让MySQL客户端第一时间获得返回结果。

1.3K00

非常哇塞 SpringBoot性能优化长文!

1.监控才有方向 在开始对SpringBoot服务进行性能优化之前,我们需要做一些准备,把SpringBoot服务一些数据暴露出来。...下图便是一张典型监控图,可以看到Redis缓存命中率等情况。 2.Java生成火焰图 火焰图是用来分析程序运行瓶颈工具。在纵向,表示是调用栈深度;横向表明是消耗时间。...这是因为,浏览器每次访问后端资源,都需要先查询一次DNS,然后找到DNS对应IP地址,再进行真正调用。 DNS多层缓存,比如浏览器会缓存一份、本地主机会缓存、ISP服务商缓存等。...从DNS到IP地址转变,通常会花费20-120ms时间。减少域名数量,可加快资源获取。 4.开启gzip 开启gzip,可以先把内容压缩后,浏览器再进行解压。...由于controller只是充当了一个类似功能组合和路由角色,所以这部分对性能影响就主要体现在数据集大小上。如果结果集合非常大,JSON解析组件就要花费较多时间进行解析。

84620

学好Elasticsearch系列-索引批量操作

Elasticsearch 提供了_mget和_bulk API 来执行批量操作,它允许你在单个 HTTP 请求中进行多个索引获取/删除/更新/创建操作。这种方法比发送大量单个请求更有效率。...基于 mget 批量查询 mget(多文档获取)是 Elasticsearch 中提供一个 API,用于一次性从同一个索引或者不同索引中检索多个文档。...例子一: 以下是一个 Elasticsearch mget(多文档获取)操作示例。在这个示例中,我们将获取索引 test-index 中具有特定 ID 多个文档。...基于 bulk 批量增删改 bulk 基本格式如下: POST //_bulk {"action": {"metadata"}} {"data"} bulk api 对 json 语法严格要求...以下是一些其他 filter_path 示例: filter_path=took: 这个请求仅返回执行请求所花费时间(以毫秒为单位)。 filter_path=items._id,items.

26530

mysql之mysql框架(一)

获取用户权限、维持和管理连接。...一个用户成功建立连接后,即使你用管理员账号对这个用户权限做了修改,也不会影响已经存在连接权限。修改完成后,只有再新建连接才会使用新权限设置 客户端如果太长时间没动静,连接器就会自动将它断开。...这个时间是由参数 wait_timeout 控制,默认值是8小时。...除非业务需要是一张静态表,很长时间才会更新一次。比如,一个系统配置表,那么这张表查询才适合使用查询缓存。...显示指定,像下面这个语句一样: 3、分析器 词法分析(识别关键字,操作,表名,列名) 语法分析 (判断是否符合语法) 4、优化器 优化器是在表里面有多个索引时候,决定使用哪个索引;或者在一个语句多表关联

45500

(建议收藏)前端面试必问十六条HTTP网络知识体系

就是指通信过程上下文信息,每次请求都是独立、互相无关,且默认状态不需要保留状态信息。但是在一些场景下,比如前一次请求需要与后一次请求一定关联,这个时候无状态处理起来就比较麻烦了。...在不升级到HTTP2.0前提下,两种解决方案: 并发连接。对一个域名分配多个长连接,增加多个任务队列。...DNS Lookup: 当前域名执行DNS查找所花费时间。 Initial Connection: 建立连接所花费时间,包括TCP握手/重试和协商SSL。...SSL: 完成SSL握手所花费时间(如果是TLS协议,此处显示就是TLS)。 Request sent: 发出网络请求所花费时间,通常为一毫秒时间。...Waiting(TFFB): TFFB 是发出页面请求到接收到应答数据第一个字节时间。 Content Download: 接收响应数据所花费时间

50910

库和缓存一致性方案

引言:今年4月份听过一次关于“库和缓存一致性”线下分享,收获很大。基于这次分享,加上之前项目经验,总结下库和缓存一致性问题。...总结起来就是,我们为了加速数据访问,缩短访问链路,减少数据获取成本都可以采用缓存这种技术方案,以空间换时间。话题扯有点远,回归正题,本文我们主要讨论应用服务器上,数据库和缓存之间一致性问题。...缓存更新会发生在下一次读请求时。这里为什么会选择删除缓存,而没有更新缓存呢。因为如果更新缓存的话,存在并发写操作时,无法保证多个进程执行顺序,可能旧数据会覆盖新数据。...方法相比,最前面多了一次删除缓存,这样就可以避免T1~T2时间数据不一致。...这种方案,可以把缓存删除逻辑从业务代码中剥离,业务开发专注于业务;但是需要引入额外组件,花费更高维护成本。 总结 以上是处理库和缓存数据一致性问题常用方案。

27110

Caffeine Cache~高性能 Java 本地缓存之王

LFU局限性 :在 LFU 中只要数据访问模式概率分布随时间保持不变时,其命中率就能变得非常高。...Caffeine 因使用 Window TinyLfu 回收策略,提供了一个近乎最佳命中率 。 “当数据访问模式不随时间变化时候,LFU策略能够带来最佳缓存命中率。...expireAfterWrite(long, TimeUnit): 在最后一次写入缓存后开始计时,在指定时间后过期。...expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期 refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定时间间隔...cache方面的注解主要有以下5个: @Cacheable 触发缓存入口(这里一般放在创建和获取方法上,@Cacheable注解会先查询是否已经缓存,会使用缓存,没有则会执行方法并缓存) @CacheEvict

3.8K31

【性能】688- 前端性能优化——从 10 多秒到 1.05 秒

压缩 合并 对于 前端性能优化 自然要关注 首屏 打开速度,而这个速度,很大因素是花费在网络请求上,那么怎么减少网络请求时间呢?...压缩、合并 时候,请求时间是 10 多秒,总请求个数 70 多个, js 请求个数是 20 多个 ,对比请求时间 性能 提升 1倍 多。...第一条线路: 当浏览器再次访问某个 URL 时,会先获取资源 header 信息,判断是否命中强缓存 (cache-control和expires) ,如命中,直接从缓存获取资源,包括响应 header...;资源第一次请求时间和 Cache-Control 设定有效期,计算出一个资源过期时间,再拿这个过期时间跟当前请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则未命中, cache-control...如果我们一个命中 response ,我们返回被缓存值,否则我们返回一个实时从网络请求 fetch 结果。

1.3K21
领券