同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)
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本地缓存注意事项(深拷贝和浅拷贝)的更多相关文章
- Java内存缓存-通过Google Guava创建缓存
谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...
- google guava cache缓存基本使用讲解
代码地址:https://github.com/vikde/demo-guava-cache 一.简介 guava cache是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存 ...
- [Google Guava]学习--缓存cache
适用性 缓存在很多情况下非常实用.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存. Guava Cache与ConcurrentMap很相似,但也不完全 ...
- 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
- 本地缓存google.guava及分布式缓存redis 随笔
近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...
- springboot之本地缓存(guava与caffeine)
1. 场景描述 因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友. 2.解决方案 2.1 使用google的guava作为本地缓存 初步的想法是使用googl ...
- 第七章 企业项目开发--本地缓存guava cache
1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...
- Google guava cache源码解析1--构建缓存器(1)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHas ...
- 企业项目开发--本地缓存guava cache(1)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分 ...
随机推荐
- 目录——创建、切换、pwd、删除、复制、剪切
1.创建目录: (1)在已经存在的目录下新建一个目录: 可以看出在创建1997目录后,在tmp中能够顺利找到. (2)在一个不存在的目录下新建一个目录: 直接在tmp目录下新建一个a目录,再在a目录下 ...
- RookeyFrame 模块 线上创建的模块 迁移到 线下来
1. 把线上创建的model,写在项目的model层里面. 把文件 Rookey.Frame.Web\Config\TempModel\Order_File.code 复制到model层, 用文本编辑 ...
- 微信小程序开源
| UI组件 | | | | | | | | | weui-wxss ★1873 - 同微信原生视觉体验一致的基础样式库 | | | | | | zanui-weapp ★794 - 好用易扩展的小程 ...
- 模板 - 数学 - 多项式 - 快速数论变换/NTT
Huffman分治的NTT,常数一般.使用的时候把多项式的系数们放进vector里面,然后调用solve就可以得到它们的乘积.注意这里默认最大长度是1e6,可能需要改变. #include<bi ...
- 五笔字典86版wubi拆字图编码查询
五笔字典86版 软件能查询以下数据,五笔编码,汉字拆字图,拼音,部首,笔划,笔顺,解释,五笔口诀等等.这些数据只针对单个汉字查询(大概7000字左右).词组查询只支持五笔编码查询(有60000个词组+ ...
- Linux crontab 定时任务使用
1.介绍 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程: 与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程 ...
- laravel中图片的删除
laravel中图片的删除 一.总结 一句话总结: laravel里面删除的话还是建议用Storage的delete方法,不建议用原生php的unlink方法,不然没找到文件可能会报异常 二.lara ...
- CMU Database Systems - Query Optimization
查询优化应该是数据库领域最难的topic 当前查询优化,主要有两种思路, Rules-based,基于先验知识,用if-else把优化逻辑写死 Cost-based,试图去评估各个查询计划的cost, ...
- could not find 'gopls
安装go tools 安装以上后用vim打开go代码,使用函数跳转时会出现: E718: Funcref requiredvim-go: could not find 'gopls'. Run :Go ...
- 006 DOM节点操作与元素的创建
一:节点 1.节本基本概念 节点主要有标签,属性,文本[包括文字,空格,换行,回车]. 2.节点的属性 可以使用标签,元素点出来 可以使用标签,点出来 可以使用文本,点出来 nodeType:1--标 ...