博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java系统高并发之Redis后端缓存优化
阅读量:6252 次
发布时间:2019-06-22

本文共 4040 字,大约阅读时间需要 13 分钟。

一:前端优化

  1. 暴露接口,按钮防重复(点击一次按钮后就变成禁用,禁止重复提交)
  2. 采用CDN存储静态化的页面和一些静态资源(css,js等)

二:Redis后端缓存优化

  1. Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
  2. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  3. 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  4. 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。
  5. 利用Redis可以减轻MySQL服务器的压力,减少了跟数据库服务器的通信次数。

2.1 Redis服务端下载以及安装

详细步骤参考:

注:以下pom.xml为Maven项目配置文件,若非Maven项目,百度相应名称包导入即可。

2.2 在pom.xml中配置Redis客户端

redis.clients
jedis
2.7.3

由于Jedis并没有实现内部序列化操作,而Java内置的序列化机制性能又不高,我们需要考虑高并发优化,在这里我们采用开源社区提供的更高性能的自定义序列化工具protostuff。

2.3 在pom.xml中配置protostuff依赖

com.dyuproject.protostuff
protostuff-core
1.0.8
com.dyuproject.protostuff
protostuff-runtime
1.0.8

2.4 使用Redis优化数据库访问

  1. 流程:先去Redis缓存中查询,以此降低数据库的压力。如果在缓存中查询不到数据再去数据库中查询,再将查询到的数据放入Redis缓存中,这样下次就可以直接去缓存中直接查询到。
  2. 推荐:新建dao.cache包,实现RedisDao类。例子中缓存实体类名为Seckill.class。例子:
  3. 使用protostuff序列化工具时,被序列化的对象必须是pojo对象(具备setter/getter)
import com.dyuproject.protostuff.LinkedBuffer;import com.dyuproject.protostuff.ProtostuffIOUtil;import com.dyuproject.protostuff.runtime.RuntimeSchema;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;/* *  Redis可以近似理解为Map
对象 */public class RedisDao {
private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final JedisPool jedisPool; public RedisDao(String ip, int port) { jedisPool = new JedisPool(ip, port); } private RuntimeSchema
schema = RuntimeSchema.createFrom(Seckill.class); public Seckill getSeckill(long seckillId) { // redis操作逻辑 try { Jedis jedis = jedisPool.getResource(); try { String key = "seckill:" + seckillId; // 并没有实现内部序列化操作 // get-> byte[] -> 反序列化 ->Object(Seckill) // 采用自定义序列化 // protostuff : pojo. byte[] bytes = jedis.get(key.getBytes());//根据Key获取Value // 缓存中获取到bytes if (bytes != null) { // 空对象 Seckill seckill = schema.newMessage(); ProtostuffIOUtil.mergeFrom(bytes, seckill, schema); // seckill 被反序列化 return seckill; } } finally { jedis.close(); } } catch (Exception e) { logger.error(e.getMessage(), e); } return null; } public String putSeckill(Seckill seckill) { // set Object(Seckill) -> 序列化 -> byte[] try { Jedis jedis = jedisPool.getResource(); try { String key = "seckill:" + seckill.getSeckillId();//保存Value的Key byte[] bytes = ProtostuffIOUtil.toByteArray(seckill, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); // 超时缓存 int timeout = 60 * 60;// 1小时 String result = jedis.setex(key.getBytes(), timeout, bytes); return result; } finally { jedis.close(); } } catch (Exception e) { logger.error(e.getMessage(), e); } return null; }}
  1. 在使用该RedisDao对象时,需要传入Ip地址和端口。
  2. new RedisDao("localhost","6379");
  3. 若使用Spring ICO容器,需配置:
  • 测试Demo:
Seckill seckill = redisDao.getSeckill(id);        if (seckill == null) {            seckill = seckillDao.queryById(id);            if (seckill != null) {                String result = redisDao.putSeckill(seckill);                System.out.pritln(result);                seckill = redisDao.getSeckill(id);                System.out.pritln(result);            }        }

转载于:https://www.cnblogs.com/yueshutong/p/9381589.html

你可能感兴趣的文章
高内聚低耦合 浅析
查看>>
数组与对象的深浅复制
查看>>
uploadify上传
查看>>
Google Kubernetes设计文档之服务篇-转
查看>>
django -- 插入行的不同方式
查看>>
paho.mqtt.embedded-c MQTTPacket transport.c hacking
查看>>
在接口测试中怎么处理开发是否提供接口文档的总结
查看>>
HDU_1086 You can Solve a Geometry Problem too(几何题)
查看>>
在新窗口中打开链接 javascript
查看>>
动物产生式识别系统
查看>>
Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路
查看>>
Docker Swarm 让你事半功倍
查看>>
string.Format字符串格式说明
查看>>
POJ 3518 Prime Gap(素数)
查看>>
Python3.6的组件numpy的安装
查看>>
Python的编码问题
查看>>
Javascript 打开模式窗口
查看>>
【听课笔记】MIT领导力课程笔记:施乐前CEO Anne——在火线上得到的经验
查看>>
【Oracle】手工配置Oracle 10G Enterprise Manager【转载】
查看>>
oracle用户状态
查看>>