JAVA之大道至简
Posted dagny
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA之大道至简相关的知识,希望对你有一定的参考价值。
java是一门面向对象的语言,虽然我比较有优势,早出生了几年。第一门语言是C语言,学得完全没什么感觉。更别谈什么学以致用了,饭碗还是靠java语言,所以至今对面向对象也没什么深刻的理解。啰嗦了几句,其实主要想表达的是,在程序猿的路上,更重要的是思考。而不是什么面向对象,什么框架,这些都只是工具。哈哈还想啰嗦一下知行合一的,想想还是算了。这么高深的道理,用文字表达不得出书。
今天简单分析一个需求。有100万条数据存储在数据库表A,大致结构如下:
表A | ||
客户ID | 推送内容 | 推送状态 |
需要推送到到某服务器,1秒推送的效率是50条,而客户希望1小时推送完成。1秒50,那一个小时也就只能推送18万笔。如果达到1小时推送完的话,那肯定得要用多线程吧。嗯不错,确实要用多线程,100/18,最起码得用6个线程。程序启动6个线程去查询数据库,怎么控制每个线程不读到重复的数据呢(重复这个问题可严重了,如果是提醒重复就是骚扰,如果是转账那重复就要钱了)
解决方案A,在读取数据库的方法加一把同步锁,确保只有一个线程读取就可以了。那实现方法大致如下:
1、给方法加锁确保一个线程进入
2、给某取18万笔数据(怎么取呢)
3、 批量更新这18万笔数据为(正在处理状态,以防其他线程重复取)
看着是不是挺复杂,那有没有简单的办法呢?嘿嘿当然有
解决方案B,给表A加个序号字段,要求在按顺序写入表,结构大致如下:
表A | |||
序号 | 客户ID | 推送内容 | 推送状态 |
1 | |||
2 | |||
3 | |||
.... | |||
1000000 |
思路是不是立即就有了,线程 A 取 1~180000,线程B就取 180001~360000,就行啦,也节省锁以及更新推送中间状态的效率。再深入点,还在可以从分区上设计考虑。
也许你会问,别人写入的时候不愿意加序号怎么办,怎么办,凉拌!摆事实讲道理,你不提出来,别怎么知道你需要。
以上是关于JAVA之大道至简的主要内容,如果未能解决你的问题,请参考以下文章