SpringBoot使用Cacheable+Redis

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

本站的文章多是老王开发工作中问题的记录,一个字一个字敲的,切实可行,可以分享,需要留个原文链接,至少也意思意思吧!
阿里云服务器怎么购买划算-vsalw技术博客 » SpringBoot使用Cacheable+Redis

每个人都是以自己独特的方式体味生活,或许别人不理解,但自己知道:其中的酸甜苦辣就叫做幸福!

认同! 瞎扯淡!