SpringBoot使用Cacheable+Redis

 

业务需求:在大量读取很少更新的数据时,如果每次都查数据库比较耗费资源,因此考虑使用redis缓存。步骤如下:

1.引入依赖:需要另外加的4个

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
2.applica.properties配置,包含数据库和redis配置
#数据库配置 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.show_sql=true #数据库类型 spring.jpa.database=MYSQL #格式化sql语句 spring.jpa.show-sql=true #每次启动是更新表还是创建表 (create, create-drop, update) spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.hbm2ddl.auto=update #数据库方言 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect# Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379 # 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.新建实体和Repository,此处贴部分代码
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Integer age;}//下面是Repositorypublic interface UserRepository extends JpaRepository<User, Long> { @Cacheable(value = "name")       User findByName(String name); }
4.需要配置Redis,下面是完整代码

@Configuration @EnableCaching public class RediesConfig extends CachingConfigurerSupport {/** * 配置key生成策略 * * @return */ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; }

/**

  • 配置缓存管理器
  • @param redisTemplate
  • @return */ @SuppressWarnings("rawtypes") @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager rcm = new RedisCacheManager(redisTemplate); //设置缓存过期时间 rcm.setDefaultExpiration(60);//秒 return rcm; }

@Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }

}

 

5.按理说到这里就已经可以使用了,但是还需要启用缓存,需要在启动类上加注解@EnableCaching

 

6.此处为了方便提供了一个工具类,也可以不要,主要方法贴2个

/** * 删除一个 * * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } }/** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; }
7.在项目中使用,一般是在Service层缓存,此处没有写Service,是在Dao层
@RequestMapping("/get") public String getKey() { User user = userRepository.findByName("张三"); return user.toString(); }
说明:第一次访问get时候会发现控制台打印sql语句,第二次则不会在打印,说明是从缓存中获取,此时查看redis就会发现有缓存数据。缓存有效期是60秒,在是redis配置类里面配置的。此外,如果application.properties里面配置了redis链接信息,则会使用这个链接,如果不配置,会自动链接本地的redis,默认地址127.0.0.1,端口6379,数据库0.

demo下载:Redis_demo