以下内容是翻译的官网文档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来弥补

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

Redis分布式锁及分区的更多相关文章

  1. Redis分布式锁

    Redis分布式锁 分布式锁是许多环境中非常有用的原语,其中不同的进程必须以相互排斥的方式与共享资源一起运行. 有许多图书馆和博客文章描述了如何使用Redis实现DLM(分布式锁管理器),但是每个库都 ...

  2. Redlock(redis分布式锁)原理分析

    Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁: 使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击) ...

  3. Redis 分布式锁进化史(解读 + 缺陷分析)

    Redis分布式锁进化史 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布 ...

  4. 一文看透 Redis 分布式锁进化史(解读 + 缺陷分析)(转)

    近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Z ...

  5. 一篇文章带你解读Redis分布式锁的发展史和正确实现方式

    前言 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redi ...

  6. Redis分布式锁原理

    1. Redis分布式锁原理 1.1. Redisson 现在最流行的redis分布式锁就是Redisson了,来看看它的底层原理就了解redis是如何使用分布式锁的了 1.2. 原理分析 分布式锁要 ...

  7. 探索Redis设计与实现15:Redis分布式锁进化史

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  8. Redis 分布式锁进化史

    按:系统架构经过多年演进,现在越来越多的系统采用微服务架构,而说到微服务架构必然牵涉到分布式,以前单体应用加锁是很简单的,但现在分布式系统下加锁就比较难了,我之前曾简单写过一篇文章,关于分布式锁的实现 ...

  9. 掌握Redis分布式锁的正确姿势

    本文中案例都会在上传到git上,请放心浏览 git地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/order-lock 本文会使用到 ...

随机推荐

  1. java学习1day

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Prometheus-Alertmanager告警对接到企业微信

    之前写过将Prometheus的监控告警信息通过Alertmanager推送到钉钉群. 最近转移了阵地,需要将Prometheus监控告警信息推送到企业微信群,经过两天的摸索,以及查了网上的一些资料, ...

  3. 预科班D11

    2020.09.21星期一 预科班D11 学习内容: 一.基本数据类型及内置方法 1.整形int及浮点型float + - * / // ** % > < >= <= 2.字符 ...

  4. Tomcat学习小记(一)

    1.Tomcat概述 Tomcat 服务器是一个开源的轻量级Web应用服务器,擅长处理动态资源,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet.JSP 程序的首选. Tomcat ...

  5. Python-对字典进行排序

    案例: 某班英语成绩以字典的形式存储为: {'lili':78, 'jin':50, 'liming': 30, ......} 依据成绩高低,进行学生成绩排名 如何对字典排序? 方法1: #!/us ...

  6. 1.变量:var,let,const

    var在ECMAScript的所有版本中都可以使用,而const和let只能在ES6及更晚的版本中使用. var,let,const三个关键字的区别 var: 1)声明作用域:在函数内部,使用var定 ...

  7. python中numpy.savetxt 参数

    转载:https://blog.csdn.net/qq_36535820/article/details/99543188 numpy.savetxt 参数 numpy.savetxt(fname,X ...

  8. #ifndef, #define, #endif三者的作用

    #ifndef, #define, #endif 作用   #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译) ...

  9. 轻轻松松学CSS:Flex布局

     Flex布局就是"弹性布局",它可以简便.完整.响应式地实现各种页面布局.引入弹性布局的目的,当页面需要适应不同的屏幕大小确保元素拥有恰当的布局方式,对一个容器中的子元素进行排列 ...

  10. H264裸码流I/P/B帧类型判别

    花了两天时间做了个h264裸流nal类型和frame类型检测的工具,已上传至github,有需要的自行下载. 1.NAL类型检测 nal类型检测非常容易,对照下表即可容易判断类型. 较常用nal类型包 ...