之所以使用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. javaWeb4 http

    状态码:服务器处理请求的结果(状态) 常见的状态: 200: 表示请求处理完成并完美返回.ok 302:表示请求需要进一步细化. 404:表示客户访问的资源找不到.Not Found 500:表示服务 ...

  2. wireshark过滤使用

    过滤器的区别 捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中.需要在开始捕捉前设置.显示过滤器(DisplayFilters):在捕捉结果中进行详细查找.他们可以在 ...

  3. Validate Binary Search Tree [LeetCode]

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  4. indent guides 格式化代码(添加竖线)

    点击 Visual Studio 2013 工具—扩展和更新—联机 然后输入indent guides 自动搜索出来这个插件(如图).注:Visual Studio 2010需要自己在网上下载安装. ...

  5. 51nod 1163 最高的奖励(贪心+优先队列)

    题目链接:51nod 1163 最高的奖励 看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥. 按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的 ...

  6. 0518Scrum项目5.0

    1.团队成员完成自己认领的任务. 2.燃尽图:理解.设计并画出本次Sprint的燃尽图的理想线.参考图6. 3.每日立会更新任务板上任务完成情况.燃尽图的实际线,分析项目进度是否在正轨.    每天的 ...

  7. ORM原型概念

    ORM[Object-Relation-Mapping]对象关系映射. 这个名词已经出来好几年了.已经不陌生.  以前在项目中针对相对复杂业务逻辑时一般采用领域模型驱动方式进行业务概述,分析和建模. ...

  8. WCF初探-24:WCF序列化和反序列化

    前言 WCF包含很多封装的内部机制,这些是我们在编写程序时不会经常看到的.比如上一篇讲解的Message.这一篇我将讲解WCF的另一种内部机制,WCF的序列化和反序列化.通常我们在编写WCF服务程序的 ...

  9. OC语言构造方法

    OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...

  10. PeCheck

    早上起来看到这个代码  整理一下 // PETableDlg.cpp : 实现文件 // #include "stdafx.h" #include "PECheck.h& ...