数据缓存层及相关知识
数据缓存层的开发
数据缓存层用于对访问过的数据进行缓存,以提高访问效率。本书所讲述的数据缓存是以表为单位的数据缓存。
数据缓存层的原理
数据缓存层实际上就是对一个巨大的存在于内存中的DataSet进行管理,其原理如下:
(1)数据缓存层维护一个大DataSet,这个DataSet以static存在于应用程序中,这是缓存数据集。
(2)客户端发起请求,数据查询请求发送到数据缓存层。
(3)数据缓存层查询缓存起来的数据查询条件,查找该查询条件是否被使用过。
(4)如果该查询条件以前使用过,则不从数据库查询数据,只从缓存数据集中查询。
(5)如果该查询条件以前没有用过,则调用数据访问层从数据库中查询数据,并将查询数据合并到缓存数据集中,同时缓存该查询条件。
(6)更新数据时,将要更新的数据更新到数据库中,同时更新缓存数据集中的数据。
(7)在查询或更新数据时,都在缓存数据集相应数据表的扩展属性中记录当前访问时间。
(8)每隔一段时间对缓存数据集进行清理,当其中某条数据行超过一定时间(可以在配置文件中进行配置)没有访问,则将该表释放。
一 常见的缓存形式 :
1.文件缓存 (为了避免I/O开销,尽量使用内存缓存)
2.内存缓存
二 为什么要使用缓存
缓存数据是为了让客户端很少甚至不访问数据库服务器进行的数据查询,高并发下,能最大程度降低对数据库服务器的访问压力
一般的数据请求:
用户请求->数据查询->连接数据库服务器并查询数据->将数据缓存起来(缓存方式: HTML , 内存 , [JSON, 序列化数据不做考虑])->显示给客户端
用户再次请求或者新用户访问->数据查询->直接从缓存中获取数据->显示给客户端
三 缓存需要考虑的方面
1.缓存方式的选择: 对I/O开销比较小的方式, 比如缓存到内存
2.缓存场景的选择: 一些不经常修改的数据适合做缓存
3. 缓存数据的实时性:
4. 缓存数据的稳定性:
四 Mysql的查询缓存
1.启用mysql查询缓存:
--(1) query_cache_type : 0代表使用查询缓存 1表示始终使用查询缓存 2表示按需使用查询缓存
--(2) 如果选择1也就是始终缓存时,如果某一条sql语句不想使用缓存,可以这样
select SQL_NO_CACHE * from student where condition;
--(3) 如果选择2也就是按需使用查询缓存时,可以这样
select SQL_CACHE *from student where condition;
2. query_cache_size 配置项
默认情况下,query_cache_size为0,也就是表示为查询缓存预留的内存为0,表示无法使用查询缓存
(1) 可以通过 set GLOBAL query_cache_size= 来临时设置
(2) 也可以在配置文件中,直接设置query_cache_size的大小
3. 查询缓存可以看做是SQL文本和查询结果的映射
第二次查询的sql和第一次查询的sql完全相同,则会使用缓存
4. 我们可以通过show status like 'Qcache_hits'; 命令来查看命中次数
5. 在mysql数据缓存中,除了sql语句改变会使缓存无法使用,当表的结构或数据发生改变时,查询缓存中的数据也不再有效
总结:如果写的频率较高,mysql查询缓存意义就不大,如果数据基本不发生改变,mysql查询缓存还是比较有用的
6.清理缓存
FLUSH QUERY CACHE; //清理查询里的缓存内存碎片
RESET QUERY CACHE; //从查询缓存中移出所有查询
FLUSH TABLES; //关闭所有打开的表,同时该操作将会清空查询缓存中的内容
五 使用Memcache 缓存查询数据
1.memcache的概念
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。
2.memcache 的工作原理
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度
3. memcache工作流程
先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中
4.memcache的安装
如果没有以下memcache文件,点击链接下载
(1) 首先,获取memcached.exe以及msvcr71.dll(这是memcache的依赖文件),如图
(2) 在memcached所在目录的命令行下运行memcached.exe
(3)检查任务管理器, 验证memcached是否已经开始运行
如果任务进程出现这样的图标,说明memcached已经在运行了,到这里结束!
当然,这种运行方式使用上不是太方便,每次还要在命令行上运行,所以,有另一种方式让memcached运行而不用每次都开启cmd窗口,见下文
(2) 以管理员身份运行cmd,将memcached安装到服务上(将上面的第(2)步替换掉 )
(3) 查看服务中是否有memcached(将上面的第(3)步替换掉 )
将其启动即可
注意:如果想要从服务中卸载掉memcached,需要先将memcached服务停止,然后再命令行下输入如下命令即可卸载
5. 在php中操作memcache(需要安装memcache拓展,安拓展是一个php程序员最基础的东西,这里不赘述了)
(1) 连接memcache
$mem = new memcache(); $re=$mem->connect('localhost', 11211); if($re){ echo '连接memcache成功'; }else{ echo '连接失败'; }
浏览器输出:连接memcache成功 证明连接memcache成功
(2) 现在,可以操作memcache数据库了
具体方法可以参考memcache文档 , memcached文档
(3) 使用远程协议进行连接memcache的几种方式
第一种:可以开启telnet,然后在cmd命令行模式下使用telnet远程连接memcache
第二种:使用putty(支持telnet的客户端)
第三种: 图形界面客户端
第四种: phpmemcache 服务器状态软件
第五种: memadmin php管理memcache的客户端 (推荐) 链接
六 使用redis缓存查询数据
-----以后再补-----
七 Redis 与 Memcache 的区别
1. 性能相差不大
2. Redis可以持久化数据,Memcache不行
3. Redis 的数据结构很丰富, memcache相对较少
4. Redis依赖客户端实现分布式读写
5. Memcache本身没有数据的冗余机制
6. Redis支持快照,AOF, 依赖快照进行持久化, aof增强了可靠性的同时,对性能有所影响
7. memcache不支持持久化,通常做缓存提升性能
8. memcache在并发场景下,用cas保持一致性,redis事物支持比较弱,只能保证事物中的每个操作连续执行
9. redis用于数据量较小的高性能操作和运算上; memcache用于在动态系统中减少数据库负载,提升性能
八 缓存其他数据
Session
session_set_save_handle
参考:https://blog.csdn.net/m_nanle_xiaobudiu/article/details/79274156