• 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

    分布式锁
    1.互斥 setNX
    2.死锁 timeout
    3.可重入 setNx(xx,xx,1) -> setNx(xx,xx,2)
    4.订阅subscrible 频道,锁释放时publish消息,redis server和client会建立长连接,订阅时,java需要开发一个listener来处理消息,实现onMessage方法

    https://www.jianshu.com/p/de5a69622e49

    redis为什么快

    redis快的原因,基于内存,不会再操作时进行磁盘I/O,key,val采用dict,类似HashMap,时间复杂度为1,key多为string,没有hash冲突
    单线程避免了无谓的cpu上下文切换,无锁
    非阻塞IO,epoll多路复用 epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作,只有一个线程来处理这些I/O,key

    确实无法利用多cpu的优势,但是一般情况下,cpu不是redis的瓶颈,但是可以用单机启用多个redis来弥补

    减少耗时的命令,大对象,大对象还可能导致频繁查询打满带宽

  • 相关阅读:
    120-136. 只出现一次的数字
    119-217. 存在重复元素
    118-103. 二叉树的锯齿形层序遍历
    117.力扣-两数相加问题
    116.python处理xmind文件
    115.python获取服务器信息
    日期转换类 DateConverter.java
    数据库连接工具类——包含取得连接和关闭资源 ConnUtil.java
    数据库连接工具类 数据库连接工具类——仅仅获得连接对象 ConnDB.java
    APP手机端加载不到资源服务器后台解决参考
  • 原文地址:https://www.cnblogs.com/windliu/p/8460755.html
Copyright © 2020-2023  润新知