redis是一个非关系型数据库(mysql,sqlserver之类的是关系型数据库,elasticsearch、mongodb等是非关系型数据库),redis性能强劲,读写速度超快,所有操作都是原子性的。是很多高并发情景下实现缓存的很好选择。
redis配合mysql实现缓存的过程:
a.客户端请求过来先向redis查找缓存,查到了就直接返回数据
b.redis里没找到缓存,就向数据库查找数据
c.数据查找成功并向redis写入数据缓存
下面是详细过程:
1.电脑安装redis并且启动redis的server,如下图window下成功启动redis
2.在pom中引入redis的client包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3 详细使用
a.@Cacheable配合@CacheEvict
@Cacheable写入缓存 @CacheEvict删除缓存
Controller类
@RestController
@RequestMapping("/cache")
public class CacheController {
@Autowired
private RedisDomainService redisDomainService;
@GetMapping("/set")
//当触发该请求,则删除cacheNames = "product",key = "123"下的缓存被清除,那么下次get就会重新生成缓存
@CacheEvict(cacheNames = "product",key = "123")
public RedisDomain set(@RequestParam(value="age") String age) {
RedisDomain redisDomain1 = redisDomainService.findByName("tom");
redisDomain1.setAge(age);
redisDomainService.update(redisDomain1);
return redisDomain1;
}
@GetMapping("/get")
@Cacheable(cacheNames = "product",key = "123")
public RedisDomainVO get() {
RedisDomainVO redisDomainVO=new RedisDomainVO();
redisDomainVO.setCode("200");
redisDomainVO.setDiscrible("成功");
redisDomainVO.setRedisDomainList( redisDomainService.findAll());
return redisDomainVO;
}
}
b.@CachePut配合@Cacheable
@CachePut每次都更新代码
@RestController
@RequestMapping("/cache")
public class CacheController {
@Autowired
private RedisDomainService redisDomainService;
@GetMapping("/set")
public RedisDomain set(@RequestParam(value="age") String age) {
RedisDomain redisDomain1 = redisDomainService.findByName("tom");
redisDomain1.setAge(age);
redisDomainService.update(redisDomain1);
return redisDomain1;
}
@GetMapping("/find")
public RedisDomain find() {
return redisDomainService.findByName("tom");
}
}
@Service
//统一配置cacheNames
//@CacheConfig(cacheNames = "order")
public class RedisDomainServiceImpl implements RedisDomainService{
@Autowired
private RedisDomainRepository redisDomainRepository;
@Override
//key不填默认为方法的形参
@CachePut(cacheNames = "order",key = "123")
public RedisDomain update(RedisDomain redisDomain) {
return redisDomainRepository.save(redisDomain);
}
@Cacheable(cacheNames = "order",key = "123")
@Override
public RedisDomain findByName(String name) {
return redisDomainRepository.findTopByName(name);
}
}
@Cacheable(cacheNames = "",key = " ",condition="",unless="")
cacheNames 是redis的数据库名
key是redis的key值,可以不写,默认是此注解修身方法的形参
condition可以对key做限制key = "#id",condition ="#id.length()>3"
unless可以对返回值做条件限制 unless = "#result.getCode()==200"
@Cacheable(cacheNames = "product1",key = "#id",condition ="#id.length()>3" ,unless = "#result.getCode()==200")
public RedisDomainVO get1(@RequestParam(value = "id") String id) {
RedisDomainVO redisDomainVO=new RedisDomainVO();
redisDomainVO.setCode("200");
redisDomainVO.setDiscrible("成功");
redisDomainVO.setRedisDomainList( redisDomainService.findAll());
return redisDomainVO;
}
详细代码可以去此处下载观看https://github.com/cz67998/cache_redis_demo