java使用mysql 、redis处理高并发

g084120209 发布于 2017/02/09 10:44
阅读 2K+
收藏 0

我使用tomcat8.0.39作为一个培训机构的选课系统的服务器,1.此机构星期一到星期天都有课,2.每天大约有40门课程供学生选择,3.每个学生每选一门课都会查询是否选过该课程,时间与别的课程是否冲突,是否超过限定人数,添加选课信息,添加一条统计记录,生成订单,等至少6个数据库操作,还不包括一些判断和验证,4.此机构联系了大约2000左右的学生。实际应用场景:开启选课的时候,出现很多问题,1.选课有人
进不去,2.有的课程学生选不上,3.学生后台显示学生重复多次选择了某一们课程,4.系统反应很慢,点击选课之后很久才响应,或者直接回复服务器繁忙,5.后台数据混乱,有些判断和验证都没执行。

在网上查了资料,说使用redis做缓存,但是我水平有限,有几个问题不知道怎么解决:

1.mysql与redis数据怎么同步

2.选课的时候,操作redis中的数据,那怎么实现准确的查询,和添加一条记录,因为redis中没有表名

请各位大神帮帮忙,指点一下,我感激不尽!

加载中
0
阳光test
阳光test

1、选课有人进不去,这多半是因为所有课程的查询你都是直接query db,而索引什么弄得不好或者程序你设计的不好,自然rt就高了,然后大家就进不去了;

2、有的课程学生选不上这个应该是你程序问题;

3、学生后台显示学生重复选择了课程,那说明你数据库没有去做unique限制或者你的程序没做并发控制;

总体说来,和redis没什么关系,你搜到的redis也就是前置一层cache,挡住很多query而已,但是我看了你的描述,你这里的问题远不止这点,如果单纯redis数据同步,如果只是前置cache,最简单的方式就是if(redis 没有数据) {查询db,put数据到redis} else {直接从redis获取数据},但是这种如果瞬间并发量很大,很容易就雪崩了,复杂一点的办法是定时put数据到redis,如果实时性要求很高,这就很麻烦了,可能要读mysql binlog,然后将binlog解析出来put到redis了。

0
求是科技
求是科技

1.redis做的是缓存,缓存-->mysql,就是反序列化的过程嘛,这个网上的资料太多了。

2.redis中没有表名?你可能没有使用过redis。你仔细看看redis就懂了。

3.高并发问题。你这同时有多少个学生选课啊。可以通过权限逐级控制选项来解决这个问题啊。比如说,某个学生选择了 java开发这门课程(时间是每天的9点--11点),因此,该学生选择其他课程的时候,选项中就不要出现9--11点的课程啊

0
g084120209
g084120209

首先多谢各位的帮助。我以前选课是直接操作mysql的,所以出了这么多的问题。学生课程选不上,是因为我系统设计的不好,有1人对同一门课选了2次,导致别人就不能选课了,我是不是在操作某一条记录的时候,加上行级锁。现在,想在此基础上使用redis,但是以前没接触过,是第一次弄,所有有很多地方不清楚。

b
bingtel
需要加锁……可能select的时候,也要 for update一下
0
f
freezingsky

这种业务以及用户量,就算啥缓存不用,也不会成这样子。。。

g084120209
g084120209
哎,系统没设计好,也没有做静态,需求前后变动太大了,所以有点乱了
0
后之后觉
后之后觉

系统设计上有问题。这点用户不用这些东西,用了反而会增加时间和复杂性。建议重新设计一下。也可以使用nginx来做负载均衡(百度有教程半天就ok啦~)。不过一定要注意session共享的问题。在查询上可以适当的加一些索引。

后之后觉
后之后觉
回复 @g084120209 : ip_hash可以,但是也有一定风险,就是在做CND加速的时候ip_hash就会失效。您可以参考一下这个看看:http://www.bubuko.com/infodetail-1805471.html 希望能帮助到您
g084120209
g084120209
用户量虽说不大,但也有1-2万,因为他是一个地级市多个合作学校的学生同时选课的
g084120209
g084120209
我做了nginx的负载均衡,然后session问题我使用的是ip_hash解决,这都是查百度的,不知道对不对
0
mickelfeng
mickelfeng

用户量这么少。并发也应不大。一台服务器搞定。

返回顶部
顶部