数据库(查询)缓存

1、数据库性能:
(1)mysql每秒可以处理5000次读取,或者3000次写入
(2)响应时间通常在10ms以内,但是并发量达到1万的时候,要保证10ms以内的响应速度,任务数据库都做不到

2、数据库缓存:
(1)mysql缓存是KV(key-value)结构的,保存在内存中,key是执行过的sql语句,value是查询的结果
(2)如果执行删除、修改、新增操作,或者修改表结构,都会造成(表)缓存情况

3、数据库查询过程:

执行sql语句,MySQL先查询缓存。命中数据,就从缓存中提取数据;没有命中,则从数据库中查询数据

mysql 提高缓存命中率 mysql数据库缓存技术_数据库


4、数据库缓存注意事项

(1)所有对数据加锁的事务中,不会使用查询缓存:如一个事务包含update + select,则select语句不使用缓存

(2)查询语句必须是一模一样(key值保存的sql语句),才有机会命中缓存

5、结论:
(1)用户表经常涉及查询和更新操作,而部门表、角色表则不经常更新,当mysql缓存了很多结果的时候,一条用户表更新语句就会让全部用户表缓存作废,且mysql是一刀切,无法细颗粒管理哪些表需要缓存,哪些表不需要缓存,这严重加重了内存管理的负担

//mysql 查看是否开启缓存
show variables like '%query_cache%';

(2)mysql 8.0去除了查询缓存,Oracle官方也不推荐使用查询缓存

程序缓存

1、Redis、memcached等缓存产品,结合spring框架,在程序中可以细粒度的设置哪些查询缓存,哪些查不需要缓存

2、SpringCache技术

(1)方法加上@Cacheable注解,该方法执行时,spring先查询缓存,根据命中的情况决定返回缓存,还是查询数据库

mysql 提高缓存命中率 mysql数据库缓存技术_缓存_02


(2)方法加上@CacheEvcit,spring执行完数据库操作后,删除缓存记录

3、单表查询,查询结果可以缓存,但是表连接查询,不建议缓存结果,因为不好说在表连接里面,那张表是经常修改,那张表是不经常修改的