zdd123456的gravatar头像
zdd123456 2016-05-11 14:03:54

如何实现更新数据库的时候同步更改缓存信息?

最近有点时间在看别人之前的项目,发现了一个问题,项目启动的时候查询数据库的一张系统设置表(因为这张表是常量表,改动很少)把数据放到缓存里,如果有用到这些数据的就在缓存里取,问题来了:如果在表里更改了数据,那么读取的时候还是加载之前启动时候的缓存数据。由于技术水平有限,所以还没想出用什么办法可以在不重启项目的情况下做到更新到最新的数据呢?求大神!!!!!!!!!

所有回答列表(5)
lic721的gravatar头像
lic721  LV1 2016年6月19日

>用什么办法可以在不重启项目的情况下做到更新到最新的数据呢?

不重启项目的意思是指不修改java代码吗?

如果想不改代码, 想来除非是之前的代码有考虑到DB数据同步的问题.

提供个改动方法,供参考:

1.DB即时同步:

  DB即时同步, 比较稳妥的做法是在DB中写个trigger(触发器),即时响应某表的所有修改并通知服务器同步修改缓存.实现难度和实现后的性能开销都较大. 你要是要即时同步并改动较小, 那只能表示遗憾, 帮不上太多了.

 

2.DB非即时同步:

  写个定时器定时更新缓存, 为了提高效率,先判断数据库数据改没改,再决定是否更新缓存.

  唯一的难点是,定时器更新缓存期间,要禁止客户读取缓存,客户读取缓存时,要先判断缓存是否加载完毕, 否则不读取缓存而是直接读取数据库,或者等待缓存加载完毕. 但是如果能在客户非操作时间(例如凌晨00:00)做更新, 那就OK了.

评论(0) 最佳答案
ftssyang的gravatar头像
ftssyang  LV8 2016年5月11日

在增删改方法上 当方法执行成功后 同步缓存

独霸怡红院西西的gravatar头像
独霸怡红院西西  LV9 2016年5月12日

先进入后台,执行更新数据库语句就好了

最代码官方的gravatar头像
最代码官方  LV168 2016年5月12日

1.如果是db和cache必须实时同步的业务则需要增加事务保证操作的及时和正确,比如商品订单系统之类的业务

java伪码:

TRANSACTION start:

db.save();

cache.save();

TRANSACTION end:

2.如果非实时的话则可以通过MQ或java的Thread异步写入,比如log之类

java伪码:

db.save();

new thread().start(

run(){

cache.save()

}

);

masque的gravatar头像
masque  LV16 2016年5月16日

updateDB data --> clear();

if(empty){

    loading data

}

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友