redis缓存mysql数据

redis (Remote Dictionary Server)是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得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的方式增加了不少流程,但是实现成本更低,更容易操作。

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数据库的更新。

使用lib_mysqludf_json的原因是因为Gearman只接受字符串作为入口参数,可以通过lib_mysqludf_json将MySQL中的数据编码为JSON字符串.

lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。

1. server2:
   配置redis:

yum install -y mysql-server
   /etc/init.d/mysqld start
   netstat -antlpe        ##mysql端口3306已开

   tar zxf redis-3.0.2.tar.gz
   cd redis-3.0.2
   yum install -y gcc  
   make
   make install

cd /root/redis-3.0.2/utils
   ./install_server.sh          ##安装服务器启动程序  
   
   /etc/init.d/redis_6379 start
   redis-cli monitor    ##监控数据,okshi表示监控正常
   redis-cli            ##临时设定redis的一些数据

redis作为mysql缓存服务器:
   cd /root
   yum install nginx-1.8.0-1.el6.ngx.x86_64.rpm   php-5.3.3-38.el6.x86_64.rpm

php-cli-5.3.3-38.el6.x86_64.rpm    php-common-5.3.3-38.el6.x86_64.rpm         php-devel-5.3.3-38.el6.x86_64.rpm    php-fpm-5.3.3-38.el6.x86_64.rpm  
php-gd-5.3.3-38.el6.x86_64.rpm   php-mbstring-5.3.3-38.el6.x86_64.rpm

php-mysql-5.3.3-38.el6.x86_64.rpm    php-pdo-5.3.3-38.el6.x86_64.rpm

php -m        ##看到支持的软件
   vim /etc/php.ini

date.timezone = Asia/Shanghai

cat /etc/passwd
    vim /etc/php-fpm.d/www.conf

user = nginx
group = nginx

/etc/init.d/php-fpm restart

     配置nginx:
     vim /etc/nginx/conf.d/default.conf

location / {
        root   /usr/share/nginx/html;
        index    index.html index.htm  index.php;
  }
 location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;   ##fastcgi通信
        fastcgi_index  index.php;        ##fastcgi主文件
        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
        include        fastcgi_params;   
    }

cd /usr/share/nginx/html/
    vim index.php

<?php
phpinfo()
?>

/etc/init.d/nginx start

网页访问http://172.25.85.2

nginx上运行php:

yum install -y unzip
   unzip phpredis-master.zip

cd phpredis-master
   phpize
   ./configure
   make
   make install

cd /usr/lib64/php/modules/
   ls
   cd /etc/php.d
   cp mysql.ini redis.ini
   vim redis.ini
将内容修改为以下:

  extension=redis.so

/etc/init.d/php-fpm reload
   php -m | grep redis

mysql
   mysql> show databases;        ##查看有无test数据库,没有则创建一个。
   mysql> quit

cd /root/redis
   mysql  < test.sql
   cat test.sql

use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) 
DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,‘test1‘),(2,‘test2‘),(3,‘test3‘),(4,‘test4‘)
,(5,‘test5‘),(6,‘test6‘),(7,‘test7‘),(8,‘test8‘),(9,‘test9‘);
#DELIMITER $$
#CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGINmysql  
< test.sql
    SET @RECV=gman_do_background(‘syncToRedis‘, 
    json_object(NEW.id as `id`, NEW.name as `name`)); 
  END$$
#DELIMITER ;

mysql
   mysql> use test;
   mysql> select * from test;

mysql> grant all on *.* to [email protected] identified by ‘westos‘;
   mysql> quit

mysql -uredis -pwestos
   mysql> use test;
   mysql> select * from test;
     

mysql> quit

cp /root/test.php /usr/share/nginx/html/
   cd /usr/share/nginx/html/
   rm -rf index.php
   mv test.php index.php

检测:
     网页访问http://172.25.85.2   ##已经完成redis对mysql的缓存

   redis-cli
127.0.0.1:6379> get 1
"test1"
127.0.0.1:6379> get 2
"test2"
127.0.0.1:6379> quit

mysql
   mysql> use test;
   mysql> update test set name=‘westos‘ where id=1;
   mysql> quit
网页访问http://172.25.85.2     ##更新了mysql中的数据,但是redis中的数据不会自动更新

redis-cli
127.0.0.1:6379> get 1
"test1"
redis-cli
127.0.0.1:6379> del 1
网页访问http://172.25.85.2

redis-cli
127.0.0.1:6379> set 1 westos
网页访问http://172.25.85。2

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.配置gearman自动更新redis中的数据:
  cd /root/redis
  yum install -y gearmand-1.1.8-2.el6.x86_64.rpm libgearman-1.1.8-2.el6.x86_64.rpm
  /etc/init.d/gearmand start
  netstat -antlpe
  tar zxf gearman-1.1.2.tgz
  cd gearman-1.1.2
  phpize
  ./configure
  cd ..
  yum install -y libgearman-devel-1.1.8-2.el6.x86_64.rpm

libevent-devel-1.4.13-4.el6.x86_64.rpm

libevent-doc-1.4.13-4.el6.noarch.rpm

libevent-headers-1.4.13-4.el6.noarch.rpm

cd gearman-1.1.2
  ./configure

  make
  make install

cd /etc/php.d
  cp redis.ini gearman.ini
  vim gearman.ini
将内容修改为以下:

extension=gearman.so

/etc/init.d/php-fpm reload
  php -m |grep gearman

yum install -y mysql-devel
  cd /root/redis

lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的

unzip lib_mysqludf_json-master.zip
  cd lib_mysqludf_json-master
  gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
  ls

mysql
  mysql> show global variables like ‘plugin_dir‘;

mysql> quit

cd /root/lib_mysqludf_json-master
  cp lib_mysqludf_json.so /usr/lib64/mysql/plugin

#注册UDF函数 

mysql
  mysql> create function json_object returns string soname ‘lib_mysqludf_json.so‘;
  mysql> select * from mysql.func;
   

mysql> quit

#安装gearman-mysql-udf

这个插件是用来管理调用 Gearman 的分布式的队列。

cd /root/redis
  tar zxf gearman-mysql-udf-0.6.tar.gz

cd gearman-mysql-udf-0.6
  yum install -y gcc-c++
  ./configure --libdir=/usr/lib64/mysql/plugin/
  make
  make install

cd /usr/lib64/mysql/plugin/
  mysql -p

#注册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;
 

mysql> quit

netstat -antlpe

#指定gearman的服务信息
  mysql
  mysql> select gman_servers_set(‘127.0.0.1:4730‘);
  mysql> quit

#编写mysql触发器(根据实际情况编写)
  cd /root/redis
  vim test.sql
将触发器的注释取消,在建表和插入数据语句前加上注释

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 ;

mysql  < test.sql

mysql
  mysql> show triggers from test;

mysql> quit

cp worker.php /usr/local/bin/
cd /usr/local/bin/
vim worker.php
nohup php worker.php  &
ps ax

mysql
mysql> use test;
mysql> update test set name=‘redhat‘ where id=1;
mysql> quit

网页访问http://172.25.19.1(刷新)    ##更新     (待验证)

redis-cli
127.0.0.1:6379> get 1
"redhat"

3.redis的主从复制
    如果设置了一个slave,不管是在第一次链接还是重新链接master的时候,slave会发送一个同步命令 然后master开始后台保存,收集所有对修改数据的命令。当后台保存完成,master会将这个数据文件传送到slave,然后保存在磁盘,加载到内存中;master接着发送收集到的所有的修改数据的命令,这好比一个流命令,是redis协议本身来实现的。
 
   在server3和server4上:

vim /etc/redis/6379.conf
slaveof 172.25.85.2 6379
   /etc/init.d/redis_6379 restart

   server2:
   vim /root/redis-3.0.2/sentinel.conf    ##配置sentinel

sentinel monitor mymaster 172.25.85.2  6379 2

##Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。

sentinel down-after-milliseconds mymaster 10000

##Sentinel 认为服务器已经断线所需的毫秒数。

sentinel failover-timeout mymaster 60000

grep -v ^#  sentinel.conf >/etc/sentinel.conf

redis-sentinel /etc/sentinel.conf
tu
     scp /etc/sentinel.conf [email protected]:/etc/
     scp /etc/sentinel.conf [email protected]:/etc/

redis-cli  -h 172.25.45.7 -p 26379 info
tu

server4:
    vim /etc/sentinel.conf

port 26379

dir "/tmp"
.
sentinel monitor mymaster 172.25. 6379 2

sentinel down-after-milliseconds mymaster 10000

sentinel failover-timeout mymaster 60000
   
sentinel parallel-syncs mymaster 1           ##选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
    
    scp /etc/sentinel.conf [email protected]:/etc/

然后再server7查看:redis-cli  -h 172.25.85.2 -p 26379 info  
tu

时间: 2024-10-11 04:56:50

redis缓存mysql数据的相关文章

redis缓存mysql

Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且

利用gearman实现redis缓存mysql

环境: centos6.5 mysql5.6 gearman简介: Gearman是一个支持分布式的任务分发框架.设计简洁,获得了非常广泛的支持.一个典型的Gearman应用包括以下这些部分: Gearman Job Server:Gearman核心程序,以守护进程形式运行在后台 Gearman Client:可以理解为任务的收件员,比如我要在后台执行一个发送邮件的任务,可以在程序中调用一个Gearman Client并传入邮件的信息,然后就可以将执行结果立即展示给用户,而任务本身会慢慢在后台运

gearman实现redis缓存mysql

Gearman简介: Gearman是一个支持分布式的任务分发框架.设计简洁,获得了非常广泛的支持.一个典型的Gearman应用包括以下这些部分: 1.Gearman Job Server:Gearman核心程序,以守护进程形式运行在后台 2.Gearman Client:可以理解为任务的收件员,比如我要在后台执行一个发送邮件的任务,可以在程序中调用一个Gearman Client并传入邮件的信息,然后就可以将执行结果立即展示给用户,而任务本身会慢慢在后台运行. 3.Gearman Worker

redis与mysql数据同步

应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql,此种情况存在的问题主要是如何保证mysql与redis的数据同步, 二者数据同步的关键在于mysql数据库中主键,方案是在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主 键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键. 1 String tbname = "login"; 2 3 //获取mysql表主键值--redis启动时 4

Redis和MySQL数据一致中出现的几种情况

1. MySQL持久化数据,Redis只读数据 redis在启动之后,从数据库加载数据. 读请求: 不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取 写请求: 数据首先都写到数据库,之后更新redis(先写redis再写mysql,如果写入失败事务回滚会造成redis中存在脏数据) 2.MySQL和Redis处理不同的数据类型 MySQL处理实时性数据,例如金融数据.交易数据 Redis处理实时性要求不高的数据,例如网站最热贴排行榜,好友列表等 在并发不高的情况下,读操作

《MySQL与Redis缓存架构》

<如何使用redis做mysql的缓存> 应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql. 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键. 这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,一般不是很

基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)

目录 1 准备工作 2 具体实施   1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用:提供string.list.set.zset.hash等数据结构的存储,并支持数据的备份. 本文适合使用的场景:当一个项目中Redis缓存的数据量逐渐增大,Redis缓存的数据占用内存也会越来越大,而且其中有很多很可能是价值不大的数据.由于Redis是一个key-value数据库,所以对其中的数

Redis(1.8)Redis与mysql的数据库同步

[1]缓存穿透与缓存雪崩 (一)缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存.我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性.合适的策略包括 合适的缓存更新策略,更新数据库后要及时更新缓存.缓存失败时增加重试机制,例如MQ模式的消息队列. (二)缓存击穿(缓存穿透)问题 缓存击穿表示恶意用户模拟请求很多缓存中不存在的数

redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)

一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步.在部分场合可以对关系数据库起到很好的补充作用.它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便. 二.架构图<ignore_js_