中易网

redis分布式 为什么还要主从

答案:2  悬赏:30  
解决时间 2021-02-04 04:40
redis分布式 为什么还要主从
最佳答案
redis 分布式,主从同步
张映 发表于 2011-06-27
分类目录: cache, nosql
标签:master, redis, slave, 主从, 分布式, 集群

redis和memcache比较像的,memcache可以实现服务器的集群,redis肯定也是可以的。下面在一台机,实现redis主从复制。
1,copy一下redis.conf,生成一个从机的配置
cp /usr/local/redis/redis.conf /usr/local/redis/redis_slave.conf
2,修改主服务器的配置redis.conf
bind 127.0.0.1
3,修改从服务器的配置redis_slave.conf
pidfile /usr/local/redis/var/redis_slave.pid
port 10002
bind 127.0.0.1
logfile /usr/local/redis/var/redis_slave.log
dbfilename dump_slave.rdb
slaveof 127.0.0.1 6379
4,启动主服务器,从服务器
redis-server /usr/local/redis/redis.conf
redis-server /usr/local/redis/redis_slave.conf
查看一下,redis.log文件会有以下内容
[3774] 27 Jun 12:53:32 * The server is now ready to accept connections on port 10002
[3774] 27 Jun 12:53:32 - 0 clients connected (0 slaves), 539568 bytes in use
[3774] 27 Jun 12:53:32 * Connecting to MASTER...
[3772] 27 Jun 12:53:32 - Accepted 127.0.0.1:33237
[3772] 27 Jun 12:53:32 * Slave ask for synchronization
[3772] 27 Jun 12:53:32 * Starting BGSAVE for SYNC
[3772] 27 Jun 12:53:32 * Background saving started by pid 3775
[3774] 27 Jun 12:53:32 * MASTER <-> SLAVE sync started: SYNC sent
[3775] 27 Jun 12:53:32 * DB saved on disk
[3772] 27 Jun 12:53:33 * Background saving terminated with success
[3772] 27 Jun 12:53:33 * Synchronization with slave succeeded
[3774] 27 Jun 12:53:33 * MASTER <-> SLAVE sync: receiving 333 bytes from master
[3774] 27 Jun 12:53:33 * MASTER <-> SLAVE sync: Loading DB in memory
[3774] 27 Jun 12:53:33 * MASTER <-> SLAVE sync: Finished with success
查看一下
root@ubuntu:/usr/local/redis# ps -e|grep redis
3774 ? 00:00:00 redis-server
4148 ? 00:00:00 redis-server
5,测试结果
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('test',json_encode(array(1,2,3,4)));
print_r(json_decode($redis->get('test')));
?>

root@ubuntu:/usr/local/redis# telnet 127.0.0.1 10002
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get test
$9
[1,2,3,4]
缓存数据是放在6379这个端口的服务器上,代码执行后,登录到10002端口的slave服务器上也可以看到有数据,说明已经同步了。
我尝试了一下,redis的主主同步,但是没有成功,我看了一下log,以从服务器127.0.0.1 10002为master的时候,同时启动二个端口,怎么也连接不上127.0.0.1 6379是不支持呢?还是配置有问题,我在网上查了一下,没看到有人配置主主同步的。
全部回答
redis有一系列的命令,特点是以nx结尾,nx是not exists的缩写,如setnx命令就应该理解为:set if not exists。这系列的命令非常有用,这里讲使用setnx来实现分布式锁。 用setnx实现分布式锁 利用setnx非常简单地实现分布式锁。例如:某客户端要获得一个名字foo的锁,客户端使用下面的命令进行获取: setnx lock.foo 如返回1,则该客户端获得锁,把lock.foo的键值设置为时间值表示该键已被锁定,该客户端最后可以通过del lock.foo来释放该锁。 如返回0,表明该锁已被其他客户端取得,这时我们可以先返回或进行重试等对方完成或等待锁超时。 解决死锁 上面的锁定逻辑有一个问题:如果一个持有锁的客户端失败或崩溃了不能释放锁,该怎么解决?我们可以通过锁的键对应的时间戳来判断这种情况是否发生了,如果当前的时间已经大于lock.foo的值,说明该锁已失效,可以被重新使用。 发生这种情况时,可不能简单的通过del来删除锁,然后再setnx一次,当多个客户端检测到锁超时后都会尝试去释放它,这里就可能出现一个竞态条件,让我们模拟一下这个场景: c0操作超时了,但它还持有着锁,c1和c2读取lock.foo检查时间戳,先后发现超时了。 c1 发送del lock.foo c1 发送setnx lock.foo 并且成功了。 c2 发送del lock.foo c2 发送setnx lock.foo 并且成功了。 这样一来,c1,c2都拿到了锁!问题大了! 幸好这种问题是可以避免d,让我们来看看c3这个客户端是怎样做的: c3发送setnx lock.foo 想要获得锁,由于c0还持有锁,所以redis返回给c3一个0 c3发送get lock.foo 以检查锁是否超时了,如果没超时,则等待或重试。 反之,如果已超时,c3通过下面的操作来尝试获得锁: getset lock.foo 通过getset,c3拿到的时间戳如果仍然是超时的,那就说明,c3如愿以偿拿到锁了。 如果在c3之前,有个叫c4的客户端比c3快一步执行了上面的操作,那么c3拿到的时间戳是个未超时的值,这时,c3没有如期获得锁,需要再次等待或重试。留意一下,尽管c3没拿到锁,但它改写了c4设置的锁的超时值,不过这一点非常微小的误差带来的影响可以忽略不计。 注意:为了让分布式锁的算法更稳键些,持有锁的客户端在解锁之前应该再检查一次自己的锁是否已经超时,再去做del操作,因为可能客户端因为某个耗时的操作而挂起,操作完的时候锁因为超时已经被别人获得,这时就不必解锁了。 示例伪代码 根据上面的代码,我写了一小段fake代码来描述使用分布式锁的全过程: # get lock lock = 0 while lock != 1: timestamp = current unix time + lock timeout + 1 lock = setnx lock.foo timestamp if lock == 1 or (now() > (get lock.foo) and now() > (getset lock.foo timestamp)): break; else: sleep(10ms) # do your job do_job() # release if now() < get lock.foo: del lock.foo 是的,要想这段逻辑可以重用,使用python的你马上就想到了decorator,而用java的你是不是也想到了那谁?aop + annotation?行,怎样舒服怎样用吧,别重复代码就行。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
潮园饭店地址在什么地方,想过去办事
中秋思亲思乡的作文800字
为什么每个人 的眼光不同
安卓系统的平板电脑有必要安装杀毒软件吗
木足盐是什么
恒发烟茶酒商行地址在什么地方,想过去办事
安庆哪里的房子最好看
广东顺德工作好找吗?
手机号是二次回收的,被注册了微信。我怎么在
我2015年7月18日退休,退休金从哪天开始算
达州市国土资源局马家管理所地址有知道的么?
好纠结,各位建议一下,是买P9P还是等MATE9
delphi子窗口用close不能关闭!!为神马
打烤牌怎么打
她是我一个朋友的前任,后来我喜欢上她了,撩
推荐资讯
屋顶保温用挤塑板,一般都怎么施工。另外防水
没护过肤,刚开始是先用清洁面膜还是补水面膜?
这是我应该做的,日语怎么说合适
火狐编码自动检测没中文
奔驰glk260方便出入如何如何设置
你去过九寨对吗? 今天晚上我们就要出发了。
苏通进口石材地址在哪,我要去那里办事
缺金缺水女孩叫冯鑫雨可以吗?今年新历7.26号
卖女装一般都去哪里进货?开女装店一般要要投
郭强这个名字全国有多少个
有一本小说主人公为就救一女孩和女孩一起出车
刘海很碎一根根
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?