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来弥补
减少耗时的命令,大对象,大对象还可能导致频繁查询打满带宽
Redis分布式锁及分区的更多相关文章
- Redis分布式锁
Redis分布式锁 分布式锁是许多环境中非常有用的原语,其中不同的进程必须以相互排斥的方式与共享资源一起运行. 有许多图书馆和博客文章描述了如何使用Redis实现DLM(分布式锁管理器),但是每个库都 ...
- Redlock(redis分布式锁)原理分析
Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁: 使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击) ...
- Redis 分布式锁进化史(解读 + 缺陷分析)
Redis分布式锁进化史 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布 ...
- 一文看透 Redis 分布式锁进化史(解读 + 缺陷分析)(转)
近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Z ...
- 一篇文章带你解读Redis分布式锁的发展史和正确实现方式
前言 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redi ...
- Redis分布式锁原理
1. Redis分布式锁原理 1.1. Redisson 现在最流行的redis分布式锁就是Redisson了,来看看它的底层原理就了解redis是如何使用分布式锁的了 1.2. 原理分析 分布式锁要 ...
- 探索Redis设计与实现15:Redis分布式锁进化史
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Redis 分布式锁进化史
按:系统架构经过多年演进,现在越来越多的系统采用微服务架构,而说到微服务架构必然牵涉到分布式,以前单体应用加锁是很简单的,但现在分布式系统下加锁就比较难了,我之前曾简单写过一篇文章,关于分布式锁的实现 ...
- 掌握Redis分布式锁的正确姿势
本文中案例都会在上传到git上,请放心浏览 git地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/order-lock 本文会使用到 ...
随机推荐
- linux学习(四)Linux 文件基本属性
一.引言 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限. 为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定. 在Lin ...
- Spring Boot 知识清单(一)SpringApplication
爱生活,爱编码,微信搜一搜[架构技术专栏]关注这个喜欢分享的地方.本文 架构技术专栏 已收录,有各种JVM.多线程.源码视频.资料以及技术文章等你来拿. 一.概述 目前Spring Boot已经发展到 ...
- 文档驱动 —— 表单组件(六):基于AntDV的Form表单的封装,目标还是不写代码
开源代码 https://github.com/naturefwvue/nf-vue3-ant 也不知道大家是怎么写代码的,这里全当抛砖引玉 为何封装? AntDV非常强大,效果也非常漂亮,功能强大, ...
- Logback自定义日志颜色
片段 1 片段 2 LogbackColorful.java package cn.mrxionge.netdemo; import ch.qos.logback.classic.Level; imp ...
- SpringBoot-03-JSR303数据校验和多环境切换
3.3 JSR303数据校验 先看如何使用 Springboot中可以用@Validated来校验数据,如果数据异常则统一抛出异常,方便异常中心统一处理. 这里我们写个注解让name只支持Em ...
- 软件定义网络实验记录①--Mininet 源码安装和可视化拓扑工具
第一步: 在 Ubuntu 系统的 home 目录下创建一个目录,目录名为自己的标识,包括但 不限于学号.姓名拼音等,目录不要包含中文. 第二步: 在创建的目录下,完成 Mininet 的源码安装. ...
- #pragma comment 的使用方法
转发:https://blog.csdn.net/liruda/article/details/2230617 #pragma comment ( lib,"wpcap.lib" ...
- 磁盘 IOPS(每秒读写次数) 的计算方法
一.磁盘 I/O 的概念 I/O 的概念,从字义来理解就是输入输出.操作系统从上层到底层,各个层次之间均存在 I/O.比如,CPU 有 I/O,内存有 I/O, VMM 有 I/O, 底层磁盘上也有 ...
- shell-字符串及整数操作符讲解与多实践
1. 字符串测试操作符 字符串测试操作符的作用:比较两个字符串是否相同.字符串长度是否为零,字符串是否为null(注:bash区分零长度字符串和空字符串)等. "="比较两个字符串 ...
- ansible-主机清单的配置
1. ansible主机清单的配置 以下是ansible安装完成后的源文件 1 [root@test-1 ~]# cat /etc/ansible/hosts 2 # This is the defa ...