SpringBoot使用redis做缓存机制

SpringBoot 2.0.3 版本、redis3.2版本

1. 加入jar包

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2. 编写RedisConfig类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.pibigstar.common.config;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;


@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{

//缓存管理器
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheManager cacheManager = RedisCacheManager.builder(factory).build();
return cacheManager;
}
//自定义缓存key生成策略
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator(){
@Override
public Object generate(Object target, java.lang.reflect.Method method, Object... params) {
StringBuffer sb = new StringBuffer();
sb.append(target.getClass().getName());
sb.append(method.getName());
for(Object obj:params){
sb.append(obj.toString());
}
System.out.println("调用Redis生成key:"+sb.toString());
return sb.toString();
}
};
}
}

2.1 配置application.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
redis:
host: 127.0.0.1
port: 6379
database: 0 # 设置数据库索引为0 默认为0
password: # 密码为空
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 2 # 连接池中的最小空闲连接
timeout: 2000 # 连接超时时间(毫秒)

3. 在 适当的地方加入缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.pibigstar.service.impl;

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.pibigstar.dao.GradeMapper;
import com.pibigstar.domain.Grade;
import com.pibigstar.service.GradeService;

@Service
@CacheConfig(cacheNames="grades")
public class GradeServiceImpl implements GradeService{

@Autowired
private GradeMapper gradeMapper;

@Override
@Cacheable //开启缓存
public Grade getOneById(Long id) {
return gradeMapper.selectByPrimaryKey(id);
}

@Override
@Cacheable //开启缓存
public List<Grade> list() {
return gradeMapper.findAll();
}
}
  • @Cacheable将查询结果缓存到redis中,(key=”#p0”)指定传入的第一个参数作为redis的key。
  • @CachePut,指定key,将更新的结果同步到redis中
  • @CacheEvict,指定key,删除缓存数据,allEntries=true,方法调用后将立即清除缓存

4. 启动

4.1 启动redis

下载: https://pan.baidu.com/s/1tTYcCRUF-qDikhPTkSiJTQ

解压,双击 start.bat 即可

RedisDesktopManager 文件夹放的是redis 可视化工具

4.2 启动项目

调用 开启缓存的那两个方法,就可以看到控制台输出了:

通过redis 可视化工具可以看到:

已经有key值生成了,

当再一次查询的时候就不会去从数据库中查询了,而是直接从我们的redis中查询,速度会非常快。

需要注意的是:当数据库中值改变了,因为它查询的是从缓存中查询,所以查出来的数据还是之前的数据,只有当key过期之后或者被删除之后才能查到最新的值

5. 常用redis命令

  • flushdb:清空当前数据库。
  • select [index]:选择索引数据库,index为索引值名,如:select 1。
  • keys *:查看数据库内所有的key。
  • del [key]:删除一条指定key的值。
  • get [key] : 获得 指定key的值
  • flushall:清空所有数据库。
  • quit:退出客户端连接

关注我的公众号,获取最新Java干货

欢迎关注我的公众号

-------------本文结束感谢您的阅读-------------