搭建redis给mysql做缓存
安装redis的前提是lnmp或者lamp的环境已经搭建完成。
安装redis
1、安装redis(或可以选择yum安装)
1 2 3 4 5 6 7 8 9 10 11 12 | [root@redis ~]# wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz [root@redis ~]# mkdir /usr/local/redis [root@redis ~]# tar xvf redis-2.8.19.tar.gz #安装很简单、直接make就可以了 [root@redis ~]# cd redis-2.8.19 [root@redis redis-2.8.19]# make #编译完成后,将src中的可执行文件拷贝到刚刚创建的目录中 [root@redis src]# cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/redis/ [root@redis redis-2.8.19]# cp redis.conf sentinel.conf /usr/local/redis/ |
Redis-benchmark 压力测试工具
Redis-check-aof 检查redis持久化命令文件的完整性
Redis-check-dump 检查redis持久化数据文件的完整性
Redis-cli redis在linux上的客户端
Redis-sentinel redis-sentinel是集群管理工具,主要负责主从切换。
Redis-server Redis服务器的daemon启动程序
2、安装php的redis扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@redis ~]# wget -c -t 0 https://github.com/owlient/phpredis/archive/master.zip [root@redis ~]# unzip master.zip [root@redis ~]# cd phpredis-master/ [root@redis phpredis-master]# phpize [root@redis phpredis-master]# ./configure --with-php-config=/usr/bin/php-config [root@redis phpredis-master]# make && make install #修改php的配置文件,如果没有“extension=redis.so”,就加上这一行 [root@redis ~]# vim /etc/php.ini extension=redis.so [root@redis ~]# /etc/init.d/php-fpm restart 停止 php-fpm: [确定] 正在启动 php-fpm: [确定] |
3、是否安装成功
还是访问phpinfo的那个界面
看到这个就是安装完成了。
五、读写分离
这里只是简单的做了一下读,没有写操作的相关代码,过一会测试,直接到数据库里执行update来模拟写操作。
1、在mysql中插入一些测试数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@redis ~]# mysql -u root -p123456 mysql> create database mytest; mysql> CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; mysql> INSERT INTO `test` VALUES (1,'sven'),(2,'jim'),(3,'zhu'),(4,'wang'),(5,'ftd'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03'); mysql> select * from mytest.test; +----+--------+ | id | name | +----+--------+ | 1 | sven | | 2 | jim | | 3 | zhu | | 4 | wang | | 5 | ftd | | 6 | test | | 7 | test01 | | 8 | test02 | | 9 | test03 | +----+--------+ |
2、编写php的测试代码 ##可以直接在html下创建1.php复制下面代码,修改mysql连接地址进行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?php $redis = new Redis(); $redis->connect('127.0.0.1',6379) or die ("could net connect redis server"); $query = "select * from test limit 8"; //为了简单一点,这里就读取了8条数据 for ($key = 1; $key < 9; $key++) { if (!$redis->get($key)) { $connect = mysql_connect('127.0.0.1','root','123456'); mysql_select_db(mytest); $result = mysql_query($query); //如果没有找到$key,就将该查询sql的结果缓存到redis while ($row = mysql_fetch_assoc($result)) { $redis->set($row['id'],$row['name']); } $myserver = 'mysql'; break; } else { $myserver = "redis"; $data[$key] = $redis->get($key); } } echo $myserver; echo "<br>"; for ($key = 1; $key < 9; $key++) { echo "number is <b><font color=#FF0000>$key</font></b>"; echo "<br>"; echo "name is <b><font color=#FF0000>$data[$key]</font></b>"; echo "<br>"; } ?> |
第一次访问,redis中没有对应的KEY时
再次访问,此时redis中已有相关数据
到这里,我们已经实现了redis作为mysql的缓存服务器,但是如果更新了mysql,redis中仍然会有对应的KEY,数据就不会更新,此时就会出现mysql和redis数据不一致的情况。所以接下来就要通过mysql触发器将改变的数据同步到redis中。
六、通过gearman实现同步
1、介绍
Gearman是一个支持分布式的任务分发框架:
Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。
大致流程:
下面要编写的mysql触发器,就相当于Gearman的客户端。修改表,插入表就相当于直接下发任务。然后通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式,然后在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。
2、安装启动 (也可以选择yum安装)如果是yum安装要安装如下几个包
1 2 3 4 5 | [root@redis ~]# yum -y install gearmand libgearman-devel [root@redis ~]# /etc/init.d/gearmand start 正在启动 gearmand: [确定] [root@redis ~]# /etc/init.d/gearmand status gearmand (pid 7702) 正在运行... |
3、安装php的gearman扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@redis ~]# wget -c -t 0 https://pecl.php.net/get/gearman-1.1.1.tgz [root@redis ~]# tar xvf gearman-1.1.1.tgz [root@redis ~]# cd gearman-1.1.1 [root@redis gearman-1.1.1]# phpize [root@redis gearman-1.1.1]# ./configure --with-php-config=/usr/bin/php-config [root@redis gearman-1.1.1]# make [root@redis gearman-1.1.1]# make install #如果php的配置文件中没有extension = gearman.so,就加上此行 [root@redis ~]# vim /etc/php.ini extension = gearman.so [root@redis ~]# /etc/init.d/php-fpm restart 停止 php-fpm: [确定] 正在启动 php-fpm: [确定] |
这样就是安装成功了
4、安装lib_mysqludf_json
lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [root@redis ~]# wget -c -t 0 https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip [root@redis ~]# unzip master.zip [root@redis ~]# cd lib_mysqludf_json-master/ [root@redis lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c lib_mysqludf_json.c:40:23: 错误:my_global.h:没有那个文件或目录 lib_mysqludf_json.c:41:20: 错误:my_sys.h:没有那个文件或目录 lib_mysqludf_json.c:43:19: 错误:mysql.h:没有那个文件或目录 lib_mysqludf_json.c:44:21: 错误:m_ctype.h:没有那个文件或目录 lib_mysqludf_json.c:45:22: 错误:m_string.h:没有那个文件或目录 #这里编译报错是因为没有安装mysql的开发包,如果是源码安装的mysql,需要在/etc/ld.so.conf.d/ #目录下新建一个文件告诉系统mysql的头文件在哪里 [root@redis lib_mysqludf_json-master]# yum -y install mysql-devel [root@redis lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c mysql> show global variables like 'plugin_dir'; +---------------+-------------------------+ | Variable_name | Value | +---------------+-------------------------+ | plugin_dir | /usr/lib64/mysql/plugin | +---------------+-------------------------+ #将模块拷贝到插件目录下 [root@redis lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/ #注册UDF函数 mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; |
5、安装gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [root@redis ~]# wget -c -t 0 https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz [root@redis ~]# tar xvf gearman-mysql-udf-0.6.tar.gz [root@redis ~]# cd gearman-mysql-udf-0.6 [root@redis gearman-mysql-udf-0.6]# ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/ [root@redis gearman-mysql-udf-0.6]# make [root@redis gearman-mysql-udf-0.6]# make install #注册UDF函数 mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'; mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so'; #查看函数 mysql> select * from mysql.func; +--------------------+-----+-------------------------+----------+ | name | ret | dl | type | +--------------------+-----+-------------------------+----------+ | json_object | 0 | lib_mysqludf_json.so | function | | gman_do_background | 0 | libgearman_mysql_udf.so | function | | gman_servers_set | 0 | libgearman_mysql_udf.so | function | +--------------------+-----+-------------------------+----------+ #指定gearman的服务信息 mysql> SELECT gman_servers_set('127.0.0.1:4730'); |
6、编写mysql触发器(根据实际情况编写)
1 2 3 4 5 | DELIMITER $$ CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`)); END$$ DELIMITER ; |
7、编写gearman的worker端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [root@redis ~]# vim /www/redis_worker.php <?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('syncToRedis', 'syncToRedis'); $redis = new Redis(); $redis->connect('127.0.0.1', 6379); while($worker->work()); function syncToRedis($job) { global $redis; $workString = $job->workload(); $work = json_decode($workString); if(!isset($work->id)){ return false; } $redis->set($work->id, $work->name); } ?> #后台运行 [root@redis www]# nohup php redis_worker.php & |
"$redis->set($work->id, $work->name);"这条语句就是将id作KEY和name作VALUE分开存储,需要和前面写的php测试代码的存取一致。
8、更新mysql中的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | mysql> set @RECV = 1; mysql> select @RECV; +------+ | @RECV| +------+ | 1 | +------+ mysql> update test set name = 'ssss' where id = 1; mysql> select @RECV; +------+ | @RECV| +------+ | NULL | +------+ |
从返回值可以看到,触发器是触发成功的(这里的@RECV是上面mysql TIGGER的返回值)。我们在redis中查看数据:
1 2 3 | [root@redis redis]# ./redis-cli 127.0.0.1:6379> get 1 "sven" |
这里的数据居然没有变化,这是我们就要排错了。
1 2 3 4 5 6 7 8 9 10 11 | [root@redis ~]# vim /var/log/audit/audit.log type=AVC msg=audit(1427807674.425:107): avc: denied { name_connect } for pid=12453 comm="mysqld" dest=4730 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:o bject_r:port_t:s0 tclass=tcp_socket #看到这样一条日志,就知道是selinux阻止了同步 #现在将selinux的模式调成Permissive [root@redis ~]# getenforce Enforcing [root@redis ~]# setenforce 0 [root@redis ~]# getenforce Permissive |
设置完成以后,再次执行update,进入redis进行查看
1 2 | 127.0.0.1:6379> get 1 "ssss" |
刷新一下刚刚的php界面
到这里就基本算是大功告成了,只要application将数据写到mysql中,mysql触发器检测到更新,就会通过Gearman将数据同步到redis中。然后读取的话,就直接从redis中进行读取。当然这只是个实验环境,实际上还有很多细节要调整。
七、GitHub上的一个有意思的工具
地址:https://github.com/delano/redis-dump
这个工具是用备份的redis的,也许你会问redis有自己的持久化,要这个工具干嘛?
redis的自带的持久化具有局限性,假象我们需要redis回到过去的某个时刻去(回档)。redis自带的持久化要实现这个需求,办法就是不断的将dump文件或者aof文件移动到其他目录中去,不然它就会被新的持久化文件覆盖。
而这个工具,就可以在任意时刻将数据库备份出来,非常方便。
1 2 | [root@redis ~]# yum -y install rubygems.noarch ruby-devel [root@redis ~]# gem install redis-dump |
这样就安装完成了,使用方法到GitHub上去看,挺详细的。
相关文章:

小米发力AI场景下的“快应用”,投百亿资源扶持开发者
近日,备受瞩目的2018 MIDC小米AIoT第二届开发者大会在京召开,雷军宣布AIloT是小米的核心战略,小米将和合作伙伴一起打造AIloT的美好明天。另外,大会还宣布了小米与宜家达成全球战略合作,宜家全系智能照明产品都将接入小…

arcgis 投影变换与坐标转换研究
arcgis 投影变换与坐标转换研究 1 ArcGIS中的投影方法 投影的方法可以使带某种坐标信息数据源进行向另一坐标系统做转换,并对源数据中的X和Y值进行修改。我们生产实践中一个典型的例子是利用该方法修正某些旧地图数据中X,Y值前加了带数和分带方法的数值。 字串9 操…

linux lvm 大小与硬盘大小关系,linux lvm扩容磁盘大小
关闭需要扩容的虚拟机,并通过管理虚拟机界面添加磁盘空间,本次调整50G注意,本次写入为增加容量的大小,并非增加完硬盘的大小硬盘添加后可以用fdisk -l 查看磁盘容量大小,可以看到硬盘增加了50G ,但是由于没…

无人驾驶汽车系统入门:基于VoxelNet的激光雷达点云车辆检测及ROS实现
作者 | 申泽邦(Adam Shan)兰州大学在读硕士研究生,主要研究方向无人驾驶,深度学习;兰大未来计算研究院无人车团队负责人,自动驾驶全栈工程师。之前我们提到使用SqueezeSeg进行了三维点云的分割,…

EX2010与EX2013共存迁移01-设计及说明
1.1共存条件说明 2013年之前发布的Exchange 2013版本是不支持共存的,只有在2013年4月2日发布的Exchange 2013 CU1版才支持共存,Exchange 2010必须为SP3版本才支持和2013共存及迁移,Exchange2003不支持和2013共存及迁移。下面是详细的共存说明…

linux ext4增加大小,如何修改 ext4 文件系统的大小
如何修改 ext4 文件系统的大小a. 扩大文件系统i启动到 Linux,umount 掉/dev/sdb1 和/dev/sdb2,若提示磁盘忙的话使用fuser 将正在使用磁盘的程序 kill 掉。(推荐使用另外的 Linux 启动盘来引导系统)ii使用 fdisk /dev/sdb 调整分区大小,进去之后,输入 p,记下要扩大分区起始位置…
Silverlight初级教程-开发工具
Silverlight初级教程 开发工具 在silverlight越来越流行的同时有很多的供应商开始筹划制作编辑和设计silverlight的工具。现在最常见的设计和开发工具是:Visual Studio 2008Visual Studio是微软整合的集成开发环境。截止此时Visual Studio 2008已经提供了编辑和预览…

201671010128 2017-11-12《Java程序设计》之图形程序设计
一、基本概念 Java的抽象窗口工具箱(Abstract Window Toolkit, AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。AWT库处理用户界面元素的方法:把图形元素的创建和行为委托给本地GUI工具箱进行处理。应用AWT编写依赖于本地…

linux线程join的用法,join用法
Join用法- a 1显示第一个文件的不匹配行,- a 2为从第二个文件中显示不匹配行。n.m n为文件号,m为域号。1 . 3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1 . 3,2 . 1。# cat name.txtM.Golls 12 Hi…

vss使用注意事项
连接方式 局域网方式连接 Internet 方式连接 在局域网方式连接时,需要输入自己的 vss 登陆帐号,账号可以通过管理器,自己在 vss 系统中注册; Internet 连接时默认使用的是 vss 中的 administrator 账号; 请大家都使用自…

沈向洋、黄学东等大咖助阵,IoT in Action微软深圳物联网大会即刻报名
每当海聊黑科技,总会有种恍然隔世的幻觉自动驾驶、无人配送、刷脸支付、智能翻译……物联网、人工智能、智能边缘等等新技术正在快速变得实用并普及怀疑论者还秉持观望,深怕技术布道之嫌而我们的现实中已经切实听见他们落地的声音因为“未来已经来临&…

centos6上以二进制方式安装mariadb5.5
准备mariadb-5.5.57-linux-x86_64.tar.gz二进制程序包 此包是经过编译的,也就是说我们要在特定的目录下安装; 步骤1、准备mysql用户 mkdir /app/data #此目录是存放mysql数据库、表的 useradd -r -m -d /app/data -s /sbin/nologin mysql #创建mysql用户…

“神人”or“闲人”?你的未来由AI与大数据决定
12 月 6 日,北京新云南皇冠假日酒店,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑数据科技股份有限公司协办的 2018 中国大数据技术大会(BDTC)首日议程圆满结束。本次大会为期三天&#…

linux 获取cpu id,linux获取cpu id和disk id
2013-04-19 15:17 57人阅读 评论(0)// 获得CPU IDpublic static final String CPU_ID_CMD "dmidecode -t 4 | grep ID |sort -u |awk -F: {print $2}";// 获得磁盘IDpublic static final String DISK_ID_CMD "fdisk -l |grep \"Disk identifier\" …

给gridview添加上下移动功能
给gridview添加上下移动功能存储过程代码:CREATE PROCEDURE [sp_trans_dept] now_id int,upside_id intASdeclare tmp_ordering int --临时变量declare sqlstr varchar(1000) --sql语句declare table_name varchar(500)declare column_name varchar(500)set t…

Lucene.Net 2.3.1开发介绍 —— 三、索引(六)
2.2 Field的Boost 如果说Document的Boost是一条线,那么Field的Boost则是一个点。怎么理解这个点呢?设置Document的Boost会影响所有字段。在搜索的过程中,一般至少会搜索两个Field,比如同时搜索标题和内容。而Document的Boost将同时…

linux nor flash 读写,9.2 NorFLASH读写实验——M25PExx
>[danger] 学习本节内容前,请先检查自己手上的开发板是否具备NorFlash存储器,如不具备则可跳过本章节。> ZigBee 标准板:具备> ZigBee MINI板:不具备> ZigBee 网关 & 嵌入式Linux 二合一开发板:具备我…

sql server分布式事务解决方案[新事务不能登记到指定的事务处理器中错误]
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 适用环境 操作系统:windows 2003,xp 数据库:sql server 2000/sql server 2005 使用链接服务器进行远程数据库访问的情况 一、 问题现象 在执行分布…

微软“叛变”谷歌 Chromium!
去年,微软工程师在公开演示 Azure 服务时,微软 Edge 浏览器频频崩溃,逼得他只能在众目睽睽的尴尬局面下,使用 Edge 下载 Chrome 浏览器来继续他的演示。一年之后的今天,Edge 就抱上了 Chrome 的大腿。图片来源…

vCenter Server Appliance 6.5 中重置丢失或忘记的 root 密码
vCenter Server Appliance 6.5 中重置丢失或忘记的 root 密码 目前安装vCenter Server Appliance 6.5客户原来越多,给用户配置过程中,往往会忽略默认的root 密码策略:60天过期。一旦密码过期或忘记密码,vcsa的管理控制台就无法通过…

linux 查看剪贴板历史,Clipboard History Manager插件,查看浏览器剪贴板历史记录
Clipboard History Manager插件,是一款浏览器剪贴板历史记录管理工具,通过它可以快速查看最多1000个本机上的剪贴数据,适用于Mac和Windows操作系统。A full-featured desktop clipboard manager for Mac, Windows and Linux to track what yo…

ORACLE执行计划的一些基本概念
本文介绍了ORACLE执行计划的一些基本概念,供学习应用。 一.相关的概念 Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个rowid的伪列,…

公开课报名 | 那些年,我们在文本分类中遇到的坑
文本分类问题是企业在 NLP 领域中处理文本数据时经常会遇到的一个问题,很多时候,我们需要将文本信息进行分类,或提相关的接口以供外部进行文本上传,在针对于用户所上传的文档信息就需要进行文档内容的分类,那么针对于这…

Cisco网院成立10周年-未来三年在蓉增50所
2008年9月18日—— 今天,主题为“十年创新,传承未来”的Cisco中国网络技术学院十周年庆典在四川成都举行。会上,Cisco宣布将与四川省政府和教育部进一步加强合作,在四川新建立50所Cisco网络技术学院,以实现该项目在四川…

荣耀预装linux安装包,关于华为机子没有预装应用商店讨论
在荣耀笔记本(Linux版)中拥有深度应用商店,几步就搞定啦!在荣耀笔记本(Linux版)中拥有深度应用商店,几步就搞定啦!深度操作系统 今天随着预装深度操作系统(deepin)的荣耀笔记本(Linux版)的开卖(未来可期!荣耀Magicbook…

如何自学CS?
整理 | 非主流出品 | AI科技大本营哪个行业的平均工资最高?计算机。国家统计局的数据显示,2016 年信息传输、软件和信息技术服务业年平均工资为 122478 元,首超金融行业,并于 2017 年再次夺魁。在互联网和人工智能浪潮的推动下&am…

oracle 使用nfs挂载的目录不能进行归档
oracle 使用nfs挂载的目录不能进行归档 在做实验时将oracle的归档目录放在nfs服务器上,启动数据库就会死掉,也不能进行归档。在报警日志中发现WARNING:NFS file system /mnt mounted with incorrect options WARNING:Expected NFS mount options: rs…

生产中NFS案例记录---写入权限解决过程
生产中NFS案例记录---写入权限解决过程NFS配置要求:1、 将oracle文件写入到NFS Server端,注意权限要与oracle端一致。2、 Oracle端目录文件所属用户为oracle,uid:500 gid 501。格式约定:命令显示过程 文字说明特别注意…

吴文俊人工智能科学技术奖:陆汝钤院士、百度王海峰等获奖
12月9日上午,被誉为“中国智能科学技术最高奖”的吴文俊人工智能科学技术奖在苏州举行颁奖典礼。本届吴文俊人工智能奖共对70项人工智能成果授奖。其中,中国科学院院士、中国科学院数学与系统科学研究院研究员陆汝钤成为首位吴文俊人工智能最高成就奖获得…

河南科技大学c语言章节作业答案,河南科技大学C语言试题
c语言试题,基本上是题库。上机作业用的。大家好好把握。C程序的运行环境和简单C源程序的调试,实验报告(共 题),用时(127分33秒),成绩(A)1、 有如下程序: #include"stdio.h" main( ) { int a8;printf("%d,%5d,%-5d#…