,向服务器触发第二原子操作,否则,终端向服务器触发第一原子操作,直至获取到分布式锁,由此,基于原子操作实现分布式锁的获取,可以快速解决分布式计算中对共享资源的安全访问问题,比如可以保证某个进程持有锁时意外终止之后,其他进程能够正常获得锁,具有设计简单、可扩展性好的技术效果;同时可以简化分布式锁的获取流程,提高操作效率和准确性。
[0090]如图5所示,本发明较佳实施例提出一种分布式系统共享网络资源的系统,包括:终端302和与所述终端302通信连接的服务器301,其中:
[0091]所述终端302,用于向所述服务器301触发第一原子操作,用以获取共享网络资源的分布式锁;
[0092]所述服务器301,用于根据接收的所述第一原子操作的触发指令,执行所述第一原子操作,并向所述终端302返回操作结果;
[0093]所述终端302,还用于当所述操作结果为未成功获取到分布式锁时,向所述服务器301触发第二原子操作,以判断所述分布式锁是否超时,并根据判断结果进行相应操作,直至获取到所述分布式锁。
[0094]进一步地,所述终端302,还用于当操作结果为未成功获取到分布式锁时,向所述服务器301发送第二原子操作的触发指令,在所述第二原子操作的触发指令中携带所述终端302的当前时间与设定的超时时间之和构成的第二时间戳;
[0095]所述服务器301,还用于根据接收的所述第二原子操作的触发指令,执行所述第二原子操作,并向所述终端302返回第三时间戳;所述第三时间戳为:所述终端302触发所述第二原子操作之前,所述服务器301获取到的时间戳;
[0096]所述终端302,还用于判断所述第三时间戳是否小于终端302的当前时间,若是,则判定所述分布式锁超时,成功获取到分布式锁;否则,返回执行向服务器301触发第一原子操作,直至获取到所述分布式锁。
[0097]本实施例方案涉及分布式系统中的服务器301和终端302,在分布式计算中,多个终端302可以通过计算机网络访问各节点上的共享资源。为了使分布式计算能够正常稳定运行,通过分布式锁保证多个终端302对同一共享资源的安全访问,避免数据的一致性遭到破坏。
[0098]在本实施例中,终端302基于redis提供的原子操作,与服务器301交互实现分布式锁的获取,以保证网络资源共享的正常进行,比如保证某个进程(不同的终端302代表不同的进程)持有锁时意外终止之后,其他进程能够正常获得锁等。
[0099]其中,redis是一个key-value (键-值)的内存存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string (字符串)、list (链表)、set (集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,即原子操作,在原子操作中,更高层不能发现其内部实现与结构。
[0100]具体来讲,原子操作,就是不能被更高等级中断抢夺优先的操作,就是不能被中断的操作。以操作系统为例,由于操作系统大部分时间处于开中断状态,所以,一个程序在执行的时候可能被优先级更高的线程中断。而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。
[0101]现代操作系统中,一般都提供了原子操作来实现一些同步操作,因此,原子操作也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作之前,要么在原子操作完成之后。更广泛的意义下,原子操作是指一系列必须整体完成的操作步骤,如果任何一步操作没有完成,那么所有完成的步骤都必须回滚,这样就可以保证要么所有操作步骤都未完成,要么所有操作步骤都被完成。
[0102]例如在单核系统里,单个的机器指令可以看成是原子操作(如果有编译器优化、乱序执行等情况除外);在多核系统中,单个的机器指令就不是原子操作,因为多核系统里是多指令流并行运行的,一个核在执行一个指令时,其他核同时执行的指令有可能操作同一块内存区域,从而出现数据竞争现象。多核系统中的原子操作通常使用内存栅障(memorybarrier)来实现,即一个CPU核在执行原子操作时,其他CPU核必须停止对内存操作或者不对指定的内存进行操作,这样才能避免数据竞争问题。
[0103]在此基础上,redis支持各种不同方式的排序。与memcached—样,为了保证效率,数据都是缓存在内存中。与memcached的区别在于:redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave (主从)同止/J/ O
[0104]本实施例利用redis的原子操作实现分布式锁(以下简称锁)的获取方案,其核心思想是利用redis的setnx操作进行获取锁的动作,利用redis的GetSet操作判断锁是否超时,并根据判断结果进行相应操作,直至获取到锁。
[0105]具体地,首先,终端302在访问共享资源时,终端302向服务器301触发第一原子操作,用以获取共享网络资源的分布式锁;其中,第一原子操作以redis的setnx操作进行举例,但不限于此种情形。
[0106]在第一原子操作的触发指令中携带有以分布式锁的锁名为key,以该key对应的第一时间戳为value的key-value参数;其中:锁名为与终端302共享资源相关的字符串,第一时间戳为终端302的当前时间与终端302设定的超时时间之和。
[0107]在服务器301侧,服务器301在接收不同终端302发来的各种操作触发指令,并获取不同终端302上报的时间戳。
[0108]具体地,服务器301在接收到终端302发来的第一原子操作的触发指令后,执行第一原子操作,以获取该终端302共享网络资源的锁。
[0109]服务器301在执行第一原子操作时,会根据是否获取到锁反馈不同的操作结果,t匕如,设定获取到锁的操作结果为1,设定未获取到锁的操作结果为I之外的其他值,比如O。最后,服务器301会将操作结果反馈给终端302。
[0110]终端302在获取到服务器301反馈的操作结果后,根据操作结果进行相应操作,当操作结果表明成功获取到锁时,终端302通过获取的锁共享网络资源。
[0111]当操作结果表明未成功获取到锁时,终端302向服务器301发送第二原子操作的触发指令,以避免其它拿到锁的进程死掉没有释放锁而造成死锁。
[0112]终端302在发给服务器301的第二原子操作的触发指令中携带有由该终端302的当前时间与设定的超时时间之和构成的第二时间戳。其中,第二原子操作以redis的GetSet操作进行举例,但不限于此种情形。
[0113]服务器301根据接收的上述第二原子操作的触发指令,执行第二原子操作,并向终端302返回第三时间戳;所述第三时间戳为:所述终端302触发所述第二原子操作之前,所述服务器301获取到的时间戳,该时间戳可能是异于当前终端302的其它终端302改写并上报给服务器301的时间戳。
[0114]终端302在接收到服务器301返回的第三时间戳后,判断该第三时间戳是否小于终端302的当前时间,若是,则判定锁超时,从而成功获取到锁;否则,返回执行向服务器301触发第一原子操作,直至获取到所述分布式锁。
[0115]本实施例通过上述方案,终端302向服务器301触发第一原子操作,用以获取共享网络资源的分布式锁;服务器301根据接收的第一原子操作的触发指令,执行第一原子操作,并向终端302返回操作结果;当操作结果为未成功获取到分布式锁时,终端302向服务器301触发第二原子操作,以判断分布式锁是否超时,若超时,则成功获取到锁,否则,返回执行终端302向服务器301触发第一原子操作步骤,直至获取到分布式锁,由此,基于原子操作实现分布式锁的获取,可以快速解决分布式计算中对共享资源的安全访问问题,比如可以保证某个进程持有锁时意外终止之后,其他进程能够正常获得锁,具有设计简单、可扩展性好的技术效果。
[0116]进一步地,所述终端302还用于当所述操作结果为未成功获取到分布式锁时,从所述服务器301获取当前记录的第四时间戳;判断所述第四时间戳是否小于终端302的当前时间,若是,则判定所述分布式锁超时,向服务器301触发第二原子操作;否则,返回执行向服务器301触发第一原子操作,直至获取到所述分布式锁。
[0117]在此种实施方式中,终端302在通过发送第一原子操作未成功获取到分布式锁时,不是直接向服务器301触发第二原子操作,而是先判断分布式锁是否超时,若超时则向服务器301触发第二原子操作,若不超时,则直接返回执行向服务器301触发第一原子操作,由此可以简化分布式锁的获取流程,提高操作效率和准确性。
[0118]如图6所示,本发明第一实施例提出一种分布式系统共享网络资源的终端,包括:第一原子操作触发模块401、接收模块402及第二原子操作触发模块403,其中:
[0119]第一原子操作触发模块401,用于向服务器触发第一原子操作,用以获取共享网络资源的分布式锁;
[0120]接收模块402,用于接收所述服务器执行所述第一原子操作后返回的操作结果;
[0121]第二原子操作触发模块403,用于当所述操作结果为未成功获取到分布式锁时,向所述服务器触发第二原子操作,以判断所述分布式锁是否超时,并根据判断结果进行相应操作,直至获取到所述分布式锁。
[0122]本实施例方案涉及分布式系统中的服务器和终端,在分布式计算中,多个终端可以通过计算机网络访问各节点上的共享资源。为了使分布式计算能够正常稳定运行,通过分布式锁保证多个终端对同一共享资源的安全访问,避免数据的一致性遭到破坏。
[0123]在本实施例中,终端基于redis提供的原子操作,与服务器交互实现分布式锁的获取,以保证网络资源共享的正常进行,比如保证某个进程(不同的终端代表不同的进程)持有锁时意外终止之后,其他进程能够正常获得锁等。
[0124]其中,redis是一个key-value (键-值)的内存存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string (字符串)、list (链表)、set (集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,即原子操作(在原子操作中,更高层不能发现其内部实现与结构)。在此基础上,redis支持各种不同方式的排序。与memcached—样,为了保证效率,数据都是缓存在内存中。与memcached的区别在于:re