一个在线2k的游戏,每秒钟并发都吓死人。传统的hibernate直接插库基本上是不可行的。我就一步步推导出一个无锁的数据库操作。

1. 并发中如何无锁。

一个很简单的思路,把并发转化成为单线程。Java的Disruptor就是一个很好的例子。如果用java的concurrentCollection类去做,原理就是启动一个线程,跑一个Queue,并发的时候,任务压入Queue,线程轮训读取这个Queue,然后一个个顺序执行。

在这个设计模式下,任何并发都会变成了单线程操作,而且速度非常快。现在的node.js, 或者比较普通的ARPG服务端都是这个设计,“大循环”架构。

这样,我们原来的系统就有了2个环境:并发环境 + ”大循环“环境

并发环境就是我们传统的有锁环境,性能低下。

”大循环“环境是我们使用Disruptor开辟出来的单线程无锁环境,性能强大。

2. ”大循环“环境 中如何提升处理性能。

一旦并发转成单线程,那么其中一个线程一旦出现性能问题,必然整个处理都会放慢。所以在单线程中的任何操作绝对不能涉及到IO处理。那数据库操作怎么办?

增加缓存。这个思路很简单,直接从内存读取,必然会快。至于写、更新操作,采用类似的思路,把操作提交给一个Queue,然后单独跑一个Thread去一个个获取插库。这样保证了“大循环”中不涉及到IO操作。

问题再次出现:

如果我们的游戏只有个大循环还容易解决,因为里面提供了完美的同步无锁。

但是实际上的游戏环境是并发和“大循环”并存的,即上文的2种环境。那么无论我们怎么设计,必然会发现在缓存这块上要出现锁。

3. 并发与“大循环”如何共处,消除锁?

我们知道如果在“大循环”中要避免锁操作,那么就用“异步”,把操作交给线程处理。结合这2个特点,我稍微改下数据库架构。

原本的缓存层,必然会存在着锁,例如:

public TableCache

{

private HashMap caches = new ConcurrentHashMap();

}

这个结构是必然的了,保证了在并发的环境下能够准确的操作缓存。但是”大循环“却不能直接操作这个缓存进行修改,所以必须启动一个线程去更新缓存,例如:

private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor();

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 无锁缓存_如何在高并发环境下设计出无锁的数据库操作(Java版本)相关推荐

  1. 如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  2. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

  3. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!...

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

  4. java支付宝支付_Java 高并发环境下的性能优化,揭秘支付宝技术内幕

    前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适 ...

  5. 【高并发】在高并发环境下该如何构建应用级缓存?

    来自:冰河技术 写在前面 随着我们的系统负载越来越高,系统的性能就会有所下降,此时,我们可以很自然地想到使用缓存来解决数据读写性能低下的问题.但是,立志成为资深架构师的你,是否能够在高并发环境下合理并 ...

  6. 高并发环境下,6个构建缓存服务需要注意的问题

    摘要:高并发环境下如何构建缓存服务,你知道吗? 本文分享自华为云社区<[高并发]高并发环境下构建缓存服务需要注意哪些问题?>,作者:冰 河. 缓存特征 (1)命中率:命中数/(命中数+没有 ...

  7. 在高并发环境下该如何构建应用级缓存

    摘要:立志成为资深架构师的你,是否能够在高并发环境下合理并且高效的构建应用级缓存呢? 本文分享自华为云社区<[高并发]在高并发环境下该如何构建应用级缓存?>,作者:冰 河. 随着我们的系统 ...

  8. oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...

    [高并发]高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 发布时间:2020-04-19 00:47, 浏览次数:126 , 标签: Tomcat 写在前面 随着系统并发量越来越高,Tomc ...

  9. tomcat 请求超时_高并发环境下如何优化Tomcat性能?看完我懂了!

    来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...

最新文章

  1. 程序员如何做瑜伽? | 每日趣闻
  2. 本地window cmd 远程连接外网redis
  3. 非洲瓜哇JAVA布的特点_java语言的基本特性以及编程细节
  4. 【C语言】控制台窗口图形界面编程(三)窗口相关设置
  5. .NET Core使用swagger进行API接口文档管理
  6. EXEJ4 生成的java exe文件更换电脑后出现闪退情况解决办法
  7. linux系统wget、curl终端命令行获取公网ip地址及其他网络信息
  8. vscode运行html的插件_vscode前端常用插件推荐,搭建JQuery、Vue等开发环境
  9. 函数二的变量作用域,多函数执行,返回值,函数参数,拆包,引用
  10. “飞天、无影、小蛮驴…”带你走进2020云栖大会
  11. 直面 Jira,Worktile CTO 为何自信满满?
  12. 两相四线混合式步进电机用双H桥驱动电路之Multisim仿真及优化
  13. linux校验密码错误,linux 命令 如何做密码校验
  14. 2021-04-20
  15. CCNET的参考文件
  16. 尚硅谷-离线数仓-笔记
  17. 阿里云oss文件上传(简单上传、服务端签名后直传)
  18. 如何应对开源组件⻛险?软件成分安全分析(SCA)能力的建设与演进
  19. 128道软件测试面试题,总结目前互联网公司最常问的面试题
  20. mysql 多字段关键词模糊查询

热门文章

  1. mysql简拼_mysql实现汉字换拼音,及汉字转简拼
  2. ML基石_4_FeasibilityOfLearning
  3. Evaluation of long read error correction software 长读纠错软件的评估
  4. 数字图像处理中常用图像分割算法有哪些?
  5. php doss_php下ddos攻击与防范代码
  6. linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证
  7. linux入门教程命令,Linux入门命令掌握
  8. tensorflow gan 网络 示例
  9. 二十三、斐波那契查找算法
  10. 【Harvest源码分析】获取F0轮廓