- 前言
在SpringBoot中使用Redis 可以使用 RedisTemplate工具 它对Jedis的方法做了二次封装最终成为了一个好用的连接redis的工具
- 如何开启
1. 先配置springboot下面的Application.yml
spring:
redis:
database: 0 #redis 数据库索引(默认为0)
host: 192.168.232.136 #redis 服务器地址
port: 6379 #redis 服务器连接端口号
password: #redis 服务器连接密码 默认为空
lettuce:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制) 默认8
max-wait: -1 #连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
max-idle: 8 #连接池最大空闲连接 默认8
min-idle: 0 #连接池最小空闲连接 默认 0
timeout: 5000 # 超时时间
cache:
type: redis
cache-names: pc
2. 在主方法上添加EnableCaching注解
@SpringBootApplication
@EnableCaching
public class SpringRedisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringRedisApplication.class, args);
}
}
3. 进行使用
@Slf4j
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@Autowired
private ProductDao dao;
@Override
public Double findTurnover() {
// 获取Redis指定key的操作对象
BoundValueOperations<Object, Object> ops = redisTemplate.boundValueOps("turnover");
// 从缓存中读取指定key的value
Object turnover = ops.get();
// 使用双重检测锁机制预防缓存击穿
// 若缓存中没有该数据,则先从DB中查询,然后再写入到缓存
if (turnover == null) {
System.out.println("redis里面不存在");
turnover = ops.get();
// 获取当前日期,并格式化
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
turnover = dao.selectTurnover(sdf.format(date));
// 将查询结果写入到缓存
ops.set(turnover, 10, TimeUnit.SECONDS);
}
return (Double) turnover;
}
@Override
@Cacheable(value = "pc", key = "'product_all'")
public List<Product> findAllProducts() {
return dao.selectAllProducts();
}
@Override
@Cacheable(value = "pc", key = "'product_'+#name")
public List<Product> findProductsByName(String name) {
return dao.selectProductsByName(name);
}
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = "pc", allEntries = true) // 只要该方法被执行,立即清除pc缓存中的所有数据
public void saveProduct(Product product) {
dao.insertProduct(product);
}
}
- 相关注解
@Cacheable(value = "", key = "")
@Override
@Cacheable(value = "pc", key = "'product_all'")
public List<Product> findAllProducts() {
return dao.selectAllProducts();
}
一旦调用被注解的方法就会在redis中生成一个key为product_all的缓存,缓存的地址名为pc
@CacheEvict(value = "pc", allEntries = true)
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = "pc", allEntries = true) // 只要该方法被执行,立即清除pc缓存中的所有数据
public void saveProduct(Product product) {
dao.insertProduct(product);
}
一旦调用被注解的方法就会把pc缓存刷走