使用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
- 使用redis作为缓存
- 使用redis作为缓存
- 使用Redis作为LRU缓存
- 使用Redis作为LRU缓存
- 使用Redis作为缓存2
- 使用Redis作为LRU缓存
- 使用Redis作为LRU缓存
- Redis作为MySQL缓存服务器的使用
- nodejs使用redis作为缓存介质,封装缓存类
- REDIS学习(3.2)spring boot 使用redis作为缓存
- Redis作为缓存总结
- Redis作为缓存
- redis作为缓存服务器
- redis 作为缓存总结
- 配置Redis作为缓存
- ssm开发使用redis作为缓存,使用步骤
- 在.Net项目中使用Redis作为缓存服务
- [Shiro入门](一)使用Redis作为缓存管理器
- 近期面试遇到问题
- qt学习
- LeetCode Largest Rectangle in Histogram (单调栈)
- Python中使用正则表达式
- man nc 中文版
- 使用redis作为缓存
- Hive学习路线
- iosGCD多线程之创建多线程
- Sort Colors —LeetCode
- 细说ASP.NET Cache 及其高级用法--服务端缓存
- poj K Best 最大化平均值 二分搜索
- Spiral Matrix
- iOS 网络编程4-发布异步请求
- eclipse中的常用快捷键