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

    2021-02-12 03:41:10
    什么是数据库缓存数据库的数据都存储在磁盘中,在高并发场景下,业务应用对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用于在动态系统中减少数据库负载,提升性能

    展开全文
  • 2、这就涉及到实时数据变更的问题(mysql row binlog的实时分析),binlog增量订阅Alibaba 的canal ,以及缓存层数据 丢失/失效 后的数据同步恢复问题。二、业务层实现:1、先读取nosql缓存层,没有数据再读取mysql层...

    1a25a1f0cdafbe85f018655dfa6ccc08.png

    MMTTMM

    大致为两种措施:一、脚本同步:1、自己写脚本将数据库数据写入到redis/memcached。2、这就涉及到实时数据变更的问题(mysql row binlog的实时分析),binlog增量订阅Alibaba 的canal ,以及缓存层数据 丢失/失效 后的数据同步恢复问题。二、业务层实现:1、先读取nosql缓存层,没有数据再读取mysql层,并写入数据到nosql。2、nosql层做好多节点分布式(一致性hash),以及节点失效后替代方案(多层hash寻找相邻替代节点),和数据震荡恢复了。redis实现数据库缓存的分析:对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached、File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的NoSQL数据库,就非常适合担任实时数据的容器。但是往往又有数据可靠性的需求,采用MySQL作为数据存储,不会因为内存问题而引起数据丢失,同时也可以利用关系数据库的特性实现很多功能。所以就会很自然的想到是否可以采用MySQL作为数据存储引擎,Redis则作为Cache。MySQL到Redis数据复制方案,无论MySQL还是Redis,自身都带有数据同步的机制,比较常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。那么理论上也可用同样方式,分析MySQL的binlog文件并将数据插入Redis。因此这里选择了一种开发成本更加低廉的方式,借用已经比较成熟的MySQL UDF,将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHP Gearman Worker,将数据同步到Redis。比分析binlog的方式增加了不少流程,但是实现成本更低,更容易操作

    展开全文
  • MySql数据库缓存

    2021-03-16 02:48:42
    对MySql查询缓存及SQL Server过程缓存的理解及总结一、MySql的Query Cache1、Query Cache MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集。MySql在实现Query Cache的具体技术细节上类似典型...

    对MySql查询缓存及SQL Server过程缓存的理解及总结

    一、MySql的Query Cache

    1、Query Cache   MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集。MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。当客户端发起SQL查询时,Query Cache的查找逻辑是,先对SQL进行相应的权限验证,接着就通过Query Cache来查找结果。它不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生同任何存储引擎的交互,减少了大量的磁盘IO和CPU运算,所以有时候效率非常高。

    2、Query Cache设置参数   可以通过调整 MySQL的参数打开并设置它的Query Cache功能,主要有以下5个参数:

    (1)、query_cache_limit:允许缓存的单条查询结果集的最大容量,默认是1MB,超过此参数设置的查询结果集将不会被缓存;

    (2)、query_cache_min_res_unit:设置查询缓存Query Cache每次分配内存的最小空间大小,即每个查询的缓存最小占用的内存空间大小;

    (3)、query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数;

    (4)、query_cache_type:控制 Query Cache 功能的开关,可以设置为0、1、2三种,意义分别如下:   a、0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache;   b、1(ON):开启 Query Cache 功能,但是当SELECT语句中使用SQL_NO_CACHE提示后,将不使用Query Cache;   c、2(DEMAND):开启Query Cache 功能,但是只有当SELECT语句中使用了SQL_CACHE 提示后,才使用Query Cache。

    (5)、query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的Query Cache。   3、Query Cache和性能   任何事情过犹不及,尤其对于某些写频繁的系统,开启Query Cache功能可能并不能让系统性能有提升,有时反而会有下降。原因是MySql为了保证Query Cache缓存的内容和实际数据绝对一致,当某个数据表发生了更新、删除及插入操作,MySql都会强制使所有引用到该表的查询SQL的Query Cache失效。对于密集写操作,启用查询缓存后很可能造成频繁的缓存失效,间接引发内存激增及CPU飙升,对已经非常忙碌的数据库系统这是一种极大的负担。   4、其他   Query Cache因MySql的存储引擎不同而实现略有差异,比如MyISAM,缓存的结果集存储在OS Cache中,而最流行的InnoDB则放在Buffer Pool中。

    二、SQL Server的Procedure Cache   SQL Server没有类似MySql的Query Cache机制,但是它有自己的缓存机制。SQL Server不会简单直接地缓存SQL查询结果集,而是缓存它所读取过的查询数据页(数据缓存Data Buffer),同时它还缓存执行计划(过程缓存Procedure Cache),下面就谈谈我们所熟知的过程缓存。

    1、SQL执行过程   SQL语句在执行前首先需要被编译,接着需要通过SQL Server查询引擎进行优化,然后得到优化后的执行计划,最后SQL按照执行计划被执行。

    2、过程缓存(Procedure Cache)   创建执行计划会占用CPU资源,当执行计划被创建后,SQL Server查询引擎默认会自动缓存执行计划。   对于整体相似,仅仅是参数不同的SQL语句,SQL Server可以重用缓存的执行计划。   但对于不同的SQL语句,SQL Server并不能重复使用以前的执行计划,而需要重新编译出一个新的执行计划,因为SQL Server查询引擎会自动缓存执行计划,每一个新的执行计划都会占用SQL Server的内存。   在SQL Server可用内存足够使用的情况下,查询引擎并不主动清除以前保存的查询计划。所以,某些情况下,一条相似的SQL语句,仅仅因为写法不同,而凭空多出了很多执行计划,对于相似的SQL,这些多余的执行计划白白地占据着内存,大大影响SQL Server中缓存的查询计划数目。   对于上面这种情况,如果限定了SQL Server最大可用内存,它将导致SQL Server可用内存减少,从而在执行查询时尤其是大的数据查询时与磁盘发生更多的内存页交换;如果没有设置最大可用内存,则SQL Server由于缓存了太多执行计划,从而使内存占用过大。

    3、如何减少过程缓存 对于减少过程缓存的占用,主要是可以通过使用参数化查询。   参数化查询的关键是查询优化器将创建一个可以重用的缓存计划(SQL Server查询优化器将查询重新编写为一个参数化SQL语句),这个可重用的缓存计划消除了对这些类似SQL语句的每一次执行都创建一个缓存计划的需求。通过创建一个可重用计划,SQL Server就减少了存放类似的执行计划所需的内存使用。   对于开发人员,我们一般可以通过下面两种方式实现参数化查询:

    (1)、使用存储过程执行SQL语句;

    (2)、使用sp_executesql 方式执行SQL语句。   关于使用存储过程执行SQL,再说句题外话:对于存储过程一直以来有颇多争议,比如ORM派认为存储过程是完全面向过程的不易扩展不易维护的等等等等。根据我个人的开发经验,简单的几乎没有逻辑的存储过程我建议多用,但是复杂的存储过程一直以来都是BUG集中营,而且后期维护成本奇高(听我司架构师讲过,某重要业务系统的数据库有个八千多行的存储过程,两百多个变量,没有人敢动),逻辑最好通过应对剧烈变化的业务逻辑层来写。现在我们有了成熟的ORM,还有分层,开发中要绝对避免写过长且逻辑复杂的存储过程,否则面对变化,日积月累再出现几个八千行的存储过程也不是没有可能。

    标签:缓存,数据库,Cache,Server,SQL,Query,查询,MySql

    来源: https://www.cnblogs.com/myJuly/p/12630416.html

    展开全文
  • memcached做数据库缓存

    2021-02-07 03:07:41
    一直没搞懂,后来又看到redis很火,可以用来做缓存,研究了半天也没搞懂咋个做缓存,后来也不纠结了,继续学习python,当对python基础有一定掌握后,渐渐明白如何用redis或memcache做数据库缓存。原理很简单,...

    最近研究memcache小有成果,把经验分享出来。

    白话:很早就听说memcache了,一直没搞懂,后来又看到redis很火,可以用来做缓存,研究了半天也没搞懂咋个做缓存,后来也不纠结了,继续学习python,当对python基础有一定掌握后,渐渐明白如何用redis或memcache做数据库的缓存。原理很简单,memcache和redis都是在内存开辟一堆空间,用键-》值来保存数据,在python称作字典,具体流程如此图

    da98edf08c88fc4baa1c63b101a6a12b.png

    当用户第一次通过web应用程序,去读取数据库,返回数据值的时候,web应用服务器会做两个动作,第一个动作,返回给用户,第二个动作会写入memcache,当第二个用户去访问相同的数据时,程序代码前添加if判断语句,如果memcache有需要的数据,直接从memcache取。

    可能表达的还不够清楚,我们通过代码来测试下。我用的环境是python+django

    ----查询代码def sql(request):

    #连接memcache

    mc = memcache.Client(['127.0.0.1:1111'])

    #用sql查询语句作为memcahe的键

    key2 = 'select * from zuoze'

    key2 = md5(key2)

    #数据库查询zuoze表的数据

    sql1 = "select * from zuoze"

    #判断sql键有没有在memcache,就从mysql取数据,并写入memcache

    if not mc.get(key2):

    #import MySQLdb

    #连接mysql数据库

    db = MySQLdb.connect('127.0.0.1','admin','wanwan','T')

    cursor = db.cursor()

    cursor.execute(sql1)

    #绑定sql数据到变量results

    results = cursor.fetchall()

    #同时把sql查询数据,写入memcache

    mc.set(key2,results)

    print "go mysql!!"

    db.close()

    return render_to_response("sql.html",{'results':results})

    #直接从memcache取数据

    else:

    results = mc.get(key2)

    print "go memcache!!!"

    return render_to_response("sql.html",{'results':results})

    ----更新缓存的两种办法,转至论坛高手的回答:

    {常规做法有两种:1.数据有改变则在更新数据库的同时更新memcache2.数据有改变则数据库有一个字段来标识更新时间,例如update_time。当有查询时候,把memcache里的update_time与数据库的update_time比较。如果发生变化则更新memcache超期时间设置,应根据数据访问的频繁度和内存大小来权衡一下。memcache内存申请后,映像中不会被释放。它是通过 如果有一部分数据超时,则新写入的数据覆盖超时数据来完成重复使用的。那么理论上来讲,内存使用情况是数据被memcache占用最多的那一刻!}

    ---实验用的第一种。def upsql(request):

    if request.method == 'POST':

    xing = request.POST.get('xing',None)

    name = request.POST.get('name',None)

    mail = request.POST.get('email',None)

    shuji_id = request.POST.get('mail',None)

    db = MySQLdb.connect('127.0.0.1','admin','wanwan','T')

    cursor = db.cursor()

    sql = "insert into zuoze(id,xing,name,email,shuji_id) values ('','%s','%s','%s','%s')" % (xing,name,mail,shuji_id)

    cursor.execute(sql)

    db.commit()

    #插入数据或更新数据后,重新更新memcache数据

    mc = memcache.Client(['127.0.0.1:1111'])

    key2 = 'select * from zuoze'

    key3 = md5(key2)

    cursor.execute(key2)

    results = cursor.fetchall()

    mc.set(key3,results)

    db.close()

    return HttpResponse('ok!')

    return render_to_response("upsql.html")

    展开全文
  • 【IT168资讯】 根据一些专家的调查分析,发现企业在使用数据库的时候,90%以上主要用来查询。有些企业这个比例甚至更高。也就说,用户对数据库的操作,其实更新操作占的比例很少。大部分的操走都只是查询操作。如...
  • 数据库缓存的几种方式引入缓存可以提高性能,但是数据会存在两份,一份在数据库中,一份在缓存中,如果更新其中任何一份会引起数据的不一致,数据的完整性被破坏了,因此,同步数据库和缓存的这两份数据就非常重要。...
  • redis做数据库缓存

    2021-10-04 16:40:43
    使用只读缓存时,是先把修改写到后端数据库中,再把缓存中的数据删除。当下次访问这个数据时,会以后端数据库中的值为准,重新加载到缓存中。 这样做的优点是,数据库缓存可以保证完全一致,并且缓存中永远保留的...
  • redis清空缓存数据库

    2021-02-05 16:32:23
    来自:今日头条,作者:聚IT 链接:https://www.toutiao.com/i6752317753866060299/导读 在实际项目中Redis常被应用于做缓存,分布式锁、消息队列等。但是在搭建配置好Redis服务器后很多朋友应该会发现和有这样的...
  • 缓存层数据库层数据同步问题 在实际的业务开发中,为了避免大量请求直接操作数据库,我们会用redis做一个缓存层,用户的数据库请求先在redis中查询,查找的到就返回,查找不到再从数据库取数据更新缓存,然后返回...
  • 在上一篇文章-Redis数据库在树莓派中的简单使用 中完成了Redis数据库的安装使用,这一次更上一楼,将Redis配置成Mysql数据库缓存,实现读写分离,热点数据直接读取Redis内存数据库,提供快速响应服务。简而言之,...
  • 数据库缓存的几种方式引入缓存可以提高性能,但是数据会存在两份,一份在数据库中,一份在缓存中,如果更新其中任何一份会引起数据的不一致,数据的完整性被破坏了,因此,同步数据库和缓存的这两份数据就非常重要。...
  • 本文分享自华为云博客:到底是先更新数据库还是先更新缓存? 最近小伙伴最近都在问我,在系统中引入缓存后,当向数据库中写入数据时,是先写数据库还是先写缓存呢?先写数据库和先写缓存有什么区别吗?今天,我们...
  • 受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透、缓存雪崩、缓存击穿和与关系型数据库的一致性。
  • 高并发-数据库缓存

    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当做缓存层的...
  • 【编者按】飞速增长的数据需要大量存储,对这些数据的管理也...近日,Dmitriy Setrakyan 在 Dzone 上撰文,为大家介绍了新一代数据库缓存系统 Apache Ignite。本文系 OneAPM 工程师编译。将数据存储在缓存中能够显著...
  • 3.缓存击穿(量太大,缓存过期) 3.1 问题说明 3.2 解决方案 3.2.1设置热点数据永不过期 3.2.2加互斥锁 4.缓存雪崩(缓存集中过期失效+redis宕机) 4.1 问题说明 4.2 解决方案 4.2.1redis高可用 4.2.2限流...
  • 有一些数据查询的频率远大于修改频率,就需要使用缓存技术,让先去请求redis,redis存在返回缓存数据,redis不存在就查询数据库,返回数据的同时将数据缓存到redis中。 问题 读取缓存一般没有什么问题,一旦涉及到...
  • 点击关注"码农小胖哥"右上角菜单"设为星标"你会吗?在大型系统中,为了减少数据库压力通常会引入缓存机制,一旦引入缓存又很容易造成缓存数据库数据不一致,导...
  • 新增&修改缓存流程 新增缓存消息的处理流程和修改缓存消息的处理流程一致,见下: 首先,消息的生产时机是: 新增缓存消息: 业务往数据库中插入数据 业务流程因为缓存缺失导致直接访问到数据库的数据 修改缓存消息...
  • 文章目录Redis学习笔记-缓存数据库的数据不一致1.笔记图2.数据一致性是啥意思?3.写回策略4.Redis缓存类型5.数据不一致情况6.缓存数据库数据操作原子性7.解决数据不一致问题 Redis学习笔记-缓存数据库的数据不...
  • 如何保证缓存数据库双写时一致的问题? 一、缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis): 现在有个问题,如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。 在前面学习我们...
  • 目录 1.更新缓存的三种模式 1.1Cache Aside 1.1.1 先更新DB,后更新缓存 ​1.1.2先更新缓存,后更新DB ...引入缓存势必会导致数据的一致性问题(因为分别存放到缓存以及DB),那么在数据更新时,缓存和DB都得更...
  • 缓存可能看起来像是一种简单,快速的解决方案,因为可以轻松进行部署,而不会在数据库扩展或恶化,数据库模式重新设计甚至更深层次的技术转换方面花费大量成本。缓存独立于数据库,而应用程序负责缓存的一致性。该...
  • MySQL数据库缓存:每进行一次select查询,会在SQL的查询缓存模块的cache中分配一个key,value为查询的结果,当再次查询时,会去匹配这个key,如果有的话则直接返回value,就不需要经过命令解析器和存储引擎了...
  • 做这个项目时,服务端最开始是使用原生php写的,在查询数据库时,没有做任何缓存,...记录如下:原理如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和...
  • Redis缓存篇之缓存异常:如何解决缓存数据库的数据不一致问题缓存数据库的数据不一致是如何发生的如何解决数据不一致问题情况一:先删除缓存,再更新数据库情况二:先更新数据库值,再删除缓存缓存数据库的...
  • 我们本次的讨论,主要针对数据库缓存场景,将以redis作为mysql的缓存为案例来进行。 为什么需要缓存 存储如mysql通常支持完整的ACID特性,因为可靠性,持久性等因素,性能普遍不高,高并发的查询会给mysql带来压力...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 312,555
精华内容 125,022
关键字:

数据库缓存层