使用redis作为缓存

来源:互联网 发布:双系统怎么删除windows 编辑:程序博客网 时间:2024/05/25 21:33

工作中,由于遗留项目中设计不是很合理(或许刚开始很合理,但后续功能的添加,慢慢让其变形,一步步变得无法维护),导致性能比较低,现在并发数达不到需求,瓶颈主要在数据库操作,所以我们准备增加缓存层,减少系统数据库压力,提高系统查询性能。


选择使用redis作为缓存层,java开发使用Jedis作为客户端,将sql语句作为key,查询出的结果作为value存储;

查询时,现在redis中查,如果没有再去数据库中查,并添加到redis;

添加时,先操作数据库;

更新时,先删除redis中数据,再更新数据库,然后在redis中添加;

删除时,先删除redis;


demo写完,进行测试没有任何问题,但进行压测时发现以下问题:


redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:22)


这是由于以下参数设置问题,平时自己测试没有关系,但压力测试时并发量增大问题就出现了。

MaxActive: 可用连接实例的最大数目,为负值时没有限制。
MaxIdle: 空闲连接实例的最大数目,为负值时没有限制。
MaxWait: 等待可用连接的最大数目,单位毫秒(million seconds)


redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

这个问题出来,我们刚开始以为时网络有问题,但ping和连接都正常,后来又以为是keepalived虚拟出来的VIP有问题,但换成真实IP还是有问题,而且每台服务器都存在,后来在网上查找原因才明白:因为redis是单线程处理,所以并发量增大,处理不过来就会排队,堆积。而默认是当超过2s时,就会抛出此异常,因此在构建连接池设置超时时间即可。


new JedisPool(config, REDID_IP, REIDS_PORT,Integer.MAX_VALUE);

new JedisShardInfo(ips[i], port,Integer.MAX_VALUE, "read"+i);

其中Integer.MAX_VALUE设置的是超时时间,单位是毫秒。


附上当时参考的链接:http://blog.csdn.net/fachang/article/details/7984123







0 0
原创粉丝点击