精华内容
下载资源
问答
  • 数据库缓存层

    万次阅读 2018-02-07 01:35:40
    缓存数据是为了让客户端很少甚至不访问数据库服务器进行的数据查询,高并发下,能最大程度降低对数据库服务器的访问压力 一般的数据请求: 用户请求->数据查询->连接数据库服务器并查询数据->将...

    一  常见的缓存形式 :

    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的客户端 (推荐) 链接

    6. 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

     

    展开全文
  • 数据库缓存层的优化

    2021-03-10 14:38:43
    数据库缓存层的优化 mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删改查的操作造成的巨大的IO开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了...

    数据库缓存层的优化

    mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删改查的操作造成的巨大的IO开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。极大的解决数据库服务器的压力,提高应用数据的响应速度。常见的缓存形式:内存缓存,文件缓存。

    缓存数据是为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程度的降低对数据库服务器的访问压力。默认情况下:用户请求->数据查询->连接数据库服务器并查询数据->将数据缓存起来(html,内存,json,序列化数据)->显示给客户端;用户再次请求或者新用户访问->数据查询->直接从缓存中获取数据->显示给客户端

    mysql的查询缓存:query_cache_type:查询缓存类型,有0,1,2三个取值,0则不使用查询缓存,1表示始终使用查询缓存,2表示按需使用查询缓存。query_cache_type为1时,亦可关闭查询缓存,SELECT SQL_NO_CACHE * FROM my_table WHERE condition。query_cache_type为2时,可按需使用查询缓存,SELECT SQL_CACHE * FROM my_table WHERE condition。query_cache_size:默认情况下为0,表示为查询缓存预留的内存为0,则无法使用查询缓存。SET GLOBAL query_cache_size = 134217728。查询缓存可以看做是SQL文本和查询结果的映射。第二次查询的SQL和第一次查询的SQL完全相同,则会使用缓存。SHOW STATUS LIKE ‘Qcache_hits’; 查看命中次数。表的结构或数据发生改变时,查询缓存中的数据不再有效。清理缓存:FLUSH QUERY CACHE; //清理查询缓存内存碎片,RESET QUERY CACHE; //从查询缓存中移出所有查询,FLUSH TABLES; //关闭所有打开的表,同时该操作将会清空查询缓存中的内容

    使用memcache缓存查询数据:对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便有之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是会有大量请求涌入数据库层,这样对于数据库服务器的压力冲击很大,响应速度也会下降,因此添加中间缓存层很有必要。memcache是一套分布式的高速缓存系统,由livejournal的bradfitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的,需要频繁访问数据库的网站访问速度提升效果十分显著。

    memcache工作原理:是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,能够用来存储各种格式的数据,包括图像,视频,文件以及数据库检索的结果等,简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度。

    memcache工作流程:先检查客户端的请求数据是否在memcache中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcache中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcache中。

    memcache方法:获取:get(key) 设置:set(key, val, expire) 删除:delete(key)

    通用缓存机制:用查询的方法名+参数作为查询时的key value对中的key值

    使用redis缓存查询数据:与memcache的区别:性能相差不大,redis在2.0版本后增加了自己的VM特性,突破物理内存的限制,memcache可以修改最大可用内存,采用LRU算法;redis依赖客户端来实现分布式读写,memcache本身没有数据冗余机制;redis支持快照,AOF,依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响,memcache不支持持久化,通常做缓存,提升性能;memcache在并发场景下,用cas保证一致性,redis事务支持比较弱,只能保证事务中的每个操作连续执行;redis支持多种类的数据类型;redis用于数据量较小的高性能操作和运算上,memcache用于在动态系统中减少数据库负载,提升性能,适合做缓存,提高性能

    缓存其他数据:session:session_set_save_handler

    展开全文
  • 什么是数据库缓存数据库的数据都存储在磁盘中,在高并发场景下,业务应用对MySQL产生的增删改查操作造成巨大的IO开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念...

    什么是数据库缓存

    数据库的数据都存储在磁盘中,在高并发场景下,业务应用对MySQL产生的增删改查操作造成巨大的IO开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。

    常见的缓存形式:内存缓存、文件缓存。

    极大地解决数据库服务器的压力

    提高应用数据的响应速度

    为什么要使用缓存

    缓存数据是为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程度地降低对数据库服务器的访问压力。

    缓存方式的选择、缓存场景的选择、缓存数据的实时性、缓存数据的稳定性

    使用MySQL查询缓存

    启用MySQL缓存,极大地降低CPU使用率。

    query_cache_type : 0不使用、1始终使用、2按需使用

    Select SQL_NO_CACHE * from ...

    Select SQL_CACHE * from ...

    query_cache_size : 缓存内存大小,默认为0

    SET GLOBAL query_cache_size = 134555;

    可以看做SQL文本和查询结果的映射,第二次查询的SQL和第一次查询的SQL完全相同,则会使用缓存。

    show status like ‘Qcache_hits‘; //查看命中次数

    表的结构或数据发生改变时,查询缓存中的数据不再有效。

    //清理缓存

    flush query cache;//清理查询缓存内存碎片

    reset query cache;//从查询缓存中移出所有查询

    flush tables;//关闭所有打开的表,同时清空查询缓存中的内容

    使用Memcache缓存

    对于大型站点,如果没有中间缓存层,当流量打入数据库层时,在大并发的情况下,还是会有大量请求涌入数据库层,对数据库服务器的压力冲击很大,响应速度也会下降,因此添加中间缓存层很有必要。

    memcache是一套分布式的高速缓存系统,由LiveJournal的 Brad Fitzpatrick 开发,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站提升效果十分显著。

    内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,能够用来存储各种格式的数据,包括图像、视频、文件、数据库检索的结果等。

    get(key)

    set(key, value, expire)

    delete(key)

    通用缓存机制:用查询的 方法名+参数 作为查询时的 key 值

    PHP的memcache扩展、memcached扩展

    使用Redis缓存

    与Memcache相比,性能相差不大

    Redis2.0增加了VM特性,突破物理内存的限制

    Memcache可以修改最大可用内存,采用LRU算法

    Redis,依赖客户端来实现分布式读写

    Memcache本身没有数据冗余机制

    Redis支持(快照、AOF),依赖快照进行持久化,AOF增强了可靠性,不过对性能有所影响

    Memcache不支持持久化,通常做缓冲,提升性能

    Memcache在并发场景下,用cas保证一致性

    Redis事务支持比较弱,只能保证事务中的每个操作连续执行

    Redis支持多种类的数据类型

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

    Memcache用于在动态系统中减少数据库负载,提升性能

    展开全文
  • 数据库缓存

    2019-10-30 12:38:28
    一、什么是数据库缓存 我们知道常见的数据库,比如oracle、mysql等,数据都是存放在磁盘中。虽然在数据库也做了对应的缓存,但这种数据库层次的缓存一般针对的是查询内容,而且粒度也太小,一般只有表中数据没有...

    一、什么是数据库缓存

    我们知道常见的数据库,比如oracle、mysql等,数据都是存放在磁盘中。虽然在数据库层也做了对应的缓存,但这种数据库层次的缓存一般针对的是查询内容,而且粒度也太小,一般只有表中数据没有变更的时候,数据库对应的cache才发挥了作用。但这并不能减少业务系统对数据库产生的增、删、查、改的庞大IO压力。所以数据库缓存技术在此诞生,实现热点数据的高速缓存,提高应用的响应速度,极大缓解后端数据库的压力。
    以下为memcache数据库缓存为例,以图说明一下什么是数据库缓存:

    二、数据库缓存的技术特点

    性能优越
    数据库缓存的第一个技术特点就是提高性能,所以数据库缓存的数据基本上都是存储在内存中,相比io读写的速度,数据访问快速返回。而且在mysql 5.6的版本开始,已经把memcache这种跟数据库缓存直接挂钩的中间件直接集成进去了,已经等不及我们自己去单独部署对应数据库缓存的中间件了。
    应用场景
    针对数据库的增、删、查、改,数据库缓存技术应用场景绝大部分针对的是“查”的场景。比如,一篇经常访问的帖子/文章/新闻、热门商品的描述信息、好友评论/留言 等。因为在常见的应用中,数据库层次的压力有80%的是查询,20%的才是数据的变更操作。所以绝大部分的应用场景的还是“查”缓存。当然,“增、删、改”的场景也是有的。比如,一篇文章访问的次数,不可能每访问一次,我们就去数据库里面加一次吧?这种时候,我们一般“增”场景的缓存就必不可少。否则,一篇文章被访问了十万次,代码层次不会还去做十万次的数据库操作吧。
    数据一致性
    在很多应用场景中,当一个数据发生变更的时候,很多人在考虑怎么样确保缓存数据和数据库中数据保存一致性,确保从缓存读取的数据是最新的。甚至,有人在对应数据变更的时候,先更新数据库,然后再去更新缓存。我觉得这个考虑不太现实,一方面这会导致代码层次逻辑变得复杂,另外一方面也真想不明白还要缓存干什么了。在绝大多数的应用中,缓存中的数据和数据库中的数据是不一致的。即,我们牺牲了实时性换回了访问速度。比如,一篇经常访问的帖子,可能这篇帖子已经在数据库层次进行了变更。而我们每次访问的时候,读取的都是缓存中的数据(帖子)。既然是缓存,那么必然是对实时性可以有一定的容忍度的数据,容忍度的时间可以是5分钟,也可以是5小时,取决于业务场景的要求。相反,一定要求是实时性的数据库,就不应该从缓存里读取,比如库存,再比如价格。
    高可用
    自从有了缓存,代码每天快乐的去缓存中愉快的玩耍。为什么说高可用呢,我们知道缓存为数据库抵挡了很多压力,同时也为应用提供了良好的访问速度。但同时有没有想过缓存的感受,如果当数据库缓存“罢工”了,这会出现什么后果?特别在一些高并发的应用中,数据库层肯定是“消化不良“,最终导致应用全面崩溃。所以缓存的高可用显得非常重要。


    三、数据库缓存常见开源技术

    要说用于数据库缓存场景的开源技术,那必然是memcache和redis这两个中间件。

    | 数据类型 | 持久性 | 分布式
    ----|------|---- | -----
    memcache | 支持简单数据类型 | 不支持数据持久化存储 | 不支持主从、不支持sharing(代码层次通过hash可以实现)
    redis | 数据类型丰富,支持set、list等类型| 支持数据磁盘持久化存储|支持主从,支持sharding(redis 3.0开始支持)
    因为都是专注于内存缓存领域,memcache和redis向来都有争议。比如性能,到底是memcache性能好,还是redis性能更好等。同样都是内存缓存技术,它们都有自己的技术特性。没有更好的技术,只有更合适的技术。个人总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis。其他简单的key/value存储,选择memcache。所以根据自身业务特性,数据库缓存来选择适合自己的技术。

    暂不说用不用数据库缓存,见过有人把session存储在数据库中的,也见过把视频/文件转化成二进制存储在数据库的,这种行为无疑是逆天的。合理应用数据库缓存技术,且行且珍惜,切勿走向误区。



    作者:耕云者
    链接:https://www.jianshu.com/p/51be1b9ca60b
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

     

    展开全文
  • 在运行本文例子前,首先先执行TimesTen 应用层数据库缓存学习:2. 环境准备中的操作。Read-only Cache Group的概念只读缓存组如下图: 只读缓存组(Read-Only Cache Group)的cache table不能直接修改,在Oracle...
  • 基于Redis的,用于Laravel的完全自动化且可扩展的数据库缓存层 贡献者想要! 如果您对通过环聊进行快速介绍感兴趣,请查看并给我发送电子邮件。 目录 有关该库如何工作以及如何调试的更多信息,请查看 。 产品特点...
  • 业务逻辑与数据库之间缓存层

    千次阅读 2018-08-18 23:52:34
    业务逻辑直接与数据库进行交互,这样将会严重影响系统的整体性能,因此在业务逻辑与数据库之间引入一层缓存层,当需要向数据库中添加数据实体时,先将数据实体对象放入到缓存,并将实体对象放入到队列中,以进行持久...
  • 高并发-数据库缓存

    2021-04-05 16:58:57
    高并发-数据库缓存1、什么是数据库缓存2、为什么要使用缓存3、MySQL的查询缓存3.1、MySQL查询缓存配置:3.2、如何清理缓存:4、使用Memcache缓存4.1、Memcache简介4.2、Memcache工作原理4.3、memcache当做缓存层的...
  • 当TimesTen数据库被异常删除时,存放在Oracle数据库缓存信息需要清理,以下为清理过程:# 删除数据库,提示有缓存组信息在Oracle中 $ ttdestroy sampledb_1122 Failed to destroy data store: TT10026: Some cache...
  • 缓存和复制代理的启停和状态查看cache agent的作用是将监控Oracle中数据的变化,并更新到TimesTen。因此,对于只读和AWT缓存组,cache agent都是必需的。cache agent的启停ttisql> call ttcachestart ttisql> call ...
  • eleAsynchronous Write Through(AWT) cache group, 即TimesTen的异步写缓存。数据只允许在TimesTen中修改,然后同步到Oracle。当然,TimesTen中的数据最初是从Oracle加载而来。 对于熟悉存储的人来说,cache 分为...
  • 同步读写缓存(SWT)比较少用到,它性能肯定是不如AWT,但数据一致性强于AWT。 数据先在Oracle提交,然后才在TimesTen中提交,因此TimesTen的约束可以比Oracle弱。和AWT一样,SWT的定义不能出现where条件 和AWT一样...
  • 2、这就涉及到实时数据变更的问题(mysql row binlog的实时分析),binlog增量订阅Alibaba 的canal ,以及缓存层数据 丢失/失效 后的数据同步恢复问题。二、业务层实现:1、先读取nosql缓存层,没有数据再读取mysql层...
  • 本文讨论如果一个Cache Table设定了Aging策略,那么Aging导致的缓存中数据的删除是否会影响到Oracle数据库?如果是只读缓存组,当然是不会影响到Oracle的。如果是AWT缓存组,答案也是不会影响,即Aging导致的数据删除...
  • Cache Group,简单来说,就是在TimesTen中建立Oracle表的内存缓存,然后数据在两者之间自动同步。如下图,Oracle中黄颜色的表称为cached table,TimesTen中绿色的表称为cache table. TimesTen中Cache Group有很多...
  • 2. 给出了一个简单的建立和清理Global Cache Grid的过程,前面已经有一篇文章: TimesTen 应用层数据库缓存学习:13. 全局数据缓存(cache grid),但那个Cache Group太复杂建立一个简单的Global Cache Grid首先建立两...
  • declare a number := 1; begin select max(a) into :a from lru_tab;.../Aging基本概念Aging就是缓存的老化策略,毕竟缓存不能容纳所有的数据库数据,因此根据Aging设置,一些数据在某些时刻会退出缓
  • 缓存组定义中,有一些选项,它们平常很少会用到,但在一些特定的场合也许有用。 这些选项是: * ON DELETE CASCADE * UNIQUE HASH ON * Where 条件中的SYNONYM * 缓存LOB数据ON DELETE CASCADEon delete ...
  • autorefresh操作的数据同步流方向是从Oracle到TimesTen,因此只有read-only缓存组和user managed缓存组才能定义autorefresh。 AWT和SWT缓存的数据同步流方向是从TimesTen到Oracle,由于TimesTen有事务日志,则可以...
  • 在TimesTen中,read-only, AWT, SWT都属于系统管理的缓存组,而User managed cache group则是用户自定义的缓存组。 When TimesTen manages operations for user managed cache groups, it connects to the Oracle ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,638
精华内容 2,255
关键字:

数据库缓存层