分布式锁和一些碎碎念

有些变量需要在不同服务器上实现同步,如果异步调用是需要对资源设置锁,保证数据的一致性的。

在正常情况下用线程锁就可以了,但是分布式情况下比较特殊。

有两种实现方法:

1、通过数据库插入删除操作作为分布式锁,如果想要对某个方法执行,需要向数据库中插入一条数据,

INSERT INTO method_lock (method_name, desc) VALUES (methodName, 测试的methodName);

设置method_name的唯一性,这样就保证在并发量大的情况下无法同时操作同一个方法。

然后方法执行完再删除这条数据。

delete from method_lock where method_name =methodName;

这种可能出现死锁问题,因此应定期对数据进行清理。

2、基于redis实现

(1)SETNX

SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。 1 (2)expire

expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。 1 (3)delete

delete key:删除key

博主还有一个zookeeper实现的方式,看的不是很懂,就不写了

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

然后就是不同服务器之间的时间同步问题,这个通常用ntp进行时间同步,大致就是设置一台服务器作为基准机器并部署ntp,然后部署其他机器为从机,有一个问题是

比如说有一个定时执行的脚本,现在从机的时间是13:00,而主机的时间是12:30,这个脚本中的任务是在12:40执行的,但是如果直接将时间进行同步,在丛机到12:40时的时候就会再次执行这个脚本,但是原则上这个东西在一天只能执行一次。

处理这个问题的方法,我看网上说的是有一个慢慢进行同步的方法,大概就是不直接将时间拉到13:00而是慢慢错位,移过去。

经验分享 程序员 微信小程序 职场和发展