Springboot整合Redis与数据持久化
Springboot整合Redis
有两种存储数据的方式:
方案1:在Redis存放一个对象 使用json序列化与反序列化
方案2:直接使用redis自带序列化方式存储对象
maven依赖
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!– 集成commons工具类 –>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!– 集成lombok 框架 –>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!– fastjson –>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.30</version>
</dependency>
<!– SpringBoot-整合Web组件 –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
yml文件配置
redis:
host: www.kaicostudy.com
password: 123456
port: 6379
使用json方式存储
工具类代码
public class RedisUtils {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void setString(String key, String value) {
setString(key, value, null);
}
public void setString(String key, String value, Long timeOut) {
stringRedisTemplate.opsForValue().set(key, value);
if (timeOut != null) {
stringRedisTemplate.expire(key, timeOut, TimeUnit.SECONDS);
}
}
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
}
控制层
public class IndexController {
@Autowired
private RedisUtils redisUtils;
@RequestMapping(“/setRedis”)
public void setRedisKey(UserEntity userEntity) {
redisUtils.setString(“userEntity”, JSONObject.toJSONString(userEntity));
}
@RequestMapping(“/getRedis”)
public UserEntity setRedisKey() {
String userEntityJson = redisUtils.getString(“userEntity”);
UserEntity userEntity = JSONObject.parseObject(userEntityJson, UserEntity.class);
return userEntity;
}
}
存储方式:
序列化方式存储数据
注意需要序列化的对象一定要实现Serializable接口
工具类
public class RedisTemplateUtils {
@Resource
private RedisTemplate<String, Object> redisTemplate;
public void setObject(String key, Object object) {
redisTemplate.opsForValue().set(key, object);
}
public Object getObjet(String key) {
return redisTemplate.opsForValue().get(key);
}
}
控制层测试
public class IndexController {
@Autowired
private RedisTemplateUtils redisTemplateUtils;
@RequestMapping(“/setRedisSerializable”)
public void setRedisSerializable(UserEntity userEntity) {
redisTemplateUtils.setObject(“userEntity”, userEntity);
}
@RequestMapping(“/getRedisSerializable”)
public UserEntity getRedisSerializable() {
UserEntity userEntity = (UserEntity) redisTemplateUtils.getObjet(“userEntity”);
return userEntity;
}
}
序列化存储:
SpringBoot整合Redis的注解版本
详细介绍见另一篇博客:链接
MySQL与Redis一致性解决同步问题
方式1:直接清除Redis的缓存,重新读取数据库即可
方式2:使用mq异步订阅mysql binlog实现增量同步
方式3:使用alibaba的canal 框架
Redis持久化机制
全量同步与增量同步
全量同步:就是每天定时(避开高峰期)或者采用一个周期实现将数据拷贝到一个地方也就是Rdb存储。
增量同步:比如采用对行为的操作实现对数据的同步,也就是AOF。
全量与增量的比较:增量同步比全量同步更加消耗服务器的内存,但是能够更加的保证数据的同步。
RDB与AOF
Redis提供了两种持久化的机制,分别为RDB、AOF实现,RDB采用定时(全量)持久化机制,但是服务器因为某种原因宕机后可能数据会丢失,AOF是基于数据日志操作实现的持久化,所以AOF采用增量同步的方案。
Redis已经帮助我默认开启了rdb存储,两种模式可以同时开启,生产环境中一般两种模式都会开启,优先使用AOF。
RDB
Redis默认采用rdb方式实现数据的持久化,以快照的形式将数据持久化到磁盘的是一个二进制的文件dump.rdb, 在redis.conf文件中搜索“dump.rdb “。
Redis会将数据集的快照dump到dump.rdb文件中。此外,也可以通过配置文件来修改Redis服务器dump快照的频率,在打开配置文件之后,搜索save,可以看到下面的配置信息:
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
AOF
AOF 在Redis的配置文件中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件,能够保证数据不丢失,但是效率非常低。
appendfsync everysec #每秒钟同步一次,可能会丢失1s内的数据,但是效率非常高。
appendfsync no #从不同步。高效但是数据不会被持久化。
直接修改redis.conf中 appendonly yes
建议最好还是使用 everysec 既能够保证数据的同步、效率也还可以**。AOF是以执行命令的形式实现同步**
两者区别
到此这篇关于Springboot整合Redis与数据持久化的文章就介绍到这了,更多相关Springboot整合Redis内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!