redi缓存(5)缓存的获取和集合的处理结局

问题终于解决啦

就是修改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;

}

}


v2-40c895133ab65a4421a6572ed6115880_b.jpg


查询接口处


v2-c0ce35ff753d895180fd2621bcfd2a75_b.jpg


第一次储存数据在redis里面(这个时候不能转换成json格式的数据)

json的数据返货回来的数据不是集合需要序列化

这个地方容易出问题(最开始就是这个地方出问题<转换成就送数据>)


v2-238aa522dfc43fa9651eba3c9db5c750_b.jpg


在服务器上面查看数据


v2-721174d91544ca8a1d2d810bc975df62_b.jpg


第二次访问 缓存里面获取数据


v2-593588661dfc379a35cf9df60a607e1f_b.jpg


还有返回的数据展示到jsp页面


终于把这个redis的缓存弄好了(搞了好久的时间)


接下来准备测试压力


v2-f47b744fee27f0c8acb4f9f4f973dc7c_b.jpg


先部署一下准备测试压力


v2-72fad5b08d13836933e357621d34d883_b.jpg



v2-30c2f5d6d4cd488b2547ddcfca297f44_b.jpg


数据的通过量


v2-b21b2988198a2ff81407ce82235a998a_b.jpg



图形的展示


v2-9b3e2a18657644c2d612b9109b0ad9b6_b.jpg


基本通过量是在200左右的数据

现在关闭redis在再来测试一次


v2-4c57f77b5dcf3ce513ee7e87eb83343d_b.jpg


再来测试一次


v2-d3cf6ffee0c5ddb09607ea694bc282ec_b.jpg


同样的链接 通过的数据少了很多


v2-9363e8aad9f1e09e92d2176d7a21dd43_b.jpg


平局量也少很多


v2-b9246b0ddf0dead4bcbb1090bf5ecb7c_b.jpg


最后在看看深度思考

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如何实现负载均衡?

blog.csdn.net/qq_286029(参考资料)

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快疯了<终于解决了>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值