如此并发性问题

本文转自 netcorner 博客园博客,原文链接:http://www.cnblogs.com/netcorner/archive/2008/07/29/1255395.html   ,如需转载请自行联系原作者



 这几天忙着解决并发性问题,一直也没好的解决方案,查过的一些资料也基本上就是数据库加琐,可我遇到这种情况估计用数据库加琐是很难解决的,下面大概描述这种情况:

       A,B用户(都具有该问这个模块权限的情况下)进入同一个管理列表时,数据都是相同的(因为当时可能还没有被修改),当时A用户就发现某条记录某项还没填写完整点击进去修改,此时B恰好也同时进入了该页面,也有想修改的意思。A用户把其中某项数据填写完整后提交了。而B看到这条记录,其实A用户已经填写完整了,但是他还不知道(看到的还是原先的信息),以为这下记录可能还存在问题,所以他在该记录信息的备注项,填写了“该信息未填写完整”,然后也提交上去。这时这条记录的信息其实就被B用户修改了,而A刚刚把这个填写完整的信息,全被B用户填写的信息覆盖了。

AB用户看到列表如下:
 

这时他们发现货物编号为53453453453里面填写不完整,两人正好同时点击进入了修改页。如图:


A用户把目的港改动了,而B用户在备注填写了一些说明(可能是说目的港填写有错).

A修改完以后,B随后也做了修改,这时完整的信息其实是被B修改的信息,而A刚刚把目的港改写的信息还是被成被B修改后的原始信息了,就等于A的修改动作没做一样了。

       这种情况如果单纯用数据库,估计很难解决,曾经想过把这条记录在某用户点击编辑时琐定,然后通过会话ID的判写,加记录的ID,此时只能第一个点击编辑的用户,才有编辑权限,当触发Session_End,就结束锁定该记录。

       以上问题是我个人的一点想法,不知园子里的朋友如果处理此问题的,向大家讨教心得。

在高并发场景下,缓存系统可能会面临诸如缓存穿透、缓存击穿和缓存雪崩等问题。这些问题会导致数据库压力骤增,甚至引发系统瘫痪。 ### 缓存穿透 缓存穿透指的是查询一个既不在缓存也不在数据库中的数据,这类请求通常会直接穿透到数据库层,如果大量发生则会对数据库造成不必要的负担。为了解决这个问题,可以采用布隆过滤器来概率性判断键是否存在,从而减少无效的数据库查询[^3]。 ### 缓存击穿 缓存击穿是指某个热点数据在缓存中失效后,导致所有对该数据的请求都直接发送到数据库上,这会瞬间增加数据库的压力。解决策略包括使用互斥锁(Mutex)来保证只有一个线程去加载数据到缓存中;设置热点数据永不过期;或者是在检测到缓存失效时提前进行缓存预热[^1]。 ### 缓存雪崩 缓存雪崩则是指当大量缓存在同一时间点失效,大量的请求同时到达数据库,可能导致数据库无法承受如此大的负载。为了避免这种情况的发生,可以通过给缓存设置随机的过期时间来分散失效时间点;对于读操作,可以使用双重检查锁机制来防止过多的并发请求冲击数据库;另外也可以采取缓存预热措施,在预期高峰到来之前将数据加载进缓存中[^2]。 此外,为了确保缓存与数据库之间的一致性,通常推荐的做法是先更新数据库然后再删除缓存条目,但需要注意处理好并发情况下的数据一致性问题,并且接受最终一致性的解决方案[^3]。 下面是一个简单的Python示例,演示了如何使用互斥锁来防止缓存击穿的情况: ```python import threading # 假设这是我们的缓存存储 cache = {} # 创建一个互斥锁 lock = threading.Lock() def get_data(key): # 如果数据不在缓存中 if key not in cache: # 获取锁 with lock: # 再次检查是否已经被其他线程加载 if key not in cache: # 模拟从数据库获取数据 data = fetch_from_database(key) # 将数据放入缓存 cache[key] = data return cache[key] def fetch_from_database(key): # 模拟数据库查询延迟 import time time.sleep(0.1) return f"Data for {key}" ``` 在这个例子中,`get_data`函数尝试从缓存中获取数据,如果没有找到,则获取互斥锁并再次确认是否已经由其他线程加载了数据。只有当确实需要加载时才会执行数据库查询,并将结果存入缓存。 通过上述方法和技术的应用,可以在很大程度上缓解高并发环境下缓存系统所面临的挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值