分布式缓存(一)

2020-07-07  本文已影响0人  东南枝下

分布式缓存(一)

数据库缓存

Mysql 查询缓存(Query cache)

当打开了Query Cache功能,MySQL在接收到一条select语句的请求后,如果该语句满足Query Cache的要求,MySQL会直接根据预先设定好的HASH算法将接收到的select语句以字符串方式进行hash,然后到Query Cache中直接查找是否已经缓存,如果已经有结果在缓存中,该select请求就会直接将数据返回。

检查QC设置是否合理

SHOW VARIABLES LIKE '%query_cache%';
SHOW STATUS LIKE '%Qcache%';

VARIABLES参数

query_cache_type:

使用QC的场景;

值为0(OFF)不使用QC;

值为1(ON)除显示要求不使用的SELECT(SQL_NO_CACHE)外,默认都使用QC

-- 显示要求不使用QC
SELECT SQL_NO_CACHE * FROM some_table

值为2(DEMAND)与上一个相反,除显示要求使用的SELECT(SQL_CACHE)外,默认都不使用QC

-- 显示要求使用QC
SELECT SQL_CACHE * FROM some_table

query_cache_size:

单位(B),缓存ResultSet的内存大小,设置为1024的倍数,参考值32M

query_cache_limit:允许Cache的单条Query结果集的最大容量,默认是1MB,超过此参数设置的Query结果集将不会被Cache

query_cache_min_res_unit:设置Query Cache中每次分配内存的最小空间大小,也就是每个Query的Cache最小占用的内存空间大小

query_cache_wlock_invalidate:如果某个数据表被其他的连接锁住,是否仍然从查询缓存中返回结果

STATUS参数

Qcache hits:

Query Cache命中次数

如果该值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓存

Qcache inserts:

表示多少次未命中然后插入

Qcache lowmem prunes:

当Query Cache内存容量不够,需要从中删除老的Query Cache以给新的Cache对象使用的次数

如果该值特别大,则代表经常出现缓冲不够

Qcache free blocks:

目前还处于空闲状态的Query Cache中内存Block数目

该值非常大,则表明缓存区中的碎片很多,可能需要寻找合适的机会进行整理

缺点:如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之。这里“数据表更改”包括: INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, or DROP DATABASE等。

如果你的数据表更新频繁的话,那么Query Cache将会成为系统的负担

优点:对数据库的更新很少,那么QC将会作用显著

基于以上优缺点,可以通过参数计算QC命中率,来判断是否需要进行调整

QC命中率=Qcache_hits / ( Qcache_hits + Qcache_inserts )

注:Mysql8.0 中已经删除 query cache(小声BB:说明官方也觉得这个东西不行,还是用平台级或应用级缓存吧)

https://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/

The query cache has been disabled-by-default since MySQL 5.6 (2013) as it is known to not scale with high-throughput workloads on multi-core machines.

平台级缓存

带有缓存特性的应用框架,或者可用于缓存功能的专用库

Java中,如Ehcache,Cacheonix, Voldemort, JBoss Cache, OSCache等缓存框架。

应用级缓存

需要开发者通过代码来实现缓存机制

Redis、MongoDB、以及Memcached等

每分钟或一段时间后统一生成某类页面存储在缓存中,或者可以在热数据变化时更新缓存

[TOC]

参考:

上一篇下一篇

猜你喜欢

热点阅读