最近使用springboot做项目,使用了springboot+mybatis完成了一些基础接口的开发,其中有个接口,客户端大概需要每个10秒调用一次,每次调用都会连接一次数据库,然后查询,关闭连接,返回。大量频繁的连接数据库,增加了服务器性能的消耗,同时也使接口请求速度变慢。于是使用redis缓存来解决这一问题。
如果有redis不会安装的,可查看我之前的一篇博客,进行安装,地址https://blog.csdn.net/u012489412/article/details/81218983
springboot中要使用redis,先要导入相关的依赖包spring-boot-starter-data-redis,我这里使用maven进行导入。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
也许你会在别的博客上,还需要导入spring-boot-starter-cache,这种是版本比较老的。我们可以到maven上看一下,spring-boot-starter-cache已经被迁移到spring-boot-starter-data-redis上了。
这里我建立了一个名为RedisUtil的工具类,并定义了几个关于string类型数据的曾删改查。
package com.grg.util.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
* @Author fangming
* @Date:2018/7/27
* @Description:
*/
@Component
public class RedisUtil {
@Autowired
private RedisTemplate redisTemplate;
/**
* 是否存在键为key的某条数据
*
* @param key 键值名称
* @return true表示存在,false表示不存在
*/
public Boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
/**
* 普通缓存获取
*
* @param key
* @return
*/
public Object get(String key) {
if (key == null || !redisTemplate.hasKey(key)) {
return null;
}
return redisTemplate.opsForValue().get(key);
}
/**
* 设置永久有效的缓存
*
* @param key 键值名称
* @param value 键值
*/
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 设置带时间的缓存
*
* @param key 键值名称
* @param value 键值
* @param offset 失效时间 要大于0 如果time小于等于0 将设置无限期
*/
public void set(String key, Object value, long offset) {
redisTemplate.opsForValue().set(key, value, offset);
}
/**
* 删除键为key的数据
*
* @param key 键值名称
*/
public void remove(String key) {
if (key != null && redisTemplate.hasKey(key)) {
redisTemplate.delete(key);
}
}
}
其实在很多博客中,都是用注解进行缓存,我觉得那些不方便操作,而且会出错。
我喜欢在代码中直接使用。关于缓存什么?我主要是缓存http请求的数据。
@RequestMapping(value = "/getdata", method = RequestMethod.POST)
public String getData() {
Response mResponse = new Response();
//如果缓存中有,优先从缓存中获取,getStart为key
if(mRedisUtil.hasKey("getStart")){
return (String) mRedisUtil.get("getStart");
}
List mTestData= mITestService.getTestData();
if (!IsNullUtil.listIsNull(mTestData)) {
String reStr=mResponse.ok("获取成功",mCcbDevices.get(0));
//设置缓存
mRedisUtil.set("getStart",reStr);
return reStr;
}else{
return mResponse.error("获取失败");
}
}
@RequestMapping(value = "/setdata", method = RequestMethod.POST)
public String setData(String id) {
Response mResponse = new Response();
Boolean state = mITestService.updateById(id);
if (state) {
//当记录删除时,清掉缓存
mRedisUtil.remove("getStart");
return mResponse.ok("设置成功");
}else{
return mResponse.error("设置失败");
}
}
我在getData方法里,会先判断缓存是否存在,如果存在就从缓存中获取数据返回,如果不存在则从数据库获取数据,并且放到缓存中;
在setData方法里,当数据删除时,我将key为getStart的缓存清理掉。
运行我们的系统,调用接口,查看第一次,从数据库获取了数据,后面都从缓存中获取的。ok效果达到。
我们使用redis desktop manager查看缓存数据,发现缓存数据乱码了,如下
至于为什么会这样,我们可以打开源码看到,它采用的默认序列化和反序列化使用的是
JdkSerializationRedisSerializer,我们这里只修改它的keySerializer和valueSerializer即可。
于是新建一个名为RedisConfig的配置类,修改key值和value值的序列化方式。
/**
* @Author fangming
* @Date:2018/7/27
* @Description:
*/
@Configuration
public class RedisConfig {
@Autowired
private RedisTemplate redisTemplate;
@Bean
public RedisTemplate redisTemplateInit() {
//设置序列化Key的实例化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置序列化Value的实例化对象
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
好了,系统已经初步集成redis成功。