多线程环境下,缓存的设置如何避免多次操作

wpfc 发布于 12/02 18:32
阅读 220
收藏 1

当缓存数据失效时,多线程环境下查询新的数据,再次赋值,但是会存在多次查询数据库并赋值的操作,如何避免这样的情况发生,下图是一种方式,不知道是否可行,请大牛指教

加载中
0
a
admin_2

这种写法单机情况下,synchronized 很影响性能,不同key sql都在等待锁,分布式synchronized 锁不好使

wpfc
wpfc
单机情况下,synchronized如果锁在key值上会不会有问题,这样效率会不会高一点,再问下分布式环境下要如何处理,请指点
0
雨潇97
分布式情况不适合
liaoyuecai
liaoyuecai
回复 @wpfc : redis setnx分布式锁,不过注意别死锁
wpfc
wpfc
分布式环境下有什么好的方法,用分布式锁替换synchronized吗?还是说这段代码有问题,要换成其他的方案去实现,谢谢啦
0
wgslucky
wgslucky

在分布式环境下,在局部的时候应该让数据处在非分布式的环境中,比如,同一个用户的操作都负载到同一台服务上面,对这个用户的操作也都在同一台服务上面操作。这样就不会出现一个用户的数据多个地方使用的问题了。

wgslucky
wgslucky
回复 @wpfc : 既然使用了redis,为什么不所的服务共同使用一份数据。在服务启动的时候,或者秒杀开始的时候,把参与的商品数据全部加载到redis中,库存可以使用商品id关联库存值,当有秒杀成功时,使用redis的原子操作减少库存,当减少的库存返回的值小值0时,说明商品售完。这样在秒杀期间,只访问redis即可。
wpfc
wpfc
在分布式环境中,有一个秒杀活动的列表,列表上显示每一个商品的库存,我缓存了整个活动商品的列表。当活动开启,某些商品的库存变动之后,我将缓存时间设为1s,让它自动失效,当失效后,多个线程来访问时,都发现redis中没有数据,则去数据库查询(可能造成缓存击穿),查询到的数据再设置到redis中,就可能多次设置,是不是会多一些消耗,比较要去查询数据库
返回顶部
顶部