不能辜负大家的关注,来一篇吧!记得面试的时候别说没用过redis!!!
为防止打穿底层MD部门,所以在调用jsf服务的时候进行查询数据的缓存处理。我们先说示例,再谈理论!
示例
使用的redis是,JD的redis客户端;
/**
* 京东redis客户端
*/
private Cluster jdRedisClient;
使用的存储对象方法,采用setObjectByExpire()
/**
* 以有效期的方式存储对象
*
* @param key 存储key
* @param object 存储对象
* @param seconds 有效期,秒
* @return true:保存成功,false:保存失败
*/
@Override
public boolean setObjectByExpire(String key, Object object, long seconds, TimeUnit timeUnit) {
try {
String json = JSON.toJSONString(object);
jdRedisClient.set(key, json);
jdRedisClient.expire(key, seconds, timeUnit);
return true;
} catch (Exception e) {
return false;
}
}
根据key获取元素采用getObject()
/**
* 根据key获取元素
*
* @param key 存储key
* @param clazz 类类型
* @return 如果为空则无数据或抛出异常
*/
public <T> T getObject(String key, Class<T> clazz);
校验key是否存在采用exists()
/**
* 校验key是否存在
*
* @param key
* @return true:存在,false:不存在,如果抛出异常则默认不存在
*/
public boolean exists(String key);
在jsf调用结束将查询结果进行存储。
redisUtils.setObjectByExpire(RedisKey.HEALTH_KEY + (自行定义), model, RedisKey.WEEK, TimeUnit.SECONDS);
由于数据属于不轻易会改变的数据,所以设置过期时间1周。 RedisKey.WEEK=606024*7。
然后在每次调用前进行判断,如果存在这个key,那么我们从缓存中获取,如果没有我们再去通过jsf接口调用,并且存储这个调用结果。
if (redisUtils.exists(RedisKey.HEALTH_KEY + (自行定义))){
model = redisUtils.getObject(RedisKey.HEALTH_KEY + (自行定义), ContractAttrVO.class);
}
整体代码逻辑:
if (redisUtils.exists(RedisKey.HEALTH_KEY + (自行定义))){
model = redisUtils.getObject(RedisKey.HEALTH_KEY + (自行定义), ContractAttrVO.class);
}else {
conExtAttrByPin = xxx.getxxx((自行定义), atteTypeSet);
Assert.notNull(conExtAttrByPin);
Assert.notNull(conExtAttrByPin.getModel());
model = conExtAttrByPin.getModel();
redisUtils.setObjectByExpire(RedisKey.HEALTH_KEY + (自行定义), model, RedisKey.WEEK, TimeUnit.SECONDS);
}
当然,这只是一个最经典,最常用的缓存手段。
我们知道缓存作为系统性能提升的优先法宝。那么简单的实践说过了,说一说概念上的知识!
理论
缓存分类
缓存一般有以下几类:客户端、浏览器、CDN缓存、NGINX缓存、应用缓存及统一缓存(如redis)。
客户端缓存:很少使用,一般都是传统企业才会使用。把不变化或很长时间才变化的数据按一定格式存储在客户端的本地文件中,使用时通过js读取解析使用,延用了C/S结构的方式,适合数据量很大业务且技术有所不足的开发。
浏览器缓存:这种形式使用很广泛,极大地提升了用户体验,但有时会出现没及时更新导致显示“错误”的信息。把已经请求过的Web资源(如html页面,图片,js,css等)拷贝一份副本储存在浏览器中,缓存会根据进来的请求保存输出内容的副本。这种缓存带来的好处有三点:减少网络带宽消耗,降低服务器压力,减少网络延迟、加快页面打开速度,适合请求量大、静态的数据请求。
CDN缓存:在用户和服务器之间增加cache层,把数据存放到内容分发网络机房服务器中,用户请求进从最近的CDN节点获取。主要缓存图片、js及css文件,CDN需要付费,有些规模的网站才会使用。
NGINX缓存:对客户已经访问过的内容在Nginx服务器本地建立副本,达到减少Nginx服务器与后端服务器之间的网络流量。
应用缓存:在后端应用中使用缓存,如java常使用Ehcache及gauva缓存组件进行数据缓存,也可以针对特殊场景在请求中进行线程缓存。适合调用量大且应用内部方法间调用,减少网络消耗。
统一缓存:使用内存减少对数据库的直接访问,提高网站性能,如使用memcache或redis搭建缓存服务。
前四类都是在网络传输中进行数据缓存,一般研发很少会去使用,后两类在应用中缓存,在开发中经常使用。
结语
具体的案例,下次才说吧,写文章的时间还是较少,有点空还是想歇歇,贪玩呀!有一起王者的吗?嘿嘿