关于redis如何下载和安装使用开启都在下面的菜鸟连接当中,这里就不多叙述了。
http://www.runoob.com/redis/redis-tutorial.html
关于查看redis中数据,我是用的是RedisDesktopManager可视化工具很方便能看到里面的东西
这篇博客是参考下面这个链接时产生的问题和解决这些问题,这也是我第一次使用redis
https://www.cnblogs.com/gdpuzxs/p/7222309.html
为什么使用springboot因为简单方便没那么多的配置文件。
接下来进入正题:
在pom.xml中增加redis的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在启动类中增加@EnableCaching开启缓存的注解 ps:@EnableScheduling//开启对定时任务的支持
@EnableCaching
@EnableScheduling
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
private static Logger logger = Logger.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
logger.info("============= SpringBoot Start Success =============");
}
}
在application.properties中增加redis的配置,有一部分配置是原本项目中就存在的配置,只配置redis时就增加redis的配置就行。设置redis缓存超时时间可以在application里面配置也可以在厦门的redisConfig中配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/*****?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=*****
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mybatis.mapperLocations=classpath:mybatis/*.xml
mybatis.type-aliases-package=com.mnnu.dao
## LOG4J配置
log4j.rootCategory=DEBUG,stdout
## 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
logging.level.com.mnnu=DEBUG
#logging.file=logs/spring-boot-logging.log
server.address=127.0.0.1
server.port=8080
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.jsp-servlet.init-parameters.development=true
spring.mail.host=*******
spring.mail.username=*******
spring.mail.password=*******
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=25000
spring.mail.properties.mail.debug=true
spring.mail.port=25
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
接下来就是新建一个java文件用来编写redis的配置代码。
一开始时忘记在类名上面增加@Configuration@EnableCaching这两个注解的时候这个配置文件是不起作用的,犯了个低级错误。
package com.mnnu.redis;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private int timeout;
//缓存管理器
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//设置缓存过期时间
cacheManager.setDefaultExpiration(30);
return cacheManager;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){
StringRedisTemplate template = new StringRedisTemplate(factory);
setSerializer(template);//设置序列化工具
template.afterPropertiesSet();
return template;
}
private void setSerializer(StringRedisTemplate template){
@SuppressWarnings({ "rawtypes", "unchecked" })
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
}
}
因为忘记增加那两个注解启动项目的时候,当进入到有需要缓存的Dao层是报了一个错误:
org.springframework.data.redis.serializer.SerializationException
这个错误呢是因为要缓存的JavaBean必须实现Serializable接口,因为Spring会将对象先序列化再存入 Redis,现在实现Redis序列化的有这么几种
(1)StringRedisSerializer
(2)Jackson2JsonRedisSerializer
(3)JdkSerializationRedisSerializer
(4)GenericToStringSerializer
(5)OxmSerializer
具体这几种的使用方式可以参考
https://blog.csdn.net/hotdust/article/details/52251148
我是在我的实体中继承了JdkSerializationRedisSerializer。但因为后来我发现没有开启扫描那个RedisConfig我又开启时又报了个冲突No serializer found for class org.json.JSONObject原因是因为那两个冲突了吧。
使用JdkSerializationRedisSerializer Redis中存入的数据长成这个样子的
而使用Jackson2JsonRedisSerializer时候是长成一个json串,个人感觉这个看起来舒服很多,应该大部分人都会喜欢这个。
最后一部分呢应该就是dao层了,dao层的类上忘记加CacheConfig时会需要在下面的配置其他缓存时要加上value不然会报错
据某位大神说: 正常的话 项目是不会这样使用redis的, 正常会将一些不常变化但使用频率高的数据放人redis, 如果数据库有变则人为手动去重新存入redis。就是有个发布功能,并不是实时更新 不然 根本就没有用上redis的好处。还有一种就是, 当项目重启时, 加入一个启动类,将项目中所需的数据 从数据库读取放入redis,这样就不用频繁更新。
所以上述这个例子只是用来尝试简单的redis记录一下自己第一次尝试redis。