python+php+redis+shell实现几台redis的同步数据
之所以使用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的同步数据的更多相关文章
- java:redis(java代码操作redis,实体类mapper生成器(generator))
1.redis_demo Maven ItemMapper.xml: <?xml version="1.0" encoding="UTF-8" ?> ...
- Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- redis shell命令大全
redis shell命令大全(转自http://blog.mkfree.com/posts/5105432f975ad0eb7d135964) 作者:oyhk 2013-1-28 3:11:35 ...
- Python学习笔记整理总结【Memcache & Redis】
一.Memcached1.简介Memcached 是一个高性能的分布式内存对象缓存系统,一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度.提高可扩展性.用来存储 ...
- Redis shell
Redis shell 命令 参数 功能 redis-cli -r 将一个命令执行多次 -i 每隔几秒执行一次 -x 和|一起接收前面地输出,并执行命令 -c -a --scan/--patt ...
- python第十一周:RabbitMQ、Redis
Rabbit Mq消息队列 RabbitMQ能为你做些什么? 消息系统允许软件.应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和 ...
- Python学习笔记整理总结【Memcache & Redis(基础+主从架构)】
一.Memcached1.简介Memcached 是一个高性能的分布式内存对象缓存系统,一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度.提高可扩展性.用来存储 ...
- Python踩坑系列之使用redis报错:module 'redis' has no attribute 'Redis'问题
初次使用redis时,在链接Redis后,运行报错“module 'redis' has no attribute 'Redis' ”. 具体代码如下: import redis r = redis. ...
- python学习之模块导入,操作邮件,redis
python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...
随机推荐
- c c++怎么判断一个字符串中是否含有汉字
c c++怎么判断一个字符串中是否含有汉字 (2013-02-05 10:44:23) 转载▼ #include #include int main() { char sztext[] = ...
- C# checkboxlist的使用
最近做项目,需要用到checklistbox这一控件,由于对这一控件并不是很熟悉,导致在此浪费了一点时间. http://www.cnblogs.com/hongfei/archive/2012/12 ...
- Android layout_weight的用法
android:layout_weight是指LinearLayout先给里面的控件分配完大小之后剩余空间的权重. 下面通过举例说明: <LinearLayout xmlns:android=& ...
- 怎样将Sqlserver数据库转成mysql数据库
手上有一个网站之前是用asp.net做的,所使用的数据库是sqlserver,现在打算用PHP+MYSQL架构.因原来的站点有一定排名,直接改版的话,会导致产生很多错误页,网站排名和收录结果要恢复过来 ...
- Leetcode 1 two sum 难度:0
https://leetcode.com/problems/two-sum/ class Solution { public: vector<int> twoSum(vector<i ...
- Python collections 模块用法举例
Python作为一个“内置电池”的编程语言,标准库里面拥有非常多好用的模块.比如今天想给大家 介绍的 collections 就是一个非常好的例子. 1.collections模块基本介绍 我们都知道 ...
- 当powershell遇上mysql引发的血案
------------------[故事来由]------------------ 起因:群友问:把cmd.exe /c a:\mysql5.6\bin\mysql.exe -uroot < ...
- zlhome.com Deal
using AnfleCrawler.Common; using System; using System.Collections.Generic; using System.Linq; using ...
- Python的平凡之路(3)
一.函数基本语法及特性 面向对象:(华山派)—类 —class 面向过程:(少林派)—过程 —df 函数式编程:逍遥派 —函数— df 一般的,在一个变化过程中,如果有两个变量x和y,并且对于 ...
- javascript钩子机制
钩子机制是这样的,大家按照某一规则写一个方法(这个规则在方法名称上),然后页面加载完之前,统一执行所有的钩子函数. 注意callHooks方法,里面的局部变量s就是钩子函数名称中一定要有的内容.——这 ...