发表于: 2017-11-21 21:04:09
1 651
- 今天完成的事情:
1.将redis的工具类用spring取代了,然后通过注解的方式,写出使用redis缓存的JSP和JSON接口。
2.完成任务六的所有代码,对六个接口在本地进行访问,确保没问题后,部署到远程的tomcat上,让本地nginx进行代理。
3.进行正式的压测,打出压测报告
(1)JSP接口(先是没开负载均衡,下面是开了负载均衡的)
1)无缓存
2)有memcached
3)有redis
(2)JSON接口(先是没开负载均衡,下面是开了负载均衡的)
1)无缓存
2)有memcached
3)有redis
4.深度思考
(1)为什么要使用memcache?memcache有什么作用?
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
而memcached主要用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。
(2)什么是负载均衡,为什么要做负载均衡?
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
它建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
(3)nginx如何实现负载均衡?
Nginx中配置负载均衡比较简单,只需要修改nginx.conf配置文件,添加均衡服务器列表,以及使用proxy_pass引用服务器列表即可,具体如下:
1)upstream
upstream webservers {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}
注:该配置放在http{}内,server{}之外,否则会报错。
2)proxy_pass
location / {
proxy_pass http://webservers;
proxy_set_header X-Real-IP$remote_addr;
}
注:引用均衡服务器的列表
明天计划的事请:
提交任务六,开始任务七
遇到的问题:
1.遇到的报错
ERR Client sent AUTH, but no password is set
意思就是redis服务器没有设置密码,但客户端向其发送了AUTH请求。
而究其根本原因就是启动redis有两种方式:
(1)指定配置文件启动 $: ./redis-server /usr/local/redis.conf
(2)不指定配置:$: ./redis-server &
但是呢,不指定配置文件启动时采用默认配置,无密码。
所以我们用第二种方式启动以后,发送AUTH请求后,redis会通过属性requirepass 访问密码,但没有设置该属性时,服务端就会返回异常:ERR Client sent AUTH, but no password is set
解决方式呢有两种:
第一种,就是用redis.conf启动,但是在启动前应该在其文件中找到它配置密码的一行然后去掉注释,采用货新建密码就行了。
第二种,就是还是通过redis-server访问,但是呢需要设置一些密码,具体命令就是:
redis 127.0.0.1:6379> CONFIG SET requirepass "123456"
OK
redis 127.0.0.1:6379> AUTH 123456
Ok
这样就行了。
2.就是redis建立的key是先要成为String类型的,在通过方法getbytes来转化为字符形式的。
这个是由于我的key是id,不是String类型的,我是想它操作完以后我转化一下数据类型,然后爆红后发现的,以后对代码的认识尽量缩小,一个一个学习。
收获:
1.缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询。
解决思路:
(1)如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。
(2)根据缓存数据Key的规则。例如我们公司是做机顶盒的,缓存数据以Mac为Key,Mac是有规则,如果不符合规则就过滤掉,这样可以过滤一部分查询。在做缓存规划的时候,Key有一定规则的话,可以采取这种办法。这种办法只能缓解一部分的压力,过滤和系统无关的查询,但是无法根治。
(3)采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力。关于布隆过滤器,详情查看:基于BitSet的布隆过滤器(Bloom Filter)
大并发的缓存穿透会导致缓存雪崩。
https://www.cnblogs.com/jinjiangongzuoshi/archive/2016/03/03/5240280.html
不错的资料。
2.宕机
口语里面我们简单的把停掉机器叫做down机,转换为汉字是“宕机”,但很多人都叫做“当机”,虽然不规范但却流行。
down就是up的反义,就是电脑不能正常工作了,包括一些原因而导致出现的死机。
(1)一般情况下指的就是计算机主机出现意外故障而死机。
(2)其次,一些服务器例如数据库死锁也可以称为宕机,一些服务器的某些服务挂掉了,就可以这么说。
评论