数据库缓存技术入门

为了减少数据库服务器的压力,提升响应速度,我们将采取数据库缓存。常用的缓存方式有内存缓存和文件缓存。我们通过访问缓存数据让客户端很少访问数据库服务器甚至不访问数据库服务器,在高并发下能最大程度的降低对数据库服务器的压力

  • MySQL的查询缓存

该方式用的不太多,mysql自带。

查询缓存可以看成sql文本和查询结果的映射,如果第二次查询的sql和第一次sql完全相同,则会使用缓存
我们可以使用 show status like 'Qcache_hits';查看命中次数

  • 如果表的结构或数据发生改变,那么查询缓存则不再生效
  • 通过 Flush QUERY CACHE 来清理查询缓存碎片
  • 通过 RESET QUERY CAHCE从查询缓存中移除所有查询
  • 通过 FLUSH TABLES关闭所有打开的表,并清空查询缓存
1
2
3
4
5
6
7
8
9
10
11
12
query_cache_type
查询缓存类型,0表示不使用查询缓存,1表示始终使用查询缓存,2表示按需使用查询缓存
1.当query_cache_type=1时,也可以不使用查询缓存:
select sql_no_cache * from table where condition;
2.当query_cache_type=2时,表示按需使用查询缓存:
select sql_cache * from table where condition;

******************************************

query_cache_size
默认情况下为0,表示为查询缓存预留内存为0,无法使用查询缓存
set GLOBAL query_cache_size = 134217728; //设置查询缓存大小为128M
  • Memcache缓存查询数据

对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便有之前的几层优化(CDN,WEB负载均衡)为我们挡住一部分流量,但是在大并发的情况下还是会有大量的请求涌入数据库,这样对数据库服务器的压力也很大,响应速度会下降,因此添加中间缓存层很有必要
Memcache是一套分布式的高速缓存系统,对于需要频繁访问数据库的网站的访问速度提升有显著效果

####工作原理:

Memcache通过在内存里维护一个统一的巨大的hash表,它能通过存储各种格式的数据,包括图像、视频、文件以及数据的检索结果等。将数据调用到内存,然后从内存中读取,大大的提升读取速度

####工作流程:

先检查客户端的请求是否在memcache中,如果有,直接返回请求数据,不再对数据库进行操作;如果没有,就去查数据库,把从数据库中得到的结果返回,并缓存一份到memcache当中

####常用方法

PHP的memcache扩展

1
2
3
4
5
获取: get(key)
设置:set(key, value, expire)
删除:delete(key)

通常使用方法:用查询的方法名+参数作为查询的key,value对应key的值
  • 用Redis缓存查询数据
Redis与Memcache的区别
  1. Redis与Memcache的性能相差不大
  2. Redis依赖客户端来实现分布式读写(不是特别明白)
  3. memcache本身没有数据冗余机制
  4. Redis支持快照、AOF,依赖快照进行持久化,aof增强了可靠性的同时,对性能有一定影响
  5. memcache不支持持久化,通常只用于做缓存
  6. memcache在并发场景下,用cas保证一致性,redis事务支持比较弱,只能保证事务中的每个操作连续执行
  7. Redis支持多种数据类型

总结:

Redis用于数据量较小的高性能操作和运算上

memcache用于在动态系统中减少数据库负载,提升性能,适合做缓存

MYSQL数据库层的优化
  1. 数据表数据类型的优化
  2. 索引优化
  3. SQL语句的优化
  4. 存储引擎的优化
  5. 数据表结构设计的优化
  6. 数据库服务器架构的优化
坚持原创技术分享,您的支持将鼓励我继续创作!