如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1606字,纯文字阅读大概需要3分钟。
内容图文
![如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载](/upload/InfoBanner/zyjiaocheng/462/130f74e67bd343e181dd078cae33b94f.jpg)
EXECUTOR.execute(new LatencyProcessor(logs));
class LatencyProcessor implements Runnable
{
public void run()
{
// 这里可以任意的去修改内存数据。采用了异步。
}
}
OK,看起来很漂亮。但是又有个问题出现了。在高速存取的过程中,非常有可能缓存还没有被更新,就被其他请求再次获取,得到了旧的数据。
4. 如何保证并发环境下缓存数据的唯一正确?
我们知道,如果只有读操作,没有写操作,那么这个行为是不需要加锁的。
我使用这个技巧,在缓存的上层,再加一层缓存,成为”一级缓存“,原来的就自然成为”二级缓存“。有点像CPU了对不?
一级缓存只能被”大循环“修改,但是可以被并发、”大循环“同时获取,所以是不需要锁的。
当发生数据库变动,分2种情况:
1)并发环境下的数据库变动,我们是允许有锁的存在,所以直接操作二级缓存,没有问题。
2)”大循环“环境下数据库变动,首先我们把变动数据存储在一级缓存,然后交给异步修正二级缓存,修正后删除一级缓存。
这样,无论在哪个环境下读取数据,首先判断一级缓存,没有再判断二级缓存。
这个架构就保证了内存数据的绝对准确。
而且重要的是:我们有了一个高效的无锁空间,去实现我们任意的业务逻辑。
最后,还有一些小技巧提升性能。
1. 既然我们的数据库操作已经被异步处理,那么某个时间,需要插库的数据可能很多,通过对表、主键、操作类型的排序,我们可以删除一些无效操作。例如:
a)同一个表同一个主键的多次UPdate,取最后一次。
b)同一个表同一个主键,只要出现Delete,前面所有操作无效。
2. 既然我们要对操作排序,必然会存在一个根据时间排序,如何保证无锁呢?使用
private final static AtomicLong _seq = new AtomicLong(0);
即可保证无锁又全局唯一自增,作为时间序列。
如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载
标签:
本文系统来源:http://www.cnblogs.com/feiye512/p/5379403.html
内容总结
以上是互联网集市为您收集整理的如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载全部内容,希望文章能够帮你解决如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。