同时使用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.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分 ...
随机推荐
- P1453 城市环路
题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市中心. 题 ...
- Bat 复制本地文件到共享目录
@echo off title "copy UI" net use \\172.16.104.93\心电图 "password" /user:"adm ...
- hive (1)Cli命令
查看命令选项 # hive --help Usage ./hive <parameters> --service serviceName <service parameters> ...
- Control.ImeMode属性简释
在WINFORM中,我们经常遇到如下问题.文本输入框中输入法有时候需要被禁用,或者某些时候全半角输入自动转换.查阅相关资料,现小结如下. (一)Control.ImeMode 属性:获取或设置控件的输 ...
- Oracle语法 及 SQL题目(二)
目录 课例复制 思考题四 解题思路 思考题五 解题思路 课例复制 思考题四 最近,经过你的努力,你得到了一份工作,成为了百货公司的一位经理. 到位后,你发现你的销售数据库中有两张表,一个是商店促销时间 ...
- 第十二章 Python文件操作【转】
12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file obj ...
- onenote架设在局域网服务器
1.服务器端工作 1.1.在局域网服务器磁盘建个 文件夹,命名为 abc 1.2.右键共享,添加用户everyone 权限设置为可读写 不需要安装onenote 2.客户端工作 2.1.在客户端服务器 ...
- 京东 PC 首页 2019 改版前端总结 原创: 何Jason,EC,小屁 凹凸实验室 今天
京东 PC 首页 2019 改版前端总结 原创: 何Jason,EC,小屁 凹凸实验室 今天
- layuiadmin(iframe)常用问题集锦
1. 弹出窗口中传值给父层表单 table.on('tool(tableList)', function(obj){ var selected = obj.data; var layEvent = o ...
- Android平台签名证书(.keystore)生成指南
来源:https://ask.dcloud.net.cn/article/35777 Android平台签名证书(.keystore)生成指南 分类:HTML5+ Android证书 Android平 ...