1、问题场景及说明

系统中同时使用 Redis 缓存和 Guava本地缓存。用 Guava 缓存将 Redis 缓存包了一层。可以提升效率,但是也会引出一些问题。

问题:同一个本地缓存Map,获取到的值有时会不一致。
不同机器可能不一致,同一机器也可能不一致。很神奇,但是数据库里都是对的。

后来发现,因为有一个请求会对该缓存进行remove操作,导致缓存改变。
如果这个请求到某个机器上,该台机器上的缓存就会被修改。
同时缓存过期时间为一分钟,过期之后获取到的缓存是正常的。如果该台机器没有再次接收到请求,那么缓存就正常;如果再次接收到,缓存就异常了。

2、Redis 缓存是深拷贝

从 Redis 中获取缓存时,系统中的数据对象是 Redis 缓存的副本。
对该对象的任何操作都不会影响 Redis 中的缓存,后续再次获取还是修改之前的数据。
除非执行Redis的更新操作。

3、Guava本地缓存直接获取则是浅拷贝

以获取一个MAP为例:如果直接从缓存中取,则是浅拷贝。
对缓存数据的任何操作都会同时修改缓存中的数据,下次从缓存中获取则是修改之后的数据。

一般不会修改从缓存中获取到的数据,但如果要修改,则需注意Redis和Guava的不同。

4、如何实现Guava获取本地缓存是深拷贝?

方法:可将Guava的get方法封装一层,将缓存中获取到的数据包装为一个新对象返回,以后直接使用封装后的方法。

注意:这会影响Guava的性能,毕竟每次都需要构建一个新对象返回。

建议:本地缓存适合直接获取的场景,没必要包装通用get方法。
如果要修改获取到的数据,在修改的地方深拷贝一份操作即可。
即可利用Guava的优越性,又可实现需要修改数据的逻辑。
只是要注意,修改时不能直接操作原始对象,需操作深拷贝之后的对象。

同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)的更多相关文章

  1. Java内存缓存-通过Google Guava创建缓存

    谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...

  2. google guava cache缓存基本使用讲解

    代码地址:https://github.com/vikde/demo-guava-cache 一.简介 guava cache是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存 ...

  3. [Google Guava]学习--缓存cache

    适用性 缓存在很多情况下非常实用.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存. Guava Cache与ConcurrentMap很相似,但也不完全 ...

  4. 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  5. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  6. springboot之本地缓存(guava与caffeine)

    1. 场景描述 因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友. 2.解决方案 2.1 使用google的guava作为本地缓存 初步的想法是使用googl ...

  7. 第七章 企业项目开发--本地缓存guava cache

    1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...

  8. Google guava cache源码解析1--构建缓存器(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHas ...

  9. 企业项目开发--本地缓存guava cache(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分 ...

随机推荐

  1. redis堵死致数据清空

    情景: zy的链路监控突然都恢复,而且在哪个时间段zabbix中显示回复,也发送了告警,但是实际上告警并没有发出来.这是不可能的情况,应该是redis缓存中的数据都被清空了,没有认为干预,需解决问题 ...

  2. Solution

    小五的游戏 小碎骨的子集 芙兰朵露的框框 ⑨要求和

  3. AtCoder Grand Contest 006 题解

    传送门 \(A\) 咕咕 const int N=105; char s[N],t[N];int n; inline bool eq(R int k){fp(i,1,k)if(s[n-k+i]!=t[ ...

  4. shell脚本编程基础之文件测试

    文件测试判断条件 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通文件 -d FILE:测试指定路径是否为目录 -r FILE:测试当前用户对指定文件是否有读权限 -w FILE: ...

  5. P1378 油滴扩展——搜索小记

    P1378 油滴扩展 记得这道题好久以前(好像是上个学期?) 就想做了,但是看着里面的半径边界好像很难处理就没做(主要是当时刚学OI(菜还给自己找借口)): 今天上午一直研究SG函数,做的都自闭了,晚 ...

  6. 【CSP模拟赛】避难向导(倍增lca&树的直径)

    耐力OIer,一天7篇博客 题目描述 “特大新闻,特大新闻!全国爆发了一种极其可怕的病毒,已经开始在各个城市 中传播开来!全国陷入了巨大的危机!大量居民陷入恐慌,想要逃到其它城市以 避难!经调查显示, ...

  7. Zabbix优化

    参考 zabbix默认的配置即使机器128核心,256内存,只能抗住10-20台的监控,如果再多就需要修改配置了. 一.配置文件 server端配置文件添加如下 StartPollers=160 St ...

  8. fluent懒人篇之journal的用法【转载】

    转载地址:http://blog.sina.cn/dpool/blog/s/blog_63a80e870100oblp.html?type=-1 当你在用fluent计算大量类似算例,重复着相同操作的 ...

  9. 批量添加解释-有单词没解释youdao

     下载地址:     有单词没解释 批量查询解释 当你有手里很多单词,数量很大比如500个及单词以上,那么一个一个去查询是相当麻烦的. 如果 有个软件实现批量查询然后将查询的结果添加到单词的后面,是不 ...

  10. Go 随机打乱 字符串 数组

    func Random(strings []string) string { for i := len(strings) - 1; i > 0; i-- { num := rand.Intn(i ...