Redis分布式锁及分区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis分布式锁及分区相关的知识,希望对你有一定的参考价值。

以下内容是翻译的官网文档RedLock和分区部分,可以简单了解分布式锁在redis如何实现及其方式

redis分区的方法


redis实现的分布式锁RedLock算法,分布式锁,即在多个master上获取同一个锁

1.in order to get the lock,the client get the current ms time

2.顺序对n个实例获取锁权限(n个都是master),尝试锁时,设置连接超时时间,防止由于实例挂了,导致长时间无法执行操作

3.计算为了获取锁消耗的时间,有且仅有,client获取了超过半数个机器的锁,且获取锁消耗的时间小于锁的有效期,就被认为client获取了锁

4.锁被获取后,其合法的持续时间为:初始设置的有效时间-为了获取锁消耗的时间

5.如果client由于某些原因没有成功获取锁,它会解锁所有master实例(即使有的实例它不可能锁成功)


算法是异步的吗

算法的前提是:多个进程或机器不会同步时钟,导致时间波动,无法计算出准备的获取锁消耗时间,或不同的计算机,时间流逝的速度浮动范围很小



redis分区:

分区的优点

1.形成一个更大的数据库

2.计算能力增强,运用更多的核心数


基本的分区方式

1.范围分区,用一个路由表记录1-1000放哪个实例,1001-2000放哪个实例,缺点也很明显,需要路由表,key的类型很多的时候,需要给不同类型的key做不同的路由

2.hash分区,crc32(key),获取一个很大的数字,用这个数字和redis实例数取模,找到对应实例

3.一致性hash分区


不同的实现

1.client端分区:client直接选取正确的redis

2.代理辅助分区:client请求proxy,proxy forward正确的redis,并返回结果给client

3.查询路由;client随机发给一个redis,redis forward query  to right node,也有redis查询路由后,返回正确的redis地址,客户端再去正确的redis取,但是这样会多请求一次redis


分区的不足

1.不提供同时操作多个key

2.redis事务直接不可用

3.分区的粒度是key,如果一个key存了很大的数据量,分区也无可奈何

4.数据处理变得复杂,如果你想备份,需要聚合多个实例

5.扩容或缩容变得复杂,redis集群支持透明的重平衡数据,但是client分区,代理分区却不能透明的支持这个特性(预分区技术能解决)


存储数据?缓存?

如果redis作为数据存储,那么一个key总是需要对应到同一个redis


以上是关于Redis分布式锁及分区的主要内容,如果未能解决你的问题,请参考以下文章

什么是分布式锁及正确使用redis实现分布式锁

什么是分布式锁及正确使用redis实现分布式锁

什么是分布式锁及正确使用redis实现分布式锁

分布式锁及重试机制

etcd分布式锁及事务

利用Zookeeper实现分布式锁及服务注册中心