1 SpringDataRedis
Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis,JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作。
1.1 Redis环境搭建
以docker的形式搭建Redis 服务,docker run ‐di ‐‐name=demo_redis ‐p 6379:6379 redis(-di 表示以后台交互式运行redis 6379:6379 第一个端口表示宿主机端口,第二个端口表示容器端口,redis为repository名:加版本号,最新版本号可省略。如下所示 )
在springboot 项目中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>
在application.yml 的spring节点下添加配置
redis:
host: 192.168.92.129
1.2 redis缓存操作
@Autowired
private RedisTemplate redisTemplate;
/**
* 根据ID查询实体
* @param id
* @return
*/
public Article findById(String id) {
//从缓存中提取
Article article=(Article)redisTemplate.opsForValue().get("article_"+id);
// 如果缓存没有则到数据库查询并放入缓存
if(article==null) {
article = articleDao.findById(id).get();
redisTemplate.opsForValue().set("article_" + id, article);
}
return article;
}
这样在查询的时候,就会自动将文章放入缓存。
1.3 修改或删除后清除缓存
/**
* 修改
* @param article
*/
public void update(Article article) {
redisTemplate.delete( "article_" + article.getId() );//删除缓存
articleDao.save(article);
}
/**
* 删除
* @param id
*/
public void deleteById(String id) {
redisTemplate.delete( "article_" + id );//删除缓存
articleDao.deleteById(id);
}
1.4 缓存过期时间
redisTemplate.opsForValue().set("article_" + id, article,10,TimeUnit.SECONDS);
1.5 spingdata redis常见命令
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
stringRedisTemplate.opsForValue().get("test")//根据key获取缓存中的val
stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作
stringRedisTemplate.boundValueOps("test").increment(1);//val +1
stringRedisTemplate.getExpire("test")//根据key获取过期时间
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位
stringRedisTemplate.delete("test");//根据key删除缓存
stringRedisTemplate.hasKey("546545");//检查key是否存在,返回boolean值
stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间
stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合
2 Spring Cache
Spring Cache使用方法与Spring对事务管理的配置相似。Spring Cache的核心就是对某个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用键值对的方式存放到缓存中,当再次调用该方法使用相应的参数时,就会直接从缓存里面取出指定的结果进行返回。
2.1 常用注解 Cacheable
首先要在springboot启动类中添加@EnableCaching开启缓存支持。
在GatheringService的findById方法添加缓存注解,这样当此方法第一次运行,在缓存中没有找到对应的value和key,则将查询结果放入缓存。
/**
* 根据ID查询实体
* @param id
* @return
*/
@Cacheable(value="gathering",key="#id")
public Gathering findById(String id) {
return gatheringDao.findById(id).get();
}
@Cacheable(value="gathering",key="#id"),这个注释的意思是,当调用这个方法的时候,会从一个名叫 gathering的缓存(只是缓存的名字与实际值无关)中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数 id,value 就是Gathering 对象。
2.2 常用注解CacheEvict
当我们对数据进行删改的时候,需要更新缓存。其实更新缓存也就是清除缓存,因为清除缓存后,用户再次调用查询方法无法提取缓存会重新查找数据库中的记录并放入缓存。
/**
* 修改
* @param gathering
*/
@CacheEvict(value="gathering",key = "#gathering.id")
public void update(Gathering gathering) {
gatheringDao.save(gathering);
}
/**
* 删除
* @param id
*/
@CacheEvict(value = "gathering",key="#id")
public void deleteById(String id) {
gatheringDao.deleteById(id);
}
当这个方法被调用后,即会清空缓存。注意其中一个 @CacheEvict(value="gathering",key = "#gathering.id"),其中的 Key 是用来指定缓存的 key 的,这里因为我们保存的时候用的是 Gathering对象的 id字段,所以这里还需要从参数 gathering对象中获取 id 的值来作为 key 前面的 # 号代表这是一个 SpEL 表达式,此表达式可以遍历方法的参数对象,具体语法可以参考 Spring 的相关文档手册。
springdataredis 能够设置缓存时间,这一点springcache没有实现