Redis等缓存数据库为什么访问会比较快

Redis等缓存数据库为什么访问会比较快,第1张

对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached、File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的NoSQL数据库,就非常适合担任实时数据的容器。

但是往往又有数据可靠性的需求,采用MySQL作为数据存储,不会因为内存问题而引起数据丢失,同时也可以利用关系数据库的特性实现很多功能。

所以就会很自然的想到是否可以采用MySQL作为数据存储引擎,Redis则作为Cache。而这种需求目前还没有看到有特别成熟的解决方案或工具,因此采用Gearman+PHP+MySQL UDF的组合异步实现MySQL到Redis的数据复制。

MySQL到Redis数据复制方案

无论MySQL还是Redis,自身都带有数据同步的机制,比较常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。

那么理论上也可以用同样方式,分析MySQL的binlog文件并将数据插入Redis。但是这需要对binlog文件以及MySQL有非常深入的理解,同时由于binlog存在Statement/Row/Mixedlevel多种形式,分析binlog实现同步的工作量是非常大的。

因此这里选择了一种开发成本更加低廉的方式,借用已经比较成熟的MySQL UDF,将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHP Gearman Worker,将数据同步到Redis。比分析binlog的方式增加了不少流程,但是实现成本更低,更容易 *** 作。

RamDisk简介 本文首先介绍了如何在rh 系统上创建一个RamDisk 然后介绍了如何通过将数据库内容存放到RamDisk中的方法来加速对数据库的访问 什么是RamDisk?一个RamDisk是分配作为一个分区的内存块 或者说将内存模拟为硬盘空间 从而可以想对待硬盘空间一样在其上保存文件 为什么会要使用RamDisk呢?主要是为了提高速度 若事先知道特定的文件将被高频率访问 通过将文件存放在内存里就可以提高性能 例如web服务器就可以采用这种方式来加快访问速度 下面是一些可能会对加深对RamDisk的理解的资源链接 /usr/src/linux/Documentation/RamDisk txt 如何使用RamDisk 使用RamDisk是非常简单的 首先 RH 的缺省安装本身就有对RamDisk的支持 你所要作的就是格式化一个RamDisk 然后加载(mount)其到目录结构下即可 通过命令 ls al /dev/ram 可以查看系统可以利用的RamDisk的数目 这些RamDisk并不起作用 除非设置以后 下面是一个非常简单的使用RamDisk的例子 # create a mount point: mkdir /tmp/RamDisk # create a filesystem: mke fs /dev/ram # mount the RamDisk: mount /dev/ram /tmp/RamDisk 这三个命令分别为RamDisk创建一个目录 格式化它(创建文件系统) 最后加载该文件系统到 /tmp/RamDisk 上 下面就可以对待该目录为一个分区使用 若格式化失败 则说明你的系统内核没有对RamDisk的支持 则需要重新编译内核 RamDisk支持的内核开关是 CONFIG_BLK_DEV_RAM 缺省的RamDisk的大小为 Mb= 块 在创建randisk文件系统时可以得到RamDisk大小的信息 mke fs Jan for EXT FS b / / Linux ext filesystem format Filesystem label= inodes blocks blocks ( %) reserved for the super user First data block= Block size= (log= ) Fragment size= (log= ) block group blocks per group fragments per group inodes per group 运行命令 df k /dev/ram 可以查看可以真正使用的RamDisk的空间大小(因为创建文件系统时会占用一些空间) >df k /dev/ram Filesystem k blocks Used Available Use% Mounted on /dev/ram % /tmp/RamDisk 需要注意的是当你的系统重新启动以后 RamDisk中的数据会丢失 所以如果RamDisk中的数据被修改了 必须将其备份到别的目录下 改变RamDisk的大小 为了使用RamDisk 可以通过将对RamDisk的支持编译进入内核中或者编译为模块的方式 在需要时将其加载 编译为模块的方式可以在加载模块时动态决定RamDisk的大小 当RamDisk被编译进入内核 改变RamDisk的大小的方法为在nf中田加内容 RamDisk_size= (or RamDisk= for old kernels) 然后运行lilo命令 重新启动机器 这样下次加载RamDisk以后 大小就变为 M boot=/dev/hda map=/boot/map install=/boot/boot b prompt timeout= image=/boot/vmlinuz label=linux root=/dev/hda read only RamDisk_size= 当编译RamDisk支持为模块形式 可以在加载时决定RamDisk的大小 可以通过杂/etc/conf module中添 options rd rd_size= 或者在动态加载是通过命令行的形式传入 in od rd rd_size= 下面是关于如何使用模块的一个例子 卸载前面加载的文件系统 umount /tmp/RamDisk 卸载模块 rmmod rd 加载RamDisk模块 并设置大小为 M in od rd rd_size= 创建一个文件系统 mke fs /dev/ram 加载RamDisk的文件系统 mount /dev/ram /tmp/RamDisk 在web服务器中使用RamDisk的例子 这里举一个在web服务器中使用三个RamDisk的例子 这里要确保web服务器的所有内容不超过 M(包括CGI的内容) 首先 对web服务器的root目录下的内容备份到其他地方 然后重新创建的根目录 mv /home/d/ /home/d_real mkdir /home/d mkdir /home/d/cgi bin mkdir /home/d/ mkdir /home/d/icons 然后 在/etc/rc d/init d/中添加如下启动执行信息 ### Make the RamDisk partitions / in/mkfs t ext /dev/ram / in/mkfs t ext /dev/ram / in/mkfs t ext /dev/ram ### Mount the RamDisks to their appropriate places mount /dev/ram /home/d/cgi bin mount /dev/ram /home/d/icons mount /dev/ram /home/d/ ### Copying real directory to RamDisks (the ### data on the RamDisks is lost after a reboot) tar C /home/| tar C /home/d x ### After this you can start the web server 注 切记若RamDisk中的数据被修改 并且做的修改都是有意义的 则需要对RamDisk中的数据做备份 你可以启动一个cron任务来完成这个工作 如 每10分钟检查一次看是否有数据被修改 若有则对数据进行备份 RamDisk的一个应用是使用/tmp做为RamDisk 若系统中有很多程序使用RamDisk 则可以很明显地加快系统速度 而且每次系统重新启动这些暂时数据都会丢失 通过RamDisk加速小型数据库的访问速度 如果将将PostgreSQL数据库服务器文件加载到内存中就可以加快数据库访问速度 在/test目录下加载RamDisk 一 在/test目录下设置RamDisk mkdir p /Test mkfs t ext /dev/ram mount /dev/ram /Test 这时候你将拥有一个4M大小的RamDisk 根据需要你可以更改你的RamDisk的大小 二 为PostgreSQL设置RamDisk 理想状态下 你将拥有两个数据库服务器 一个是可以进行修改的 另外一个是存放在RamDisk中的拷贝 为了达到这个目的 需要使用命令 pg_dump 或 pg_dumpall 注 这里假设已经在nf中设置RamDisk的大小 使其大于数据库服务器的大小 如果你希望了解合适的大小 可以使用命令 cd /var/lib/pgsql; du 然后 ### Stop the current postgresql server /etc/rc d/init d/postgres stop ### rename the current directory mv /var/lib/pgsql /var/lib/pgsql_main #### Create a directory to have our RamDisk on mkdir p /var/lib/pgsql_memory #### change the ownership of the new directory to postgres or whatever #### the actual owner is chown postgres /var/lib/pgsql_memory #### Make an alias or link to the original name /var/lib/pgsql ln s /var/lib/pgsql_memory /var/lib/pgsql #### Format the RamDisk mkfs t ext /dev/ram #### Mount the RamDisk to the postgresql directory mount /dev/ram /var/lib/pgsql_memory #### Copy everything from the main directory into the RamDisk tar C /var/lib/pgsql_main cp | tar C /var/lib/pgsql_memory xp ### Start the current postgresql server /etc/rc d/init d/postgres start 经过测试 发现在RamDisk中的PostgreSQL的性能提升最高达到 %左右 需要的时候 可以将其他的应用放置在RamDisk中以提升效率 如ldap服务器等 lishixinzhi/Article/program/Oracle/201311/16820

当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等 由此可见,

减少访问数据库的次数 , 就能实际上减少ORACLE的工作量

例如,

以下有三种方法可以检索出雇员号等于0342或0291的职员

方法1 (最低效)

SELECT

EMP_NAME , SALARY , GRADE

FROM EMP

WHERE EMP_NO = 342;

SELECT EMP_NAME , SALARY , GRADE

FROM EMP

WHERE

EMP_NO = 291;

方法2 (次低效)

DECLARE

CURSOR C1 (E_NO

NUMBER) IS

SELECT EMP_NAME,SALARY,GRADE

FROM EMP

WHERE

EMP_NO = E_NO;

BEGIN

OPEN C1(342);

FETCH C1 INTO …,,

;

OPEN C1(291);

FETCH C1 INTO …,, ;

CLOSE C1;

END;

方法3 (高效)

SELECT AEMP_NAME ,

ASALARY , AGRADE,

BEMP_NAME , BSALARY , BGRADE

FROM EMP

A,EMP B

WHERE AEMP_NO = 342

AND BEMP_NO = 291;

区别:

1、数据库是面向事务的设计,数据仓库是面向主题设计的。

2、数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。

3、数据库是面向事务的设计,数据仓库是面向主题设计的。数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。

4、数据库设计是尽量避免冗余,一般采用符合范式的规则来设计,数据仓库在设计是有意引入冗余,采用反范式的方式来设计。

5、数据库是为捕获数据而设计,数据仓库是为分析数据而设计,它的两个基本的元素是维表和事实表。

联系:

数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,数据仓库的出现,并不是要取代数据库。目前,大部分数据仓库还是用关系数据库管理系统来管理的。可以说,数据库、数据仓库相辅相成、各有千秋。

扩展资料:

1、面向主题的:传统数据库主要是为应用程序进行数据处理,未必按照同一主题存储数据;数据仓库侧重于数据分析工作,是按照主题存储的。

这一点,类似于传统农贸市场与超市的区别—市场里面,白菜、萝卜、香菜会在一个摊位上,如果它们是一个小贩卖的;而超市里,白菜、萝卜、香菜则各自一块。也就是说,市场里的菜(数据)是按照小贩(应用程序)归堆(存储)的,超市里面则是按照菜的类型(同主题)归堆的。

2、与时间相关:数据库保存信息的时候,并不强调一定有时间信息。数据仓库则不同,出于决策的需要,数据仓库中的数据都要标明时间属性。决策中,时间属性很重要。同样都是累计购买过九车产品的顾客,一位是最近三个月购买九车,一位是最近一年从未买过,这对于决策者意义是不同的。

3、不可修改:数据仓库中的数据并不是最新的,而是来源于其它数据源。数据仓库反映的是历史信息,并不是很多数据库处理的那种日常事务数据(有的数据库例如电信计费数据库甚至处理实时信息)。因此,数据仓库中的数据是极少或根本不修改的;当然,向数据仓库添加数据是允许的。

参考资料来源:百度百科-数据仓库

以上就是关于Redis等缓存数据库为什么访问会比较快全部的内容,包括:Redis等缓存数据库为什么访问会比较快、如何通过RamDisk的方法加速小型数据库的访问速度、如何减少对数据库的访问次数来加快sql执行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9540284.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存