Spring Boot 之 Redis
一、pom.xml引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
二、修改application.yml ,在spring节点下添加配置
redis:
host: 127.0.0.1
三、修改Service 引入RedisTemplate
1、在 findById 方法中 添加Redis缓存
@Autowired private RedisTemplate redisTemplate;
int i=1;
/** * 根据ID查询实体 * @param id * @return */ public Article findById(String id) { System.out.println("查询次数:"+i++); //先从缓存中查询当前对象 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 Hibernate: select article0_.id as id1_0_0_, article0_.channelid as channeli2_0_0_ from tb_article article0_ where article0_.id=? 查询次数:2 查询次数:3 查询次数:4
2、在 update 和 deleteById 方法中 删除Redis缓存
/** * 修改 * @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); }
操作流程:先修改 update 再查询 findById ,
再修改 deleteById ,在查询 findById ,
执行结果:
查询次数:5
Hibernate: update tb_article set channelid=?, columnid=?, comment=?, content=?, createtime=?, image=?, ispublic=?, istop=?, state=?, thumbup=?, title=?, type=?, updatetime=?, url=?, userid=?, visits=? where id=?
查询次数:6
Hibernate: select article0_.id as id1_0_0_, article0_.channelid as channeli2_0_0_ from tb_article article0_ where article0_.id=?
查询次数:6
查询次数:7
查询次数:8
查询次数:9
查询次数:10
Hibernate: delete from tb_article where id=?
查询次数:11
Hibernate: select article0_.id as id1_0_0_, article0_.channelid as channeli2_0_0_ from tb_article article0_ where article0_.id=?
3、设置 Redis 过期时间 10秒
/** * 根据ID查询实体 * @param id * @return */ public Article findById(String id) { System.out.println("查询次数:"+i++); //先从缓存中查询当前对象 Article article=(Article)redisTemplate.opsForValue().get("article_"+id); //如果没有取到 if(article==null){ //从数据库中查询 article=articleDao.findById(id).get(); //存入到缓存中 redisTemplate.opsForValue().set("article_"+id,article,10, TimeUnit.SECONDS); } return article; }
执行结果:
查询次数:1 Hibernate: select article0_.id as id1_0_0_, article0_.channelid as channeli2_0_0_ from tb_article article0_ where article0_.id=? 查询次数:2 查询次数:3 查询次数:4 查询次数:5 查询次数:6 Hibernate: select article0_.id as id1_0_0_, article0_.channelid as channeli2_0_0_ from tb_article article0_ where article0_.id=? 查询次数:7 查询次数:8 查询次数:9
前5次查询只有第一次访问了数据库,想个10秒后,
再次查询4次,只有第6次访问了数据库,后3次也没有访问数据库。
四、SpringDataRedis常用方法
redisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
redisTemplate.opsForValue().get("test")//根据key获取缓存中的val
redisTemplate.boundValueOps("test").increment(-1);//val做-1操作
redisTemplate.boundValueOps("test").increment(1);//val +1
redisTemplate.getExpire("test")//根据key获取过期时间
redisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位
redisTemplate.delete("test");//根据key删除缓存
redisTemplate.hasKey("546545");//检查key是否存在,返回boolean值
redisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间
redisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
redisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据
redisTemplate.opsForSet().members("red_123");//根据key获取set集合