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> |
#数据库配置 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 |
@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); } |
@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();
}
};
}
/**
@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; } |
@RequestMapping("/get") public String getKey() { User user = userRepository.findByName("张三"); return user.toString(); } |
demo下载:Redis_demo