一个在线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);即可保证无锁又全局唯一自增,作为时间序列。

posted on 2015-07-13 18:20 paulwong 阅读(503) 评论(0)  编辑  收藏 所属分类: 性能优化

java 无锁并发_高并发情况下怎样尽量实现无锁编程相关推荐

  1. java设计模式并发_[高并发Java 七] 并发设计模式

    [高并发Java 七] 并发设计模式 [高并发Java 七] 并发设计模式 为什么80%的码农都做不了架构师?>>> 在软件工程中,设计模式(design pattern)是对软件设 ...

  2. ci mysql高并发_高并发访问mysql时的问题(一):库存超减

    标签: 如果在对某行记录的更新时不采取任何防范措施,在多线程访问时,就容易出现库存为负数的错误. 以下用php.mysql,apache ab工具举例说明: mysql表结构 CREATE TABLE ...

  3. python websocket异步高并发_高并发异步uwsgi+web.py+gevent

    为什么用web.py? python的web框架有很多,比如webpy.flask.bottle等,但是为什么我们选了webpy呢?想了好久,未果,硬要给解释,我想可能原因有两个:第一个是兄弟项目组用 ...

  4. tcp的无延时发送_高并发架构的TCP知识介绍

    这是关于高并发架构网络协议基础知识的第二篇,编程路上的基础心法! 做为一个有追求的程序员,不能只满足增删改查,我们要对系统全方面无死角掌控.掌握了这些基本的网络知识后,相信一方面日常排错中会事半功倍, ...

  5. 队列处理高并发_高并发架构消息队列面试题解析

    面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...

  6. 队列处理高并发_高并发场景下缓存处理的一些思路

    在实际的开发当中,我们经常需要进行磁盘数据的读取和搜索,因此经常会有出现从数据库读取数据的场景出现. 但是当数据访问量次数增大的时候,过多的磁盘读取可能会最终成为整个系统的性能瓶颈,甚至是压垮整个数据 ...

  7. java基础多线程抢红包_高并发开发-微信抢红包实现

    - 如果上司给一个任务,让我们在实现微信抢红包这个功能,我们该怎么做? * 业务思考,实现方式千百种,不追求方法复制,只追求推导过程的思考总结 * 功能点探索 * 新建红包:在DB.cache各新增一 ...

  8. java currenttimemillis 效率_高并发场景下System.currentTimeMillis()的性能问题的优化

    前言 System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我也不知道,不过听说在100倍左右),然而该方法又是一个常用方法,有时不得不使用,比如生 ...

  9. java架构师眼中的高并发架构

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

  10. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

最新文章

  1. Node.js express 之mongoose 从异步回调函数返回值,类似于同步
  2. PHP函数 -字符串函数
  3. XCTF-MISC-新手区-坚持60s
  4. E3 tree 1.6在Firefox下显示问题的修复
  5. lambda,reserve list, list comprehension, string of slice
  6. 关于JavaScript DOM 编程艺术这本书
  7. 工具-cloc代码行数统计工具
  8. iOS常用RGB颜色的色值一览表
  9. Websphere 学习(二)
  10. Spy++ —— 窗口、消息查看分析利器
  11. CDH--彻底解决问题----时钟异常
  12. 绝妙一招 教你如何拍出烟雾缥缈的作品
  13. NRF24LE1有源RFID首选
  14. linux系统halt,Linux命令之halt - 停止系统运行但不关闭电源
  15. thinkphp5中带参数跳转
  16. ih5连接mysql数据库_iH5高级教程:H5数据应用,数据库基础
  17. 【评测】Invent脂肪组织蛋白质快速提取
  18. 2020上半年总结:逆势上行与困顿迷茫
  19. My Publications
  20. QChart绘制占比图,但是以时间轴为X轴

热门文章

  1. ICCV 2019 | ICCV 2019 论文接收列表 | ICCV 2019一共接收1077篇 | 共4303篇投稿
  2. 基于FPGA的数字频率计设计
  3. 我能够入职世界顶尖的卡巴斯基,却被国内的安全公司拒之门外
  4. 学校机房环境监控系统解决方案!
  5. 毕业生 - 哈尔滨工业大学社会计算与信息检索研究中心 - 理解语言,认知社会...
  6. 肺腑之言-写给喜欢单片机的初学者
  7. 几何公差:GPS 2019 产品几何技术规范 (GDT)
  8. 绘制计算机网络拓扑图,绘制网络拓扑图1.ppt
  9. table 样式美化
  10. 一场来自腾讯的自我革命,已然来临!