数据库并发、避免脏数据的售票系统原理

实际 售票系统 是这样: 
 
           1.售票中,"座位号" 才是竞争资源;
           2.售票中,查看票是不发生锁号的.
           3.售票中,有个选票(选座位号)的动作,选座位号确定时,才发生锁号(即锁住改作为号,即使这锁号,也只是修改标记,表示自己暂时锁住);

           4.等客户交钱后,就确定提交交易完成,这时候,就成为售出该票了(当然,被锁的号,要修改为对应的已售标记,及其他流程操作).

高数据并发

一.应用服务器负载均衡 
1.链路负载均衡 
通过DNS解析域名时,将客户端的访问解析成不同的IP,分配到不同的入口,同时尽可能保证所访问的入口是所有入口中可能较快的一个。 
2.软件负载均衡 
访问时生成页面的任务会被分配给其中一台服务器完成,这个过程要保证公正、公平、平均。 
3.硬件负载均衡 

二.页面优化 
1.减少请求次数 
通过合并CSS和Javascript文件来减少请求次数或是将资源文件分布在多个域名下来绕过浏览器并发加载的限制。 
2.压缩CSS和Javascript代码。 
通过对文件代码内容删除换行和空格来减少代码存储空间。 
3.优化图片 
通过对图片进行截取和缩放大小来优化图片,加快图片加载速度。 
4.静态化 
利用FreeMarker将数据库数据静态化成html文件来提高访问速度。适用场合:对于含有不要求实时性的内容的网页可使用,如网站首页,各模块首页的新闻,公告等等。 

三.java设计优化 
1.设计模式 
单例模式、代理模式、享元模式、装饰者模式、观察者模式。 
2.缓存 
如:使用Ehcache可以结合AOP,做业务层的方法缓存,以类名、方法名、参数名作为key,结果对象作为value。适用场合:对数据不经常更新,查询方式比较固定。 
3.缓冲 
如:JDK的IO包中BufferedWriter 
4.多线程 
适用场合:群发邮件,大批量处理图片,写日志。典型的消费者生产者模式 
5.对象池 
如:数据库连接池C3P0、线程池Executors、Apache的对象池Jakarta Commons Pool 
6.分布式缓存 
分布式缓存框架Terracotta,可实现分布式session、EhCachc等共享。 

四.java程序优化 
1.String 
String的replace、substring内存泄露问题,StringTokenizer取代split方法,charAt方法代替startsWith、endsWith方法,StringBuilder取代String并初始化预估的capacity。 
2.List 
查询优先使用ArrayList,插入删除优先使用LinkedList。如果插入数据在数组最后一位,则ArrayList性能好于LinkedList。遍历实现了RandomAccess接口的集合性能由高到低依次排序:索引下标>迭代器>增强for 
3.Map 
hashCode方法决定集合的性能。 
4.优化集合访问代码 
创建集合对象时,初始化预估的capacity可提高性能。尽量使用内部元素来取代方法调用。 
5.NIO 
使用MappedByteBuffer来取代传统IO来进行文件读写。 
6.引用 
在适当时候缓存可以用弱引用或是软引用来实现,如:WeakHashMap。 
7.异常 
尽量避免在循环体内使用异常捕获。 
8.位运算代替乘除运算

五.数据库优化 
1.分表 
通过对记录ID取膜或时间维度的规则进行分表。 
2.分区 
Oracle数据库支持分区,可以根据某个列的数据规则进行分区。 
3.中间表 
将原数据根据想得到的目标数据进行一系列的处理做出一套中间表,直接从中间表中进行查询,通过定时调度定时更新中间表。适用场合:对数据内容实时性要求不高,如:数据分析。 
4.历史归档 
可根据时间整理出很少用到的数据集抽到历史表中,数据表只留常用数据,可以利用对象序列化反序列化来实现。适用场合:对历史数据极少访问。 
5.列式存储 
MySQL开源数据仓库Infobright,对高压缩比数据存储,查询速度可提高5~60倍,免费版不支持DML语句,不支持高并发,只能支持10多个并发查询,可通过load导入csv数据文件。适用场合:对数据不经常更新并且实时性要求不高,如:数据分析。 
6.查询缓存 
MySQL Query Cache,Oracle Result Cache,可通过修改数据库配置文件来实现查询缓存,sql语句作为key,结果作为value的缓存方式,当数据表发生改变时相应的cache就会失效。适用场合:对数据不经常更新,查询方式比较固定。注:支持表连接,但不支持函数 
7.建索引 
对于使用较复杂的sql,对大数据量表查询时候,可采用建索引的方式,将涉及到的查询条件字段,可提高查询速度。 
8.sql优化 
sql语句中,select后尽量明确字段名来代替*来减少查询列。尽量少使用in关键字,可通过left join和exists关键字取代。 
9.存储过程 
存储过程只需编译一次,适用场合:当对数据库进行复杂操作时。如:多表的查询,计算,更新。 
10.数据库服务器集群,读写分离。 

六.JVM调优。 
1.确定堆内存大小(-Xmx、-Xms)。 
2.合理分配新生代和老年代(-XX:NewRatio、-Xmn、-XX:SurvivorRatio)。 
3.确定永久区大小(-XX:Permsize、-XX:MaxPermSize)。 
4.选择垃圾收集器(CMS、G1等)、对垃圾收集器合理设置。 
5.禁用显示GC(-XX:+DisableExplicitGC)。 
6.禁用类元数据回收(-Xnoclassgc)。 
7.禁用类验证(-Xverify:none)。 

七.需求上解决:如果性能瓶颈的模块的需求是可有可无,可以考虑屏蔽掉此需求。 

八.性能调优工具 
1.JMeter:性能测试、压力测试。 
2.JConsole、JProfiler:监控堆信息、线程、永久区使用情况、类加载情况等。 
3.Visual VM:故障诊断、性能监控。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值