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文件,优先使用当前目录下的 导入模块的实 ...
随机推荐
- 转!!mysql order by 中文排序
1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决,那么MySQL ...
- laravel Ajax post方式的使用
以jquery ajax 的post的方式为例 验证邮箱输入格式是否正确 html <div class="fl"> <input type="emai ...
- cxf笔记记录
一.Web Service框架介绍: 1. WebService框架的作用: -- WebService只是一种思想,不是一个具体的框架. -- 它也是javaEE的规范. -- 它可以跨平台(操作平 ...
- Chinese culture
文房四宝 笔墨纸砚是中国古代文人书房中必备的宝贝,被称为“文房四宝”.用笔墨书写绘画在 中国可追溯到五千年前.秦(前221---前206)时已用不同硬度的毛和竹管制笔:汉代(前206—公元220) ...
- 用c语言编写直接插入法
#include<stdio.h> //直接插入法 void D_insert(int s[],int n); int main() { int i; ]; printf("pl ...
- 回车键转tab键
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head ...
- div仿textarea
CSS代码: .test_box { width: 400px; min-height: 120px; max-height: 300px; _height: 120px; margin-left: ...
- git修改已提交记录的注释
已提交暂存区但还未提交远端仓库 命令:git commit --amend -m 已提交远端仓库 命令:git rebase 可以参考:http://www.cnblogs.com/dudu/p/47 ...
- iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明
ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...
- HDU 1402 fft 模板题
题目就是求一个大数的乘法 这里数字的位数有50000的长度,按平时的乘法方式计算,每一位相乘是要n^2的复杂度的,这肯定不行 我们可以将每一位分解后作为系数,如153 = 1*x^2 + 5*x^1 ...