1什么是Redis
- Redis是使用标准C编写实现,而且完全在内存中保存数据
- Redis是一个开源的,先迚的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案
- Redis可以看做“内存中的数据结构服务器”。
- 目前Redis 支持列表、集合、可排序集合、哈希等数据结构。 Redis支持多种语言,诸如Java 、PHP、Ruby、Python
、Lua等 - Redis官方网网站是:http://www.redis.io/
2 Redis优点
异常快速 : 每秒可以执行大约110000设置操作,81000个读取操作。
支持丰富的数据类型,例如列表,集合,可排序集合,哈希等数据类型。
支持数据的持久化,Redis提供了一些策略将内存中的数据异步地保存到磁盘上,比如根据时间或更新次数。
Redis是一个多功能实用工具,具有缓存、消息传递等功能。
**
3 SpringBoot访问Redis操作
**
在spring-data-redis工具有一个RedisTemplate对象,可以使用该对象对redis操作。
对jedis的API进行了封装,对象序列化和反序列化进行了封装。
在原始Spring框架中配置RedisTemplate
<bean id="redisFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="192.168.95.128"></property>
<property name="port" value="6379"></property>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redisFactory"></property>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
</bean>
在SpringBoot框架中使用方法
在pom.xml引入spring-boot-starter-data-redis启动器
在application.properties定义redis访问参数
通过自动配置会创建RedisTemplate对象,直接注入使用
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
@Override
public YdmaResult loadCourse(int id) {
YdmaResult result = new YdmaResult();
//先查询Redis缓存
Course course = (Course)redisTemplate.opsForValue().get("course:"+id);
if(course == null) {
//缓存没有,再调用dao查询DB
course = courseDao.selectByPrimaryKey(id);
//将查询的course放入Redis缓存
redisTemplate.opsForValue().set("course:"+id, course);
System.out.println("从DB查询");
}
if(course != null) {
result.setCode(YdmaConstant.SUCCESS);
result.setMsg(YdmaConstant.LOAD_SUCCESS_MSG);
result.setData(course);
}else {
result.setCode(YdmaConstant.ERROR1);
result.setMsg(YdmaConstant.LOAD_ERROR1_MSG);
}
return result;
}
4缓存优点
提升系统的查询效率。避免频繁访问DB,把DB数据加载到缓存,从缓存查询。
缓存和DB数据同步性
当对DB做增删改操作时,需要同时更新缓存,保持缓存和DB数据一致性。
1 当对DB进行更新时,对缓存是做更新还是做清除操作?
选择清除
2 先更新DB?还是先更新缓存?
//更新缓存(清除)
//更新DB
5 什么样的数据适合用缓存
- 共享共用数据(共享)
- 增删改频率小(增删改少)
- 频繁访问的数据(查询多)
- 对实时性要求高的数据(特殊需求)
6 缓存穿透、缓存雪崩、缓存击穿
缓存穿透:访问缓存没找到数据,查询DB数据,DB也没有
解决方案:将DB查询的空值也放入缓存,设置一个短的有效期
缓存雪崩:在某个时刻或时间段,缓存数据突然清空,导致大量请求访问DB数据
解决方案:针对不同类型数据设置不同缓存有效期,或随机指定有效期
缓存击穿:高并发访问某个一个缓存key,结果key突然失效,导致高并发访问DB数据
解决方案:设置永不过期;或者采用互斥锁将代码锁定
7 Redis持久化机制
redis相对于memcached缓存工具相比,存储类型丰富、支持持久化。
redis支持RDB和AOF两种持久化机制(将内存数据写入磁盘文件)。
- RDB(快照模式)
可以在某一时刻将内存数据拍照,写入一个rdb文件中。特点:恢复快,但是会存在丢失问题。
save //备份命令,只要将rdb文件放到redis安装目录重新启动服务就会自动恢复。
//默认配置1、5、15分钟备份一次
save 900 1 //900秒发生1次key变化就自动save
save 300 10 //300秒发生10次key变化就自动save
save 60 10000 //60秒发生10000次key变化就自动save
- AOF(日志模式)
可以将执行redis操作命令写入到一个aof文件中。特点:恢复慢,但是完整性好。默认关闭。
appendonly yes//yes开启aof持久化,no关闭
appendfilename "appendonly.aof" //aof文件名
# appendfsync always //一直记录,每个命令记录
appendfsync everysec //1秒记录一次
# appendfsync no //不记录
如果RDB和AOF同时启用,恢复时采用aof文件恢复。