之所以使用python,是因为python多线程非常简单。

之所以使用shell,是因为写了个服务,可以方便的重启python写的那个脚本。

总体思路:利用redis的发布订阅,php作为生产者,python作为消息费,来实现多台redis-master数据同步。中间也用了redis的list。

当然多台redis-master可以做一个redis集群,然后再两两同步。这里不讨论这么情况的实现。

1、PHP代码(php作为消息生产者,也就是客户端)

$redis = new Redis();
$redis->connect('127.0.0.0', 6379);
$redis->set('test', '123');//设置一个key/value
$count = $redis->lpush('rsync_list', 'test'); // 把key放到rsync_list这个队列里,做为同步使用
$redis->publish('rsync_list', $count);//发布一个消息,channel为rsync_list,用于python代码订阅的channel

2、PYTHON代码(python做为消息接收者,也就是服务端)

/home/www/py/muti_thread_redis.py

#!/usr/bin/env python
#coding=utf-8 import threading
import redis MAIN_HOST = '127.0.0.1'
MAIN_PORT = 6379
MAIN_PASS = '' RSYNCLIST = 'rsync_list' def infinite():
global rc ps = rc.pubsub()
ps.subscribe('rsync_list') threads = [] while True:
data = ps.parse_response()
if data[2] > 0:
#第一台
t1 = threading.Thread(target=write1,args=(data[2],))
t1.start()
threads.append(t1)
#第二台
t2 = threading.Thread(target=write2,args=(data[2],))
t2.start()
threads.append(t2)
for t in threads:
t.join()
#子进程执行完之后,清空list def write1(args):
global rc
global RSYNCLIST
redis_one = redis.Redis(host='127.0.0.1',port=6380,password='')
for i in rc.lrange(RSYNCLIST, 0, -1):
redis_one.set(i, rc.get(i)) def write2(args):
global rc
global RSYNCLIST
redis_two = redis.Redis(host='127.0.0.1',port=6381,password='')
for i in rc.lrange(RSYNCLIST, 0, -1):
redis_two.set(i, rc.get(i)) if __name__ == '__main__':
rc =redis.Redis(host=MAIN_HOST,port=MAIN_PORT,password=MAIN_PASS)
infinite()

  注意:这里python和python的redis扩展的安装,就不在这里赘述了。baidu里很多

3、shell(做为一个服务用来启动python的服务端脚本)

cd /etc/init.d

新建一个脚本:vim rsync-redis

#!/bin/bash
#chkconfig:2345 55 25 //运行级别、启动优先级、关闭优先级
#processname:rsync-redis //进程名
#description:source rsync-redis server daemon //服务描述
prog=/usr/bin/python
lock=/home/www/py/rsync_redis.pid start(){
echo "[正在启动服务...]"
$prog /home/www/py/muti_thread_redis.py &
echo "[OK]"
touch $lock
}
stop(){
echo "[正在停止服务...]"
pkill -f muti_thread_redis.py
rm -f $lock
echo "[OK]"
}
status(){
if [ -e $lock ];then
echo "$0 服务正在运行"
else
echo "$0 服务已经停止"
fi
}
restart(){
stop
start
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
echo "用法:$0 start|stop|status|restart"
;;
esac

  然后就可以用/etc/init.d/rsync-redis start/stop/restart/status来操作了。

python+php+redis+shell实现几台redis的同步数据的更多相关文章

  1. java:redis(java代码操作redis,实体类mapper生成器(generator))

    1.redis_demo Maven  ItemMapper.xml: <?xml version="1.0" encoding="UTF-8" ?> ...

  2. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  3. redis shell命令大全

    redis shell命令大全(转自http://blog.mkfree.com/posts/5105432f975ad0eb7d135964) 作者:oyhk   2013-1-28 3:11:35 ...

  4. Python学习笔记整理总结【Memcache & Redis】

    一.Memcached1.简介Memcached 是一个高性能的分布式内存对象缓存系统,一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度.提高可扩展性.用来存储 ...

  5. Redis shell

    Redis shell 命令 参数 功能 redis-cli -r 将一个命令执行多次 -i 每隔几秒执行一次 -x 和|一起接收前面地输出,并执行命令 -c   -a   --scan/--patt ...

  6. python第十一周:RabbitMQ、Redis

    Rabbit Mq消息队列 RabbitMQ能为你做些什么? 消息系统允许软件.应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和 ...

  7. Python学习笔记整理总结【Memcache & Redis(基础+主从架构)】

    一.Memcached1.简介Memcached 是一个高性能的分布式内存对象缓存系统,一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度.提高可扩展性.用来存储 ...

  8. Python踩坑系列之使用redis报错:module 'redis' has no attribute 'Redis'问题

    初次使用redis时,在链接Redis后,运行报错“module 'redis' has no attribute 'Redis' ”. 具体代码如下: import redis r = redis. ...

  9. python学习之模块导入,操作邮件,redis

    python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...

随机推荐

  1. zabbix3.0.4 部署之二 (Centos6.5系统准备)

    1.安装Centos6.5  2.6.32-642.4.2.el6.x86_64 升级所有软件至最新: yum update 2.同步时间.安装ntpd yum  install ntpddate n ...

  2. java 注释

    单行注释// 多行注释/*  */ 注释并写入javadoc /**  */ // 这是单行注释的示例 /* 这个也是单行注释的示例 */ /* 这是第一个Java程序 *它将打印Hello Worl ...

  3. iOS修改手机定位(非越狱任意位置)

    利用开发者的一些调试功能,我们可以修改非越狱的苹果手机定位,模拟任意位置. 经测试,此方法仅限开发者调试使用,并不能长时间修改手机定位. 1. 首先需要了解一些坐标系的知识 iOS,原生坐标系为 WG ...

  4. daterangepicker 双日历/格式化日期/日期限制minDate,maxDate

    var locale = { "format": 'YYYY/MM/DD', "separator": " - ", "apply ...

  5. python--分布式爬虫

    //server import socket, select, re, queue, redis from multiprocessing import Pool, cpu_count from py ...

  6. js问题解释

    今天群里有人问一个js问题,现列出以便其他人参考. Function.prototype.curry=function(){ var slice=Array.prototype.slice, args ...

  7. 回车键转tab键解决方案一

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. C#驱动及应用

    一,使用开源客户端:StackExchange.Redis 二,使用方法:     1,获取访问redis数据库连接,代码如下. /// <summary> /// 获取访问redis数据 ...

  9. IT公司100题-32-交换元素,使数组差最小

    问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, ...

  10. MATLAB 物体识别算法说明:vision.ForegroundDetector, vision.BlobAnalysis

    在官方示例中,Motion-Based Multiple Object Tracking和Using Kalman Filter for Object Tracking都使用了下面两个算法进行物体的识 ...