对于大型站点,如果没有中间缓存层,当流量打入数据库底层时,即便有之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是有大量请求涌入数据库层,这样对数据库服务器的压力冲击很大,响应速度也会下降,因为添加中间缓存层很有必要。
常见的缓存形式:内存缓存,文件缓存
缓存数据是为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能***程度的降低对数据库服务器的访问压力
用户请求→数据查询→连接数据库服务器并查询数据→将数据缓存起来→(HTML,内存,JSON、序列化数据)→显示
用户再次请求→数据查询→直接从缓存中获取数据→显示给客户端
MySQL的查询缓存
- query_cache_type 查询缓存类型,有0,1,2三个取值 0则是不使用查询缓存,1为始终使用查询缓存,2表示按需使用查询缓存 为0就没啥好说的了
- 当query_cache_type 为1的时候,还是可以关闭掉查询缓存的,就是:SELECT SQL_NO_CACHE * FROM MY_TABLE WHERE condition;
- 当query_cache_type 为2的时候,要按需要来开启,开启sql为:SELECT SQL_CACHE * FROM MY_TABLE WHERE condition;
- query_cache_size 默认情况下query_cache_size为0,表示为查询缓存预留的内存为0,则无法使用查询缓存
- 可以直接在my.ini(window底下,linux下是my.cnf)修改值,也可以用命令 SET GLOBAL query_cache_size = 268435456
- 查询缓存可以看成是SQL文本和查询结果的映射,当第二次查询的sql语句和***次查询的sql语句完全一样的情况下,才会使用缓存 (多一个空格都不行呢)
- show STATUS LIKE 'QCACHE_HITS' ; 可以查看***次数
- 当表的结构和数据发生改变的时候,查询缓存中的数据不再有效。
- 清理缓存 FLUSH QUERY CACHE; 可以清理查询缓存内存碎片
- RESET QUERY CACHE; 从查询缓存中移出所有查询
- FLUSH TABLES; 关闭所有打开的表,同时该操作将会清空所有查询缓存中的内容。
使用Memcache 缓存查询数据
工作原理 memcache是一个高性能的分布式内存对象缓存系统,通过在内存里维护一个统一的巨大hash表,它能够用来存储各种格式的数据,包括图像,视频,文件以及数据库检索的结果,简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度。
工具流程
先检查客户端的请求数据是否在mamcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在mamcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到mamcached中。
方法
- 获取get(key)
- 设置set(key,val,expire)
- 删除delete(key)
- 通用缓存机制 用查询的方法名+参数作为查询时的key,value对中的key值
详细可以看php的memcache拓展
或者是mamcached(支持的方法多一点)
使用redis缓存查询数据
与memcache区别
- 性能相差不大
- REDIS在2.0版本后增加了自己的VM特性,突破物理内存的限制,memcache可以修改***可用内存,采用LRU算法
- redis,依赖客户端来实现分布式读写
- memcache本身没有数据冗余机制
- redis支持(快照,aof),依赖快照进行持久化,aof增强了可靠性的同时,对性能有影响
- memcache不支持持久化,通常做缓存,提升性能。
- memcache在并发场景下,用cas保证一致性,redis事务支持比较弱,只能保证事务中的每个操作连续执行
- redis支持多种类的数据类型
- redis用于数据量较小的高性能操作和运算上
- memcache用于动态系统中减少数据库负载,提升性能;适合做缓存,提升性能。