springboot整合redis-SpringBoot(22)

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

1. 在 Spring Boot 中集成 Redis

  (1)完成配置基础项。

    添加 Redis、MySQL、MyBatis 依赖。
  (2)配置MySQL、Redis服务器

    可以直接在application.yml文件中逬行配置,具体配置方法见以下代码:
查看代码
  1. # 应用名称
  2. spring:
  3.   redis:
  4.     host: 127.0.0.1
  5.     port: 6379
  6.     jedis:
  7.       pool:
  8.         max-active: 8
  9.         max-wait: -1
  10.         max-idle: 8
  11.         min-idle: 0
  12.     timeout: 5000
  13.   datasource:
  14.     druid:
  15.       driver-class-name: com.mysql.cj.jdbc.Driver
  16.       url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
  17.       username: root
  18.       password: 123456
  19.     thymeleaf:
  20.       mode: HTML
  21.       encoding: UTF-8
  22.       servlet:
  23.         content-type: text/html
  24.       cache: false
  25.       prefix: classpath:/static/
  26. mybatis:
  27.   # spring boot集成mybatis的方式打印sql
  28.   configuration:
  29.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  30. # 应用服务 WEB 访问端口
  31. server:
  32.   port: 8080
复制代码
  (3)在入口类加上@EnableCaching注解,开启缓存支持。

2. 配置Redis类

  要想启用Spring缓存支持,需创建一个CacheManager的Bean
  1. package com.intehel.demo.config;
  2. import org.springframework.cache.CacheManager;
  3. import org.springframework.cache.annotation.CachingConfigurerSupport;
  4. import org.springframework.cache.interceptor.KeyGenerator;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.data.redis.cache.RedisCacheManager;
  8. import org.springframework.data.redis.connection.RedisConnectionFactory;
  9. import org.springframework.data.redis.core.RedisTemplate;
  10. import org.springframework.data.redis.core.StringRedisTemplate;
  11. import java.lang.reflect.Method;
  12. @Configuration
  13. public class RedisConfig extends CachingConfigurerSupport {
  14.     //在缓存对象集合中,缓存是以key-value形式保存的
  15.     //如果没有指定缓存的key,则Spring Boot 会使用SimpleKeyGenerator生成key
  16.     @Override
  17.     @Bean
  18.     public KeyGenerator keyGenerator() {
  19.         return new KeyGenerator() {
  20.             @Override
  21.             //定义缓存key的生成策略
  22.             public Object generate(Object target, Method method, Object... params) {
  23.                 StringBuilder sb = new StringBuilder();
  24.                 sb.append(target.getClass().getName());
  25.                 sb.append(method.getName());
  26.                 for (Object obj : params) {
  27.                     sb.append(obj.toString());
  28.                 }
  29.                 return sb.toString();
  30.             }
  31.         };
  32.     }
  33.     @SuppressWarnings("rawtypes")
  34.     @Bean
  35.     //缓存管理器 2.X版本
  36.     public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
  37.         RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory);
  38.         return cacheManager;
  39.     }
  40.     //缓存管理器 1.X版本
  41. /*    public CacheManager cacheManager(@SuppressWarnings("rawtypes")RedisTemplate redisTemplate){
  42.         return new RedisCacheManager(redisTemplate);
  43.     }*/
  44.     @Bean
  45.     //注册成Bean被Spring管理,如果没有这个Bean,则Redis可视化工具中的中文内容都会以二进制存储,不易检查
  46.     public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
  47.         RedisTemplate<String,Object> redisTemplate = new RedisTemplate<String,Object>();
  48.         redisTemplate.setConnectionFactory(factory);
  49.         return redisTemplate;
  50.     }
  51.     @Bean
  52.     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory){
  53.         StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
  54.         stringRedisTemplate.setConnectionFactory(factory);
  55.         return stringRedisTemplate;
  56.     }
  57. }
复制代码
3.创建测试实体类

  创建用于数据操作的测试实体类,见以下代码:
  1. package com.intehel.demo.domain;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.Serializable;
  6. @Data
  7. @NoArgsConstructor
  8. @AllArgsConstructor
  9. public class Person implements Serializable {
  10.     private Long id;
  11.     private String name;
  12.     private Integer age;
  13.     private String address;
  14. }
复制代码
4. 实现实体和数据表的映射关系
  1. package com.intehel.demo.mapper;
  2. import com.intehel.demo.domain.Person;
  3. import org.apache.ibatis.annotations.*;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. @Mapper
  7. public interface PersonMapper {
  8.     @Insert("insert into person(name, age,address) values(#{name},#{age},#{address})")
  9.     int addPerson(@Param("name")String name, @Param("age")String age, @Param("address")String address);
  10.     @Select("select * from person where id = #{id}")
  11.     Person findById(@Param("id")String id);
  12.     @Update("update person set age = #{age},name = #{name},address = #{address} where id = #{id}")
  13.     int updateById(Person person);
  14.     @Delete("delete from person where id = #{id}")
  15.     void deleteById(@Param("id")String id);
  16. }
复制代码
5. 创建Redis缓存服务层
  1. package com.intehel.demo.service;
  2. import com.intehel.demo.domain.Person;
  3. import com.intehel.demo.mapper.PersonMapper;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.cache.annotation.CacheConfig;
  6. import org.springframework.cache.annotation.CacheEvict;
  7. import org.springframework.cache.annotation.CachePut;
  8. import org.springframework.cache.annotation.Cacheable;
  9. import org.springframework.stereotype.Service;
  10. @Service
  11. @CacheConfig(cacheNames = "person")
  12. public class PersonService {
  13.     @Autowired
  14.     PersonMapper personMapper;
  15.     @Cacheable(key = "#p0")
  16.     public Person selectPerson(String id){
  17.         System.out.println("selectPerson");
  18.         return personMapper.findById(id);
  19.     }
  20.     @CachePut(key = "#p0")
  21.     public void updatePerson(Person person){
  22.         System.out.println("updatePerson");
  23.         personMapper.updateById(person);
  24.     }
  25.     @CacheEvict(key = "#p0",allEntries = true)
  26.     public void deletePerson(String id){
  27.         System.out.println("deletePerson");
  28.         personMapper.deleteById(id);}
  29. }
复制代码
代码解释如下。

  • @Cacheable:将查询结果缓存到Redis中。
  • key="#p0":指定传入的第1个参数作为Redis的key。
  • @CachePut:指定key, 将更新的结果同步到Redis中。
  • @CacheEvict:指定key, 删除缓存数据。
  • @allEntries=true:方法调用后将立即清除缓存
6.完成增加、删除、修改和查询测试API
  1. package com.intehel.demo.controller;
  2. import com.intehel.demo.service.PersonService;
  3. import com.intehel.demo.domain.Person;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/user")
  11. public class PersonController {
  12.     @Autowired
  13.     PersonService personService;
  14.     @RequestMapping(value = "/{id}")
  15.     public Person selectPerson(@PathVariable String id){
  16.         return personService.selectPerson(id);
  17.     }
  18.     @RequestMapping(value = "/update")
  19.     public String updatePerson(@RequestBody Person person){
  20.         personService.updatePerson(person);
  21.         return "success";
  22.     }
  23.     @RequestMapping(value = "/delete/{id}")
  24.     public String deletePerson(@PathVariable String id){
  25.         personService.deletePerson(id);
  26.         return "delete success";
  27.     }
  28. }
复制代码
  启动项目,多次访问http://localhost:8080/user/1 第一次时控制台会出现select信息,代表对数据库进行了查询操作。后面再访问时则不会出现提示,表示没有对数据库执行操作,而是使用 Redis中的缓存数据。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表