1.为什么要使用缓存?
我的理解是如果频繁的从数据库中取数据,那数据库的压力太大,取的速度也降低,所以我们可以在取数据的时候,将数据放到缓存中去,再次取的时候就可以在缓存中找,如果缓存没找到的话,再去数据库取,这样就可以可以有效的降低数据库压力,提升整个系统的相应效率和并发量。
2.什么情况下不适合使用缓存?
- 更新频繁,对于更新频率过高的数据,频繁同步缓存中的数据所花费的代价可能相当于从缓存中查询带来的好处。简而言之就是功过相抵,甚至还有更糟糕的情况,那就是功不抵过;
- 对一致性要求严格
- 读少,对于读取非常少的系统而言,使用缓存就完全没有意义了,毕竟使用缓存的目的是为了读取数据更高效;
- 数据量很小的情况下,当然也没必要使用缓存了,因为数据库本身完全可以支持。
3.不使用spring cache的情况
每查询一条信息,输出一条日志
for(int i = 0 ;i < 10 ;i++){
cs.querySingleCategory(i);
}
@Service
public class categoryService {
@Autowired
private categoryMapper cm;
Logger logger = LoggerFactory.getLogger(categoryService.class);
//查询category
public void querySingleCategory(int id){
sleepTime();
Category c = cm.querySingleCategory(id);
logger.info(c.getName());
}
//每次查询都要等待一秒钟
private void sleepTime() {
try {
long time = 1000L;
Thread.sleep(time);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
部分代码没有附上,后面会附上链接
现在看输出的日志,查询一条信息要一秒左右
4.使用spring cache的情况
首先开启SpringCache,在Application类上添加注解
@EnableCaching
然后在需要缓存的方法上面加上**@Cacheable(“cache的名字”)**
第一次查询,缓存中不含值,查询还是在数据库中取查。所以每次会停留1s钟。
第二次查询,由于是在缓存中取出来,所以不会经过数据库,很快就可以查询出来
5 . 使用@CacheEvict(“缓存的名字”)删除缓存中的数据
第一次没有使用@CacheEvict,所以只删除了数据库中的数据,缓存中的数据没被删除,所以在日志中还是能打印出来
//删除category,没有删除缓存中的数据
public void delete(int id){
cm.deleteCategory(id);
}
数据库中删除了
但是日志还是能打印出来
第二次使用了@CacheEvict,所以缓存中的数据被删除了,查询时根据id遍历时出现了异常
//再次删除,删除了缓存中的数据
@CacheEvict("categoryCache")
public void notDeleteCache(int id){
cm.deleteCategory(id);
}
6.@CachePut
@CachePut和@Cacheable的作用很相似
区别是:
@CachePut:这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中。
@Cacheable:当重复使用相同参数调用方法的时候,方法本身不会被调用执行,即方法本身被略过了,取而代之的是方法的结果直接从缓存中找到并返回了。
7.总结
到上面已经知道了**@EnableCaching,@Cacheable,@CacheEvict,@CachePut**
我们在上面使用@Cacheable,@CacheEvict,@CachePut的时候都只有一个参数,categoryCache,这个参数相当于一个集合一样,上面方法的参数id表示键,方法返回的值表示值。这个集合里面含有多个这样的键值对,也可以含有多个集合。
下面一篇将具体将这些注解的参数解释一下。
上面的所以的源码链接如下所示:
//download.csdn.net/download/m0_45025658/12146221