1,订票系统案例,某航班只有一张机票,假定有1w个人打开你的网站来订票,问你如何解决并发问题(可扩展到任何高并发网站要考虑的并发读写问题)
问题,1w个人来访问,票没出去前要保证大家都能看到有票,不可能一个人在看到票的时候别人就不能看了。到底谁能抢到,那得看这个人的“运气”(网络快慢等)
其次考虑的问题,并发,1w个人同时点击购买,到底谁能成交?总共只有一张票。
首先我们容易想到和并发相关的几个方案 : 锁 同步
同步更多指的是应用程序的层面,多个线程进来,只能一个一个的访问,java中指的是syncrinized关键字。锁也有2个层面,一个是java中谈到的对象锁,用于线程同步;另外一个层面是数据库的锁;如果是分布式的系统,显然只能利用数据库端的锁来实现。
假定我们采用了同步机制或者数据库物理锁机制,如何保证1w个人还能同时看到有票,显然会牺牲性能,在高并发网站中是不可取的。使用hibernate后我们提出了另外一个概念:乐观锁、悲观锁(即传统的物理锁);采用乐观锁即可解决此问题。乐观锁意思是不锁定表的情况下,利用业务的控制来解决并发问题,这样即保证数据的并发可读性又保证保存数据的排他性,保证性能的同时解决了并发带来的脏数据问题。
hibernate中如何实现乐观锁:
前提:在现有表当中增加一个冗余字段,version版本号, long类型
原理:1)只有当前版本号》=数据库表版本号,才能提交
2)提交成功后,版本号version ++
实现很简单:在ormapping增加一属性optimistic-lock="version"即可,以下是样例片段
<hibernate-mapping>
<class name="com.insigma.stock.ABC" optimistic-lock="version" table="T_Stock" schema="STOCK">
2,股票交易系统、银行系统,大数据量你是如何考虑的
首先,股票交易系统的行情表,每几秒钟就有一个行情记录产生,一天下来就有(假定行情3秒一个) 股票数量×20×60*6 条记录,一月下来这个表记录数量多大? oracle中一张表的记录数超过100w后 查询性能就很差了,如何保证系统性能?
再比如,中国移动有上亿的用户量,表如何设计?把所有用于存在于一个表么?
所以,大数量的系统,必须考虑表拆分-(表名字不一样,但是结构完全一样),通用的几种方式:(视情况而定)
1)按业务分,比如 手机号的表,我们可以考虑 130开头的作为一个表,131开头的另外一张表 以此类推
2)利用oracle的表拆分机制做分表
3)如果是交易系统,我们可以考虑按时间轴拆分,当日数据一个表,历史数据弄到其它表。这里历史数据的报表和查询不会影响当日交易。
当然,表拆分后我们的应用得做相应的适配。单纯的or-mapping也许就得改动了。比如部分业务得通过存储过程等
3)此外,我们还得考虑缓存
这里的缓存,指的不仅仅是hibernate,hibernate本身提供了一级二级缓存。这里的缓存独立于应用,依然是内存的读取,假如我们能减少数据库频繁的访问,那对系统肯定大大有利的。比如一个电子商务系统的商品搜索,如果某个关键字的商品经常被搜,那就可以考虑这部分商品列表存放到缓存(内存中去),这样不用每次访问数据库,性能大大增加。
简单的缓存大家可以理解为自己做一个hashmap,把常访问的数据做一个key,value是第一次从数据库搜索出来的值,下次访问就可以从map里读取,而不读数据库;专业些的目前有独立的缓存框架比如memcached 等,可独立部署成一个缓存服务器。
分享到:
相关推荐
Apache Tomcat 7.0.47 和 Memcached 结合使用可以实现高效的session共享集群解决方案。Memcached 是一个高性能的分布式内存对象缓存系统,它能够将数据存储在内存中,以便快速访问,减轻数据库的负载。在Web应用中,...
总结来说,Memcached是一个强大的缓存解决方案,尤其适用于高并发的Web应用。通过合理的使用和配置,可以显著提升应用的响应速度,降低数据库负载。在J2EE项目中,通过Java客户端库,可以轻松地集成和操作Memcached...
总的来说,Memcached是一个强大的内存缓存解决方案,尤其适合于高并发的Web应用,通过合理配置和使用,能够显著提升系统响应速度,降低数据库负载。在Windows环境下,1.2.1版本的Memcached提供了简洁的部署方式,让...
分布式缓存系统在现代Web应用程序开发中扮演着至关重要的角色,尤其对于高并发、大数据量的场景,能够显著提升性能并降低数据库压力。本实例主要介绍如何使用C#语言集成和应用Memcached作为分布式缓存解决方案,以...
Memcached是一款高效、轻量级的分布式内存对象缓存系统,广泛应用于Web应用程序中,以减轻数据库负载,提高数据访问速度。在这个版本1.2.1中,我们探讨其核心特性、工作原理以及如何在Windows环境下进行安装和配置。...
3. 扩展性:分布式架构易于扩展,只需增加服务器即可应对更大的数据量和更高的并发请求。 4. 轻量级:占用资源少,对硬件要求低。 然而,Memcached也有一些局限性,如不支持持久化存储,数据丢失风险较高;且仅适用...
Tomcat 7.0.47版本提供了一种解决方案,即通过外部存储,如Memcached,来实现Session的共享。 Memcached作为分布式缓存系统,可以高效地存储和检索数据,特别适合于Session数据的存储。在Tomcat中,我们可以配置一...
因此,通常将Memcached用作短期缓存解决方案,适用于那些不经常改变但需快速访问的数据。 在缓存图片时,图片通常会被转换为字节串并存储在Memcached中,对应的键可能是图片的URL或唯一标识。当用户请求图片时,...
总的来说,分布式缓存Memcached是提升大型分布式系统性能和可扩展性的关键组件,选择合适的Java客户端库并合理配置,可以有效地解决本地缓存的局限性,为企业的高并发、大数据量场景提供稳定、高效的缓存服务。
4. 修改Tomcat的web.xml配置文件,使用Memcached Session Manager替换默认的Session Manager,配置相应的Memcached服务器地址和端口。 5. 在Nginx配置中添加Session黏性规则,确保用户请求始终被转发到之前处理其...
尽管被称为分布式缓存,但Memcached服务器之间并不直接通信以协调数据分布。分布式是通过客户端实现的,客户端负责决定数据应存储在哪个服务器上,并处理数据的一致性和复制。这意味着如果某个服务器失效,存储在该...
《深入理解memcached分布式缓存数据库部署》 memcached,作为一款高...然而,需要注意的是,memcached并不适用于所有场景,例如对于需要持久化存储或者复杂数据结构的应用,可能需要考虑其他缓存解决方案,如Redis。
缓存是IT行业中用于提高系统性能的关键技术,尤其是在大数据量和高并发场景下。这篇文章可能涵盖了这三种缓存系统的原理、应用场景、优缺点以及使用技巧。 描述中的“NULL”意味着没有具体的描述,但我们可以通过...
每个Memcached服务器独立工作,无中心协调,客户端负责数据的分发和选择服务器。 - **客户端算法** - **余数分散**:通过Key的Hash值对服务器数量取模来选择存储服务器。这种方法在服务器增减时会导致大量缓存失效...
4. **相互独立的分布式**:每个Memcached服务器独立工作,无需与其他服务器通信,由客户端负责数据分发。 安装Memcached在Windows上相对简单,可以从官方网站下载服务端程序,解压后通过命令行启动服务。默认情况下...
Memcached 是一个高性能、分布式内存对象缓存...总的来说,`memcached-win64-1.4.4-14.zip`为64位Windows用户提供了一个快速部署Memcached的解决方案,使得在Windows环境中也能享受到Memcached带来的高性能缓存服务。
1. **分布式会话管理**:在高并发的Web环境中,单一服务器的会话管理可能成为瓶颈,memcached-session-manager 提供了解决方案,它将用户的会话数据分布存储在多个 Memcached 服务器上,实现了会话的跨服务器共享,...
这个代理服务的主要目标是解决在大规模分布式缓存环境中的连接管理和负载均衡问题,提供了一种集中式的解决方案,可以有效地减少客户端与多个缓存服务器之间的直接交互,从而提高系统的整体性能和稳定性。...