java实现lu_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,就行啦,也节省锁以及更新推送中间状态的效率。再深入点,还在可以从分区上设计考虑。

也许你会问,别人写入的时候不愿意加序号怎么办,怎么办,凉拌!摆事实讲道理,你不提出来,别怎么知道你需要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值