全面解读PHP-数据库缓存
一、什么是数据库缓存?
1、定义
mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删改查的操作会造成巨大的IO开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决这类问题,缓存数据的概率应运而生。
2、数据库缓存有什么作用?
- 极大的解决了数据库服务器的压力。
- 提高应用数据的想用速度。
3、常见的缓存形式
- 内存缓存。
- 文件缓存。
4、使用缓存后用户请求流程
用户请求--> 数据查询--->连接数据库服务器并查询数据-->将数据缓存起来(HTML、 内存、JSON、序列号数据)-->显示给客户端。(有一个对数据处理的开销)
当用户再次请求或者新用户访问-->数据查询-->直接从缓存中获取数据-->显示给客户端。
5、缓存需要考虑的内容
- 缓存方式的选择。
- 缓存场景的选择。
- 缓存数据的实时性。(真是数据发送改变,缓存是否需要立马改变?一般情况下,我们可以给缓存设置一个失效时间,比如过5分钟再去更新一遍缓存就可以了)
- 缓存数据的稳定性。
二、使用mysql查询缓存
1、作用
启用mysql查询缓存可以极大的降低CPU使用率。
2、如何使用
query_cache_type //查询缓存类型
//0 : 不使用查询缓存。
//1 : 始终使用查询缓存。
//2 : 按需使用查询缓存。
query_cache_size //为查询缓存预留的内存,默认值为0,即无法使用查询缓存。
//临时设置方法,或者在my.cnf中永久设置
SET GLOBAL query_cache_size = 1024;
a、当 query_cache_type = 1 时,亦可关闭查询缓存
SELECT SQL_NO_CACHE * FROM table_name WHRE condition;
b、当 query_cahce_type = 2 时,可按需使用查询缓存。
SELECT SQL_CACHE * FROM table_name WHRE condition;
查询缓存可看作是SQL文本和查询结果的映射。
第二次查询的SQL和第一次查询的SQL完全相同,则会使用缓存。只要第二次的sql稍微跟第一次的sql不太一样,比如多了一个空格,多了一个字段,都不会使用缓存。
c、查缓存命中次数
SHOW STATUS LIKE 'Qcache_hits'; //查看缓存命中次数
d、清理缓存
FLUSH QUERY CACHE; //清理查询缓存中的内存碎片
RESET QUERY CACHE; //从查询缓存中移除所有查询
FLUSH TABLES; //关闭所有打开的表,同时该操作将会清空查询缓存中的内容
三、使用memecache缓存
对于大型的站点,如果没有中间缓存层,当流量打入数据库存时,即便有之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是会有大批量请求涌入数据库层,这样对于数据库服务器的压力冲击非常大,响应速度也会下降,因此添加中间缓存层很有必要。
1、memcache的工作原理
memcache是一个高性能的分布式的内存对象缓存系统,通过在内存中维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像,视频,文件,以及数据库检索的结果等。简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度。
2、工作流程
先检查客户端的请求数据是否在memcached中,如果有,直接把请求数据返回,不在对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到mencached中。
3、方法
get(key); //获取数据
set(key, value, exipre); //设置数据
delete(key); //删除数据
注:memcache拓展和 memcached 拓展是两个不同的 Memcache拓展,memcached拓展方法更丰富一些。
四、使用redis缓存
1、Redis 和 memcache 的区别
- 性能差距不大
- Redis在2.0版本后增加了自己的VM特性,突破物理内存限制,Memcache可以修改最大可用内存,采用LRU算法。
- Redis依赖客户端来实现分布式读写。‘
- Memcache 本身没有数据冗余机制。
- Redis支持(快照、AOF),依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响。
- Memcache不支持持久化,通常做缓存,提升性能。
- Memcache在并发场景下,用case来保持一致性,Redis事务支持比较弱,只能保证事务中的每个操作连续执行。
- Redis支持多种数据类型。
- Redis用于数据量较小的高性能操作和运算上。
- Memcache用于在动态系统中减少数据库负载,提升性能,适合做缓存,提高性能。
本文为袋鼠学习中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11293680.html
全面解读PHP-数据库缓存的更多相关文章
- ASP.NET缓存全解析6:数据库缓存依赖 转自网络原文作者李天平
更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据 ...
- Apache Ignite——新一代数据库缓存系统
[编者按]飞速增长的数据需要大量存储,对这些数据的管理也不是一件容易的事.但相比于存储和管理,如何处理数据才是开发人员真正的挑战.对于TB级别数据的存储和处理通常会让开发人员陷入速度.可扩展性和开销的 ...
- (转)ASP.NET缓存全解析6:数据库缓存依赖
ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...
- 网站优化指南之数据库缓存、CDN与云存储
1 数据库缓存. 常见的做法是用内存做cache,把数据库里的内容提前取出读到内存里,用户再请求时,就不直接读数据库,而是读内存里的数据,从而缓解了数据库的压力. 过去比较常用的缓存软件是memcac ...
- Java数据库缓存思路
为什么要用缓存?如果问这个问题说明你还是新手,数据库吞吐量毕竟有限,每秒读写5000次了不起了,如果不用缓存,假设一个页面有100个数据库操作,50个用户并发数据库就歇菜,这样最多能支撑的pv也就50 ...
- Asp.net数据库缓存依赖
Asp.net数据库缓存依赖 更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这 ...
- Sql缓存依赖--数据库缓存
•依赖于文件内容CacheDependency cDep = new CacheDependency(filePath); •依赖于数据库内容(轮询机制/通知机制)一:轮询机制 1.在数据库新建版本表 ...
- Django Cache缓存系统学习--数据库缓存
Django是动态网站,用户每一次请求页面,服务器都会执行以下操作:数据库查询.渲染模版.执行业务逻辑,最后生成用户可查看的页面.当访问量比较大的时候,会消耗掉大量的资源,这时候就会考虑到缓存问题. ...
- 用Redis作Mysql数据库缓存
使用redis作mysql数据库缓存时,需要考虑两个问题: 1.确定用何种数据结构存储来自Mysql的数据; 2.在确定数据结构之后,用什么标识作为该数据结构的键. 直观上看,Mysql中的数据都是按 ...
- redis(二)--用Redis作MySQL数据库缓存
用Redis作MySQL数据库缓存,必须解决2个问题.首先,应该确定用何种数据结构存储来自mysql的数据:在确定数据结构之后,还要考虑用什么标识作为该数据结构的键. 直观上看,Mysql中的数据都是 ...
随机推荐
- python 目录管理与文件管理
目录管理(os) system:执行系统命令 # 执行系统命令 os.system('cls') name:获取操作系统名称 # 操作系统名称,nt代表Windows, posix代表类unix pr ...
- Slimvoice快速而小巧
这可行吗?绝对没问题.完全加载的最大页面只有230 KB.因为所有内容都被缓存和压缩,所以随后查看的每个页面只有大约6 KB,这比我见过的具有相同功能的SPA要小得多. Slimvoice快速而小巧, ...
- 转pip更新后ImportError: cannot import name ‘main'
更新pip后,报出:ImportError: cannot import name ‘main' 根据https://www.cnblogs.com/dylan9/p/8981155.html的教程进 ...
- 前端开发 | 尝试用Markdown写一下近几个月的总结
近期总结 回顾 半年前 半年前,接触了前端一年多(工作半年)的我了解的东西只有下面这些.因为在公司里的工作就是切静态页,捣鼓CMS. HTML (比较简洁的编写HTML) CSS/CSS3 (PC兼容 ...
- enum:python实现枚举也很优雅
介绍 enum是一个用来枚举的模块 创建枚举类型 import enum # 创建一个类,继承自enum下的Enum class Color(enum.Enum): red = 1 green = 2 ...
- SQL注入--盲注及报错注入
盲注查询 盲注其实就是没有回显,不能直观地得到结果来调整注入数据,只能通过其他方式来得到是否注入成功,主要是利用了一些数据库内置函数来达到的 布尔盲注 布尔很明显Ture跟Fales,也就是说它只会根 ...
- 修改phpMyAdmin 导入MySQL数据库文件大小限制
默认情况下,phpMyAdmin导入MySQL数据库文件大小为2M. 很多朋友对网站进行搬家的时候,网站数据进行导入时会出现一些问题,提示超出导入大小限制. 默认MYSQL只能导入最大2MB的数据,于 ...
- springboot jpa junit测试遇到的问题
jpa在插入数据的时候,插入的对象变量user中不能包含变量,需要时确切的值,否则会出现sql解析报错 解析报错如下图
- Angular2 父子组件通信方式
https://www.jb51.net/article/133868.htm 这次给大家带来Angular2 父子组件通信方式,使用Angular2 父子组件通信方式的注意事项有哪些,下面就是实战案 ...
- 本地安装sass出错问题解析
2016年3月23日个人博客文章--迁移到segmentfault 安装sass ruby安装因为sass依赖于ruby环境,所以装sass之前先确认装了ruby.先导官网下载个ruby 在安装的时候 ...