一、Spring Boot整合redies

1.缓存目的
缓存是用于提升系统的性能,加速系统的访问,降低成本的一种技术。可以将一些高频、热点信息放入缓存中,避免直接从数据库中查询,如商品的页面信息这种经常被访问的数据。
2.JSR-107 缓存规范
为了统一缓存的开发规范、提高系统的扩展性和最小化开发成本等,J2EE 发布了 JSR-107 缓存规范。
Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry和 Expiry。

CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
Entry是一个存储在Cache中的key-value对。
Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。

3.Spring 缓存抽象
Spring从3.1开始定义了org.springframework.cache.Cache和 CacheManager 接口来统一不同的缓存技术并支持使用 JCache(JSR-107)注解简化我们开发。

Cache:缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等.
CacheManager:缓存管理器,管理各种缓存(Cache)组件

核心注解:
注解 说明
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict 主要针对方法配置,清空缓存
@CachePut 保证方法被调用,又希望结果被缓存。
@EnableCaching 在启动类上面加注解@EnableCaching,开启缓存
keyGenerator 缓存数据时key生成策略
serialize 缓存数据时value序列化策略

注解参数:
属性名 说明 举例
cacheNames/value 缓存的名称,在spring配置文件中定义,必须指定至少一个 @Cacheable(value=”mycache”)
@Cahceable(value{“cache1”,”chache2”})
key 缓存的key,可以不指定,缺省按照方法的所有参数进行组合,如果指定要按照SpEL表达式方法编写。 @Cacheable(value=”mycache”,key=”#userName”)
condition 缓存的条件,使用SpEl编写,返回true或者false,为true才进行缓存/清除缓存,缺省为true。 @Cahceable(value=”mycache”,condition=”#userName.lenght()>2”)
allEntries
(@CacheEvict) 是否清空所有缓存内容,缺省为false,如果指定为true,则方法调用后立即清空所有缓存 @CacheEvict(value=”mycache”,allEntries=true)
beforeInvocation
(@CacheEvict) 是否在方法执行前就清空,缺省为false,如果指定为true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 @CacheEvict(value=”mycache”,allEntries=true,
beforeInvocation=true)
unless
(@CachePut
@Cacheable) 用于否决缓存的,该表达式只在方法执行之后判断,此时可以拿到返回值result进行判断,条件为true不会缓存,false才会缓存 @Cacheable(value=”mycache”,unless=”#result==null”)

缓存 SpEL 表达式
名字 位置 描述 示例
methodName root object 当前被调用的方法名 #root.methodName
method root object 当前被调用的方法 #root.method.name
target root object 当前被调用的目标对象 #root.target
targetClass root object 当前被调用的目标对象类 #root.targetClass
args root object 当前被调用的方法的参数列表 #root.args[0]
caches root object 当前方法调用使用的缓存列表(如@Cacheable(value={“cache1”, “cache2”})),则有两个 cache #root.caches[0].name
argument name evaluation context 方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0 或#a0 的形式,0 代表参数的索引; #userName、#a0、 #p0
result evaluation context 方法执行后的返回值(仅当方法执行之后的判断有效,如‘unless’,’cache put’的表达式 ’cache evict’的表达式 beforeInvocation=false) #result

4.缓存使用
① 引入spring-boot-starter-cache模块
② @EnableCaching开启缓存
③ 使用缓存注解
4.1案例
前提:
环境准备:(spring boot + mysql+mybatis)
表:student
实体类:Student
持久层:dao
业务层:service
控制层:controller

1 添加cache依赖

org.springframework.boot
spring-boot-starter-cache

省略mysql,mybatis,web依赖
2 添加配置信息
#配置数据源(数据库)相关的信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/one?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

#打印SQL语句
logging.level.com.bw.dao=debug

3.创建表,实体,dao,service,controller
省略
4.启动类中开启缓存
@SpringBootApplication
@EnableCaching //开启缓存
public class BootRedisApplication {

public static void main(String[] args) {
	SpringApplication.run(BootRedisApplication.class, args);
}

}

5.service层方法中使用缓存注解

@Cacheable(cacheNames = “students”,key = “#id”)
public Student queryById(Integer id) {
return studentMapper.queryById(id);
}

@CacheEvict(cacheNames = “students”,key = “#id”)
public void deleteById(Integer id) {
studentMapper.deleteById(id);
}

@CachePut(cacheNames = "students",key = "#student.id")
public Student update(Student student) {
	studentMapper.update(student);
	return student;
}

6.测试
页面通过controller访问servie不同方法,观察控制台日志结果

5.整合redis实现缓存
① 引入spring-boot-starter-data-redis模块
② application.properties配置redis连接地址
③ 使用注解操作redis
④ 或RestTemplate操作redis
redisTemplate.opsForValue()😕/操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList()😕/操作List
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet()😕/操作有序set

⑤ 配置缓存CacheManagerCustomizers
⑥ 测试
5.1案例
1 添加cache依赖

org.springframework.boot
spring-boot-starter-data-redis

2 添加配置信息

Redis服务器地址

spring.redis.host=127.0.0.1

Redis服务器连接端口

spring.redis.port=6379

spring 缓存采用redis

spring.cache.type=redis

Redis数据库索引(默认为0)

spring.redis.database=0

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

3.添加自定义redisTemplate

4.改装service
@Autowired
private RedisTemplate redisTemplate;
public Student queryById(Integer id) {
//从缓存中查找,如果没有从数据库中查找
Student student = (Student) redisTemplate.opsForValue().get(id+"");
if(student!=null) {
return student;
}
student = studentMapper.queryById(id);
if(student!=null) {
redisTemplate.opsForValue().set(id+"", student);
}
return student;
}

public void deleteById(Integer id) {
	//删除数据并且缓存中的数据也删除掉
	studentMapper.deleteById(id);
	//清空一条记录

// redisTemplate.delete(id+"");
//清空全部
Set keys = redisTemplate.keys("*");
redisTemplate.delete(keys);
}

public Student update(Student student) {
	//更新数据库数据且缓存数据同样更新
	studentMapper.update(student);
	redisTemplate.opsForValue().set(student.getId()+"", student);
	return student;
}

5.测试
页面通过controller访问servie不同方法,观察控制台日志结果

附件:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值