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 本文会使用到 ...
随机推荐
- 搜索引擎学习(五)Lucene操作索引
一.代码分析 /** * Lucene入门 * 操作索引 */ public class ManageIndex { public IndexWriter getIndexWriter() throw ...
- Oracle学习(六)存储过程
一.简介 1.定义 所谓存储过程,就是一段存储在数据库中执行某块业务功能的程序模块. 它是由一段或者多段的PL/SQL代码块或者SQL语句组成的一系列代码块. 2.结构分析 create [or re ...
- mysqldump 5.7
简介 mysqldump是官方自带的文本格式备份工具,简单实用,一般在Mysql安装目录的bin目录下.备份文件默认是SQL格式,它由一系列语句例如CREATE TABLE.INSERT等组成.mys ...
- JAVA对象转换为JSON及日期格式转换处理
1.JSON日期格式转换 默认JSON对DATE类型会转换成一个多属性对象, 而不是单独的一个字符串, 在某些应用处理上不是很方便, 可以利用JsonValueProcessor来实现日期的转换. ...
- 01 sublime text3下配置c/c++ 的编译运行环境
安装mingw,在线安装经常出问题,推荐离线安装 参考: https://blog.csdn.net/qq_34432960/article/details/106124496?utm_medium= ...
- matlab中repmat函数的用法
转载:https://blog.csdn.net/facetosea1/article/details/83573859 B = repmat(A,m,n)B = repmat(A,[m n])B = ...
- Java-JDK动态代理(AOP)使用及实现原理分析
Java-JDK动态代理(AOP)使用及实现原理分析 第一章:代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 后面我 ...
- 自动创建新序列号的Cookies脚本
已知一个网站在被访问的时候会读取电脑上存储的cookies 如果已经有cookie变量存在 则在存在的变量后按顺序增加新的序列 如电脑上有vst1变量的cookie了 那么新用户则自动创建为 vst2 ...
- 【Xshell】xshell6强制升级修改!
使用sublime text打开nslicense.dll文件,把0f86 8100 0000 33c0 68fe 0100 0050 6689中的0f86 8100修改为0f83 8100然后保存即 ...
- MeteoInfoLab脚本示例:Hamawari-8 netCDF data
示例数据:ftp://ftp.bom.gov.au/anon/sample/catalogue/Satellite/IDE00220.201507140300.nc 该数据的分辨率很高(22000*2 ...