Redis主从
主从概念
-
⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
-
master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
-
通过主从配置可以实现读写分离
- master和slave都是一个redis实例(redis服务)
主从配置
配置主
-
查看当前主机的ip地址
ifconfig
-
修改
/etc/redis/redis.conf
文件sudo vi redis.conf
bind 192.168.26.128 -
重启redis服务
sudo service redis stop
sudo redis-server redis.conf
配置从
-
复制
/etc/redis/redis.conf
文件sudo cp redis.conf ./slave.conf
-
修改
redis/slave.conf
文件sudo vi slave.conf
-
编辑内容
bind 192.168.26.128
slaveof 192.168.26.128 6379
port 6378 -
redis服务
sudo redis-server slave.conf
-
查看主从关系
redis-cli -h 192.168.26.128 info Replication
数据操作
-
在master和slave分别执⾏info命令,查看输出信息 进入主客户端
redis-cli -h 192.168.26.128 -p 6379
-
进入从的客户端
redis-cli -h 192.168.26.128 -p 6378
-
在master上写数据
set aa aa
-
在slave上读数据
get aa
Python实现读写分离
from redis import StrictRedis
class MSRedis(object):
'''读写分离客户端(只针对程序中用到的命令)'''
def __init__(self, conf):
self.master = StrictRedis(**conf['Master'])
self.slave = StrictRedis(**conf['Slave'])
self.read_commands = [
'ttl', 'exist', 'expire', 'get', 'keys',
'hget', 'hgetall', 'hkeys', 'hmget',
'sismember', 'smembers', 'sdiff', 'sinter', 'sunion',
'zrevrange', 'zrevrangebyscore', 'zrevrank', 'zscore'
]
def __getattribute__(self, name):
if name in ['master', 'slave', 'read_commands']:
return object.__getattribute__(self, name)
elif name in self.read_commands:
print('选择了从库')
return self.slave.__getattribute__(name) # => self.slave.get()
else:
print('选择了主库')
return self.master.__getattribute__(name) # => self.master.get()
REDIS = {
'Master': {
'host': '192.168.126.133', # 主机地址
'port': '6379', # 主机端口
'db': 0
},
'Slave': {
'host': '192.168.126.133', # 从机地址
'port': '6378',# 从机端口
'db': 0
},
}
rds = MSRedis(REDIS)
# 读
read = rds.get('name')
print(read)
# 写
write = rds.set('age', 12)
print(write)