问题终于解决啦
就是修改Object的类------>换成list集合
package com.fuwei.util;
import org.apache.log4j.Logger;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* Redis工具类
*/
public class RedisUtil {
private RedisTemplate<Serializable, List> redisTemplate;
/**
* 批量删除对应的value
* @param keys
*/
public void remove(final String... keys) {
for (String key : keys) {
remove(key);
}
}
/**
* 批量删除key
* @param pattern
*/
public void removePattern(final String pattern) {
Set<Serializable> keys = redisTemplate.keys(pattern);
if (keys.size() > 0)
redisTemplate.delete(keys);
}
/**
* 删除对应的value
* @param key
*/
public void remove(final String key) {
if (exists(key)) {
redisTemplate.delete(key);
}
}
/**
* 判断缓存中是否有对应的value
* @param key
* @return
*/
public boolean exists(final String key) {
return redisTemplate.hasKey(key);
}
/**
* 读取缓存
* @param key
* @return
*/
public Object get(final String key) {
Object result = null;
ValueOperations<Serializable, List> operations = redisTemplate
.opsForValue();
result = operations.get(key);
return result;
}
/**
* 写入缓存
* @param key
* @param value
* @return
*/
public boolean set(final String key, List value) {
boolean result = false;
try {
ValueOperations<Serializable, List> operations = redisTemplate
.opsForValue();
operations.set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 写入缓存
* @param key
* @param value
* @return
*/
public boolean set(final String key, List value, Long expireTime) {
boolean result = false;
try {
ValueOperations<Serializable, List> operations = redisTemplate
.opsForValue();
operations.set(key, value);
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void setRedisTemplate(
RedisTemplate<Serializable, List> redisTemplate) {
this.redisTemplate = redisTemplate;
}
}
查询接口处
第一次储存数据在redis里面(这个时候不能转换成json格式的数据)
json的数据返货回来的数据不是集合需要序列化
这个地方容易出问题(最开始就是这个地方出问题<转换成就送数据>)
在服务器上面查看数据
第二次访问 缓存里面获取数据
还有返回的数据展示到jsp页面
终于把这个redis的缓存弄好了(搞了好久的时间)
接下来准备测试压力
先部署一下准备测试压力
数据的通过量
图形的展示
基本通过量是在200左右的数据
现在关闭redis在再来测试一次
再来测试一次
同样的链接 通过的数据少了很多
平局量也少很多
最后在看看深度思考
1.为什么要使用memcache?memcashe有什么作用?
主要用于动态Web应用以减轻数据库的负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。
Memcache的实现原理
memcache处理的原子是每一个key、val,key会通过一个hash表转换成hash的key,便于查找对比以及竟可能的做到散列。
同时mem用的是一个二级散列,通过一个hash表来维护。memcache有两个核心组件:服务端和客户端。
在一个memcache组件查询中,client先通过key的hash值来确定kv在service端的位置,当server端确定后,客户端就会发一个请求个server端。
让它来查找出确切数据,因为这之间没有交互以及多播协议,因此mem带给网络的影响最小。
2.什么是负载均衡,为什么要做负载均衡?
要理解负载均衡,必须先搞清楚正向代理和反向代理。
注:
- 正向代理,代理的是用户。
- 反向代理,代理的是服务器
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
负载均衡是用反向代理的原理实现的。
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务
3.nginx如何实现负载均衡?
http://blog.csdn.net/qq_28602957/article/details/61615876(参考资料)
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver { server 192.168.0.14; server 192.168.0.15; }
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的
情况。
upstream backserver { server 192.168.0.14 weight=3; server 192.168.0.15 weight=7; }
权重越高,在被访问的概率越大,如上例,分别是30%,70%。
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver { server server1; server server2; fair; }
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
今天完成的事情:把前面的redis数据的缓存和数据的获取的问题,开始的list的集合的储存和json的数据的储存,开始测试的返回的数据,在开始不熟悉,到后面慢慢的熟悉,中间还是做了一些没有用的事情,通过快两周的学习的bug和类,充分了解到Object和list 还有ValueWrapper的几个数据类型之间,强转有时候不能实现,还有从服务器返回的数据(redis),类型不同不能展示
今天遇到的困难:就是那个list和Object的类的转换的问题,最后还是从新编写基础的的list的类,再来让查询的接口层调用,最后才解决,开始准备就是简单的强转,强转类不行
今天的收获:还是有充分了解了Object的类和list的类型的区别,开始觉得强转是可以的,但是获取数据有问题
加油坚持最久弄redis快疯了<终于解决了>