2.添加索引方案:面对1~2千的并发是没有压力的,在往上则限制的瓶颈就是数据库最大连接数了,在上面中我用show global status like 'Max_used_connections’查看数据库可以知道数据库最大响应连接数是5700多,超过这个数tomcat直接报错连接被拒绝或者连接已经失效
3.缓存方案:在上面的测试可以知道,要是我们事先把数据库的千万条数据同步到redis缓存中,瓶颈就是我们的设备硬件性能了,假如我们的主机有几百个核心CPU,就算是千万级的并发下也可以完全无压力,带个用户很好的。
4.索引+缓存方案:缓存事先没有要查询的数据,在一万的并发下测试数据库毫无压力,程序先通过查缓存再查数据库大大减轻了数据库的压力,即使缓存不命中在一万的并发下也能正常访问,在10万并发下数据库依然没压力,但是redis服务器设置最大连接数300去处理10万的线程,4核CPU处理不过来,很多redis连接不了。我用show global status like 'Max_used_connections'查看数据库发现最大响应连接数是388,这么低所以数据库是不会挂掉的。雷达下载更专业。
5.使用场景:a.几百或者2000以下并发直接加上组合索引就可以了。b.不想加索引又高并发的情况下可以先事先把数据放到缓存中,硬件设备支持下可解决百万级并发。c.加索引且缓存事先没有数据,在硬件设备支持下可解决百万级并发问题。d.不加索引且缓存事先没有数据,不可取,要80多秒才能得到结果,用户体验极差。
6.原理:其实使用了redis的话为什么数据库不会崩溃是因为redis最大连接数为300,这样数据库最大同时连接数也是300多,所以不会挂掉,至于redis为什么设置为300是因为设置的太高就会报错(连接被拒绝)或者等待超时(就算设置等待超时的时间很长也会报这个错)。
具体实现步骤如下:1.新建一个文本文件,包含redis命令SETKey0Value0SETKey1Value1SETKeyNValueN如果有了原始数据,其实构造这个文件并不难,譬如shell,python都可以2.将这些命令转化成RedisProtocol。因为Redis管道功能支持的是RedisProtocol,而不是直接的Redis命令。如何转化,可参考后面的脚本。3.利用管道插入catdata.txt|redis-cli--pipeShellVSRedispipe下面通过测试来具体看看Shell批量导入和Redispipe之间的效率。测试思路:分别通过shell脚本和Redispipe向数据库中插入10万相同数据,查看各自所花费的时间。Shell脚本如下:#!/bin/bashfor((i=0i>redis.logdone每次插入的值都是helloworld,但键不同,name0,name1name99999。RedispipeRedispipe会稍微麻烦一点1>首先构造redis命令的文本文件在这里,我选用了python#!/usr/bin/pythonforiinrange(100000):print'setname'+str(i),'helloworld'#python1.py>redis_commands.txt#head-2redis_commands.txtsetname0helloworldsetname1helloworld2>将这些命令转化成RedisProtocol在这里,我利用了github上一个shell脚本,#!/bin/bashwhilereadCMDdo#eachcommandbeginswith*{numberargumentsincommand}\r\nXS=($CMD)printf"*${#XS[@]}\r\n"#foreachargument,weappend${length}\r\n{argument}\r\nforXin$CMDdoprintf"\$${#X}\r\n$X\r\n"donedoneredis_data.txt#head-7redis_data.txt*3$3set$5name0$10helloworld至此,数据构造完毕。测试结果欢迎分享,转载请注明来源:内存溢出
评论列表(0条)