分布式锁

分布式实战-分布式锁mysql与redis实现(二)

拥有回忆 提交于 2019-12-22 16:02:56
使用锁的目的 多个外部线程同时来竞争使用同一资源时,会彼此影响,导致混乱 锁的目的,将资源的使用做排它性处理,使同一时间,仅一个线程能访问资源 并不是所有的资源,都无法同时服务多个线程 ------ 比如,无状态的资源 无成员变量/成员变量不存在变化的类---- 就是无状态类 ----- 这种类是线程安全的 有状态的对象,也不一定是不安全的 ---如果状态变化是原子的(即没有中间变迁过程,变化不需要时间,没有中间态) ---- 那么它一样是线程安全的 锁的本质 锁要解决的问题是 ------- 资源数据会不一致 锁要达成的目标是 ------- 让资源使用起来,像原子性一样 锁达成目标的手段 ------- 让使用者访问资源时,只能排队,一个一个地去访问资源 在单机应用里,JVM可以通过以下工具,可协调资源像原子性一样操作 1、sychronized ------ java语言天生支持 2、lock ---- jdk有接口标准 分布式环境下,如何协调资源达到原子性的操作? 1、sychronized / lock 这些java天然的实现,无法跨JVM发挥作用 2、只得去寻求分布式环境里,大家都公认的服务来做见证人,以协调资源 3、常见的公证人 ------》 mysql/zk/file/redis 4、目标 ----- 通过公证人发出信号,来协调分布式的访问者,排队访问资源 5

redis缓存

牧云@^-^@ 提交于 2019-12-22 11:39:50
1、为什么使用redis 2、使用redis有什么缺点 3、单线程的redis为什么这么快 4、redis的数据类型,以及每种数据类型的使用场景 5、redis的过期策略以及内存淘汰机制 6、redis和数据库双写一致性问题 7、如何应对缓存穿透和缓存雪崩问题 8、如何解决redis的并发竞争问题 正文 1、为什么使用redis 分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。 回答:如下所示,分为两点 (一)性能 如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 题外话:忽然想聊一下这个迅速响应的标准。其实根据交互效果的不同,这个响应时间没有固定标准。不过曾经有人这么告诉我:”在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消,这样才能给用户最好的体验。” 那么瞬间、刹那、一弹指具体是多少时间呢? 根据《摩诃僧祗律》记载 一刹那者为一念,二十念为一瞬,二十瞬为一弹指

redis面试题

断了今生、忘了曾经 提交于 2019-12-21 03:55:06
1.Redis 的数据类型? 2.使用 Redis 有哪些好处? 3.Redis 是单进程单线程的? 4.Redis 的持久化机制是什么?各自的优缺点? 1、什么是 Redis? Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: (1)Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 (2)Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。 (3)Redis 支持数据的备份,即 master-slave 模式的数据备份。 Redis 优势 (1)性能极高 – Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。 (2)丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及Ordered Sets 数据类型操作。 (3)原子 – Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC指令包起来。 (4)丰富的特性 – Redis 还支持 publish

Redis常见面试题解析(二)

你。 提交于 2019-12-21 03:21:59
文章目录 一、Redis 集群结构以及设计理念 1. Redis 集群架构模式有哪几种? 2. Redis 集群最大节点个数是多少? 3. Redis 集群的主从复制模型是怎样的? 4. 请介绍一下 Redis 集群实现方案 5. Redis 集群会有写操作丢失吗?为什么? 6. Redis 慢查询是什么?通过什么配置? 7. Redis 的慢查询修复经验有哪些?怎么修复的? 8. 如何优化 Redis 服务的性能? 9. Redis 的主从复制模式有什么优缺点? 10. Redis sentinel(哨兵)模式优缺点有哪些? 11. 如何设置 Redis 的最大连接数?查看 Redis 的最大连接数?查看 Redis 的当前连接数? 12. 介绍一些 Redis 常用的安全设置? 二、Redis 缓存管理与持久化机制 1. Redis 持久化机制有哪些? 2. Redis 持久化机制 AOF 和 RDB 有哪些不同之处? 3. 请介绍一下 RDB 持久化机制的优缺点 4. 请介绍一下 AOF 持久化机制的优缺点 5. 如果 AOF 文件的数据出现异常, Redis 服务怎么处理? 6. 常见的淘汰算法有哪些? 7. Redis 淘汰策略有哪些? 8. Redis 缓存失效策略有哪些? 9. Redis 如何做内存优化? 10. 什么是 bigkey? 有什么影响? 11.

redis 缓存优化

空扰寡人 提交于 2019-12-20 21:03:33
一. 缓存穿透 常见的解决方案有两个 1.数据库不存在的值,在缓存存进一个空值,并添加过期时间。这样的缺点就是会浪费比较多的空间。 2.用布隆过滤器,在访问缓存层和存储层之前,将存在的key用布隆过滤 器提前保存起来,做第一层拦截。如果布隆过滤器判断该key不存在,就不会访问持久层,从而保护了持久层。 二. 热点key重建优化 1.设置分布式锁 2.不设置过期时间 三 雪崩问题 1.服务端降级 2.redis高可用 四.无底洞问题 集群的节点越多,数据越分散。可能会导致一个查询,需要数十个节点的配合,背后可能是数十次网络连接的消耗,大大影响了性能。 解决方案:有四种批量操作方式:串行命令、串行IO、并行IO、hash_tag 来源: CSDN 作者: 码虫码农 链接: https://blog.csdn.net/a6686039/article/details/103602170

基于Zookeeper的分布式锁

梦想的初衷 提交于 2019-12-20 20:22:14
实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开。我们来看下使用Zookeeper如何实现分布式锁。 什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理、分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而且要达到高吞吐、低延迟同时还要保持一致性和可用性,实际上非常困难。因此zookeeper提供了这些功能,开发者在zookeeper之上构建自己的各种分布式系统。 虽然zookeeper的实现比较复杂,但是它提供的模型抽象却是非常简单的。Zookeeper提供一个多层级的节点命名空间(节点称为znode),每个节点都用一个以斜杠(/)分隔的路径表示,而且每个节点都有父节点(根节点除外),非常类似于文件系统。例如,/foo/doo这个表示一个znode,它的父节点为/foo,父父节点为/,而/为根节点没有父节点。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于存放大量的数据,每个节点的存放数据上限为1M。 而为了保证高可用

分布式锁选型背后的架构设计思维【附源码】

℡╲_俬逩灬. 提交于 2019-12-20 09:59:14
1. 分布式锁本质 提到分布式锁,有很多实现,比如Redis分布式锁、ZooKeeper分布式锁、etcd分布式锁等。但是选择哪个更适合你的项目?在《 基于CAP模型设计企业级真正高可用的分布式锁 》一文深入分析过分布式锁的哲学本质,以及如何结合场景来选择合适的分布式锁。分析业务场景,得到业务本质,就是架构思维。思维最终是需要落地的,接下去分享一下对分布式锁的思考和实践。 锁的本质是对共享资源的处理,表现很多,有以下作用: 业务协调 业务幂等(需配合业务代码实现) 共享资源竞争 在单体应用时代表现为同步块lock。随着需求和业务量的增长,系统走向了分布式、微服务时代,多服务和多实例下的应用无法使用本地锁进行控制资源共享。此时就出现了分布式锁,分布式场景下对分布式锁的要求如下: 强一致性 服务高可用、系统稳健 锁自动续约、自动释放 业务可重入 2. 分布式锁存储选型及场景 目前常见分布式锁的实现有Redis、ZooKeeper、etcd等,各维度指标对比如下: 图1 分布式锁存储模型对比 一致性算法(CAP):在分布式场景下,CAP理论是很多架构设计的指导思想。CAP思想下有两个分支CP与AP;CP模型不管什么情况下,都要求各服务之间的数据一致;AP模型高可用下的数据最终一致性。虽然锁原本要求强一致性CP模型,但AP模型分布式锁的使用取决于业务场景对脏数据的最大容忍度,比如SNS场景

网易云课堂(5)网易内部Redis高性能架构分析

旧巷老猫 提交于 2019-12-20 08:47:18
Redis高可用集群实战: map:JVM堆栈 redis:物理内存 之前的5种数据格式(String /hash/ list/ set/ sorted set(Zset)) + 地理位置信息查询等新的数据格式 范围查询:bitmap 地理空间:geospatial 索引半径查询 高级特性: 单副本:1个Redis服务端 多副本:主从模式 高可用:哨兵Sentinel、集群Cluster 没有太多的,做缓存使用 新浪微博:使用Redis量很高。点赞和评论很重要,只要不是大量的丢失就能够接受。 限制Redis性能:CPU、网络 单点故障:缓存击穿和缓存雪崩。 解决方法:数据备份。备份多少合理?比较安全的 备份3份 。主也算1+2=3. 2n+1= 拜占庭问题:实现最少资源的公平选举, 故障数据<存活的节点数据 选举的机制:2n+1. 多副本: 主主不支持备份, 解决方案:将从服务器在主挂掉之后,提升成主服务。(本身不能主动支持,要手动将从----变成主服务) 微博之前发生这种问题,临时性手动解决这种问题。 -------自动? 哨兵模式解决这种问题: 可靠性要求高的场景:分布式锁、 常见架构: 哨兵方式: toC大多数是读多写少的场景。不能够写多。 主挂掉:立即进行选举。TCP/ip心跳实现检查。 服务直接连接哨兵的端口, 1、不用直接连接主Redis节点。 2

分布式锁简单入门以及三种实现方式介绍

南楼画角 提交于 2019-12-20 05:00:52
引自:https://blog.csdn.net/xlgen157387/article/details/79036337 很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的东西也是一样的和Java多线程相关的!做好准备,马上开车! 学过Java多线程的应该都知道什么是锁,没学过的也不用担心,Java中的锁可以简单的理解为多线程情况下访问临界资源的一种线程同步机制。 在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等。 蒙了吗?不要紧!即使你这些都不会也不要紧,因为这个和今天要探讨的关系不大,不过如果你作为一个爱学习的小伙伴,这里也给你准备了一份秘籍:《Java多线程核心技术》,一共19篇祝你一臂之力!免费版的不过瘾,当然也有收费版的! 一、为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理

使用Redisson实现分布式锁,Spring AOP简化之

断了今生、忘了曾经 提交于 2019-12-20 02:59:06
Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。 Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。 关于Redisson更多详细介绍,可参考 Redssion概述 Redisson提供的分布式锁 可重入锁