Ehcache与redis缓存(二)

889 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

接上篇,在引入ehcache二级缓存后出现了一系列问题,比如内存缓存无法在多节点集群环境共享热点数据,查阅ehcache官网后发现有集群功能,但是发现ehcache的缓存是分布在不同的服务器节点上的,这样子会导致任何一个节点上的ehcache存入缓存数据其他节点的ehcache都需要去copy一份,性能不是非常乐观,如果大量的数据缓存对服务器也是一种压力,如下图:

image.png

最终的解决方案如下图:

image.png

没有使用ehcache的集群模式,而是利用redis的同步机制结合ehcache内存缓存访问速度快相结合,当请求接口在内存缓存当中没有发现缓存数据时,再去请求redis,如果还是为空那么执行方法体,然后将当前数据缓存到ehcache内存缓存,同时将缓存同步到redis缓存,其他redis节点将由redis同步机制同步缓存数据,如果请求在其他节点发现ehcache内存缓存没有数据则会去redis获取,如果获取到了会将数据返回且将缓存数据放入ehcache,那么下次再次请求就好直接获取内存缓存数据,这样子就没有使用ehcache集群避免数据复制的效率问题同时达到了分布式缓存的效果,内存缓存也可以多节点共享。

使用guava cache也可以实现一个内存缓存,下面简单贴一下代码:

1.定义了一个guava cache缓存map,包括过期时间、最大缓存数、删除回调、最大并发数

image.png

2.然后就是操作该map,也就是get缓存数据、put缓存数据

image.png

但是实际使用还是需要结合spring的cache接口配合,get的原理就是先去上面guava cache的缓存map里查找,没有再去redis查,如果查询到了再放入自定义的缓存map,掘友们不需要担心过期问题在上面自定义的guava cache缓存map支持配置最大缓存数量和缓存过期时间。

image.png

image.png