自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(182)
  • 收藏
  • 关注

原创 从全链路的角度谈一下优化和自己的思考

这是一篇什么文章?本文希望以一个用户请求为线索,将整个用户侧到服务器至存储层整个链路给串起来,从全链路到角度尽可能通俗的谈一谈各个部分的一些优化思路和自己的思考,笔者水平有限,有些思路也还没有经过大流量的检验,对于一些大佬来说可能本文不能让你眼前一亮,在此就可以return了。为什么会写这么一篇文章?先说一说我的情况吧,目前大四在读,通信工程专业,学校算不上很好吧,普通一本罢了,上了大学以来,对计算机就挺感兴趣的,对于本专业的一些课程,像模拟电路,通信原理等提不起太大的兴趣,于是在业余时间,自己学习计

2022-03-26 17:19:45 8011

原创 容器的隔离和限制

容器是怎么隔离的?随着云计算的火爆,近几年说得最多的是什么?无疑是容器和容器编排技术。近几年火热的一些词,比如PasS , SaaS ,Serviceless ,Service Mesh 等等,无一不是和容器有关。下面咱们就来说一说容器到底是怎么隔离的?我们知道程序其实是数据加上代码本身的二进制文件放在磁盘上的,当我们运行一个程序时,它就从磁盘上的二进制文件变成了计算机内存中的数据,寄存器里的值,堆栈信息,被打开的文件以及各种设备状态信息的集合,也就是我们常说的进程。而容器隔离技术,其实就是通过约束

2021-07-23 18:05:03 1187 1

原创 HTTP3 (QUIC) 协议

为什么会有http3?我们知道 http2 已经极大地提高了网络性能,但它还是有问题的。有一个问题是它无论无何也无法解决的,根源在于 http2 是基于 TCP 协议的,也就是说它无法解决TCP层面的弊端!那么TCP层面的弊端是什么呢?队头阻塞。啥?TCP 层面也有队头阻塞吗?不是HTTP队头阻塞吗?没错,为什么这么说呢?因为TCP 协议在处理包时是有严格顺序的,为了保证可靠性,我们知道TCP每发一个包都会等待一个ACK,虽然有累计应答(SACK),但是当连续收到三个相同的 ACK 报文时,会在定时

2021-07-23 12:31:25 1657

原创 ES 是如何写入一条数据的?

ES的前世今生我们都知道elasticsearch 底层是 lucene,那 lucene 是什么呢?lucene 是一种比较先进、功能很强大的搜索库,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。但是如果直接基于 lucene 开发,非常复杂,即便写一些简单的功能,也要写大量的 Java 代码。虽然 elasticsearch 基于 lucene,但是它隐藏了 lucene 的复杂性,提供了简单易用的 restful

2021-07-23 11:41:29 2008 1

原创 ES节点类型

ES节点类型Master节点配置node.master: truenode.data: false默认情况下任何一个集群中的节点都有可能被选为主节点Master节点主要职责创建或删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的,索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点通常是一个比较好的选择。Data节点数据节点由于要存储大量的索引数据,并进行增删改查,一般对机器

2021-07-23 11:04:34 766

原创 从http1.1到http2

前言对于 http 协议大家应该不陌生吧,我们在日常开发中最常打交道的协议也就是它了。关于 http 协议的基本介绍这里就省略了,本文重点讲述 为什么要从 http1.1 到 http2。http1.1大家都知道 http1.1 默认是开启了 Keep-Alive的,这样建立的 TCP 连接,就可以在多次请求中复用。这儿就有一个问题了,http1.1 是请求应答的模型,也就是说发送了一个请求后会等到回复之后才会发送下一个请求,比如请求一个网址的时候通常会请求html,图片,css,js 等大量的

2021-05-18 21:10:25 1345

原创 记一次线上JedisConnectionException

前言在前几天的一个springboot 项目中,使用到了redis 作为缓存,理所当然地使用了连接池,因为频繁的创建和销毁连接实在是太耗费资源了,可是在测试环境下使用是没有问题的,将项目放到了线上后就时不时出现连接的异常,具体异常信息如下:ERROR --- [nio-8080-exec-2] c.l.a.exception.GlobalExceptionHandler : error: org.springframework.data.redis.RedisConnectionFailureEx

2021-05-03 14:40:40 251

原创 不是吧,生产环境下RocketMq还在用默认参数?

生产环境下的架构大家对RocketMq一定不陌生吗?作为阿里开源的久经考验的消息中间件,最近几年也是越来越火热,相信很多公司在消息中间件的选型上都会选择它吧。RocketMQ的消息时延小,吞吐量很高,单机可以达到10万QPS以上,而且可以保证高可用性,性能很高,而且支持通过配置保证数据绝对不丢失,可以部署大规模的集群,还支持各种高级的功能,比如说延迟消息、事务消息、消息回溯、死信队列、消息积压,等等。而且RocketMQ是基于Java开发的,符合国内大多数公司的技术栈,很容易就可以阅读他的源码,甚至是

2021-02-12 10:30:08 1056 1

原创 mysql 压力测试

mysql 版本:5.7linux:centos7压测工具:sysbench安装sysbenchcurl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bashsudo yum -y install sysbenchsysbench --version进入mysql 创建测试数据库,测试用户并授权CREATE DATABASE test_db;CREATE

2021-02-11 13:45:23 1195 2

原创 探秘 Redis 跳跃列表

跳跃列表(skiplist)是一种有序的数据结构,它通过在每个节点维护多个指向其他节点的指针,我们可以平均O(logN) 的时间复杂度快速访问节点,大部分情况下它的性能可以和平衡树相媲美,不过实现起来更为简单。跳跃列表是 Redis 中有序集合的一种实现方式,在有序集合的元素数量较多或者是元素成员长度较长时,Redis 就会使用跳跃列表加字典来存储元素。大家都知道 zset 每一个 value 都有一个 score ,zset 根据每个 value 的 score 将其排序,并且元素不会重复,那么,为了

2021-02-05 18:46:22 118 1

原创 探秘 Redis 快速列表

快速列表(quicklist )是列表(list)的底层实现之一,当列表中元素较少,并且里面的字符串的长度不长时,Redis 使用的压缩列表(ziplist)来存储的,这个大家都知道了哈,然而当列表中的元素越来越多,或者某一个元素的长度太大时就会使用快速列表来存储元素了。这里需要说明的一点是 Redis 早期版本存储列表数据结构使用的是压缩列表 ziplist 和普通的双向链表linkedlist,也就是元素少时用 ziplist,元素多时用 linkedlist,但是这种存储结构,每个节点里面光是两个指

2021-02-05 17:32:30 113

原创 探秘 Redis 整数集合

整数集合(intset)是集合的底层实现之一,当 set 集合容纳的元素都是整数并且元素个数较小时,Redis 会使用 intset 来存储集合元素。intset 是 Redis 用于保存整数值的集合抽象数据结构,它是一种紧凑的数组结构,并且可以保存类型为 int16_t, int32_t 和 int64_t 的整数值,并且集合中不会出现重复的元素。注意:一旦在集合中加入了字符串,集合就会从 intset 变成 hash 结构。intset 定义typedef struct intset {

2021-02-05 16:17:30 115

原创 探秘 Redis 压缩列表

压缩列表,即ziplist,是列表(list),哈希(hash)和有序集合(zset)的底层实现之一,Redis 为了节约内存空间使用,在这些容器对象在元素个数较少的时候,采用压缩列表 (ziplist) 进行存储。list示例:zset示例:hash示例:压缩列表的构成压缩列表是由一系列经过特殊编码的连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。一个压缩列表可以包含任意的多个节点,每个节点可以保存一个字节数组或者整数值。struct ziplist<T> { int3

2021-02-05 15:44:44 107

原创 探秘 Redis 中的字典

字典(dict) 也可称作映射(map),就像 Java 中的 Map ,Python 中的 dict 一样,是一种用于保存键值对(key - value)的抽象数据结构。但是 Redis 所使用的 C 语言并没有内置这种数据结构,所以 Redis 自己实现了字典这个数据结构。字典可以说是 Redis 中出现最为频繁的数据结构了,整个 Redis 数据库就是使用字典来作为底层实现的,Redis 中所有的键值就构成了一个全局的字典,比如我们执行命令:set test_key test_value,就会在这个

2021-02-05 12:54:36 323

原创 Redis字符串底层实现

Redis 中最常用的可能就是字符串了吧,我们通过 set 命令可以存储一个键值到缓存中,key 是一个字符串,value 也是一个字符串,可是你知道 Redis 中的这个字符串的底层结构吗?探秘SDS大家的可能都知道 Redis 是基于 C 语言实现的,但是其实 Redis 并没有直接使用 C 语言里面的字符串,即传统的以空字符(\0)结尾的字符数组,而是字节构建了一种名为 SDS (Simple Dynamic String)的简单动态字符串。Redis 中几乎所有用到字符串的地方都是使用的 SD

2021-02-04 10:26:46 192

原创 mysql 是怎么在磁盘上是存储 NULL 的?

大家知道一般表中char,vachar这些字段都是有值的,那如果某个字段允许为空,且值确实为空,MySql又是怎么处理的呢?是不是直接存储NULL呢?假设这个字段的NULL值我们在磁盘上存储的时候,就是按照“NULL”这么个字符串来存储,是不是很浪费存储空间?因为字符串要占用空间的啊(一个 NULL 字符串要占用四个字符呢),本来他就是个NULL,说明什么值都没有,你还给他存个“NULL”字符串干什么呢?NULL值列表NULL值列表,顾名思义,说的就是你一行数据里可能有的字段值是NULL,比如你的

2021-02-02 22:01:38 1626

原创 你知道 mysql varchar字段是怎么存储的吗?

大家对mysql一定不陌生吧,平时我们使用一些增删改查呀,无非就是对某个数据库的一些表,一些字段进行操作,这些都是抽象的概论,那么你知道对数据页中的每一行数据,他在磁盘上是怎么存储的?其实这里涉及到一个概念,就是行格式。Mysql 目前有4种行格式:Redundant、Compact、Dynamic、Compressed,其中Compact和Dynamic应用较广泛,本文主要介绍Compact格式,Dynamic与Compact行格式很像,差异在于页面溢出的处理上;Compact格式:变长字段(记

2021-02-02 20:58:34 1928 2

原创 一条更新SQL,究竟发生了什么?

缓冲池InnoDB存储引擎中有一个非常重要的放在内存里的组件,就是缓冲池(Buffer Pool),这里面会缓存很多的数据,以便于以后在查询的时候,万一你要是内存缓冲池里有数据,就可以不用去查磁盘了,我们看下图。我们的Java系统对数据库执行的增删改操作,其实主要就是对这个内存数据结构中的缓存数据执行的。配置Buffer Pool大小Buffer Pool本质其实就是数据库的一个内存组件,一片内存数据结构,所以这个内存数据结构肯定是有一定的大小的,不可能是无限大的。Buffer Pool默认情况

2021-01-29 20:06:25 155

原创 你知道一条SQL语句在mysql中如何执行的吗?

数据库连接池我们的系统中每个线程在每次访问数据库的时候,都基于MySQL驱动去创建一个数据库连接,然后执行SQL语句,然后执行完之后再销毁这个数据库连接。大家觉得这样合理吗?可能我们的系统中有成百个线程会并发的频繁创建数据库连接,执行SQL语句,然后频繁的销毁数据库连接,那效率肯定很低下。所以一般我们会使用一个数据库连接池,也就是说在一个池子里维持多个数据库连接,让多个线程使用里面的不同的数据库连接去执行SQL语句,然后执行完SQL语句之后,不要销毁这个数据库连接,而是把连接放回连接池子中,后续还可

2021-01-29 17:57:47 234 4

原创 Springboot 整合Kafka, 如何实现手动提交offset

前言大名鼎鼎的消息中间件Kafka大家一定不陌生吧,使用消息中间件的时候最怕的就是消息丢失了,如何解决这个问题呢?或许大家都知道,消费者端手动提交offset嘛。那么具体代码该怎么写呢?本文就基于springboot来进行消费者手动提交offset的试验。配置application.ymlspring: kafka: # 指定 kafka 地址可以多个 bootstrap-servers: - 192.168.130.128:9092 - 192.168.

2021-01-20 19:33:41 4981 3

原创 瞧瞧Kafka是如何应对百万连接的

最简单的连接,短连接短连接(short connnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接。也就是说,如果一个连接建立之后,然后发送请求,接着就断开,那这个连接维持的时间是很短的,这个就是所谓的短连接。长连接但是短连接有一个很明显的问题,那就是每次发送请求,都必须要建立一个连接,然后再断开连接。我们都知道,网络连接的建立是一个比较耗费资源的过程。那么是不是可以建立好一个连接,然后不停的发送请求过来,系统再

2020-12-26 18:10:06 1774

原创 Kafka 优秀的网络通信的机制

消息生产者与Kafka的交互kafka作为消息中间件,势必会有客户端作为生产者向他发送消息,并且由于他本身是支持分布式的消息存储的,客户端在发送消息到Kafka Broker的时候,会把所有的消息分发到多个 Kafka Broker(partition)上去。此时就会默认情况下走一个负载均衡的策略,举个例子,假设有三个partition ,发送3万条消息,就会给每个Partition分发1万条消息,这样订单数据均匀分散在了3台Broker机器上。频繁网络通信问题好了,现在问题来了,客户端在发送消息

2020-12-25 18:12:35 412 1

原创 分布式服务接口如何实现幂等性

什么是幂等性幂等性:就是用户对于同一操作发起的一次请求,或者多次请求的结果是一致的,多次请求不会影响系统状态。没有幂等性的情况最常见的例子就是支付,比如用户购买商品后进行支付,支付扣款成功,但是返回结果的时候网络异常,用户再次点击按钮,那么此时会进行第二次扣款,返回结果成功,用户查询余额发现扣了两次钱,流水记录也变成了两条。这不是坑爹嘛。又可能用户不知道怎么得对一个订单发起了两次支付请求,但是这两个请求被负载均衡落在不同的机器上,如果没有做分布式幂等性,那么也会扣款两次。如何实现幂等性实现幂

2020-12-25 16:50:30 223

原创 Kafka如何保证消息的顺序性

kafka的Consumer均衡算法在说顺序性这个问题之前,我们要先搞明白的是消费者是怎么消费分区上的数据。我们这里不详细讨论该算法,这不是本文的重点。简单的说:kafka的消费组的组员最多增加到和partition数量一致,超过的组员只会占用资源,而不起作用;kafka的partition的个数一定要大于消费组组员的个数,并且partition的个数对于消费组组员取模一定要为0,不然有些消费者会占用资源却不起作用;我们一般将消费组里组员的个数设置为和partition的数量相同

2020-12-19 19:25:36 4756 3

原创 Kafka如何保证消息的可靠性?

Kafka分布式,高可用存储架构总所周知,Kafka是一个分布式的、可分区的、可复制的消息系统。也就是说一个topic中的消息是放在多个partition上的,可是当一台机器宕机后不就会导致部分消息不可消费吗?所以Kafka还做了多副本冗余,每个Partition都可以搞一个副本放在别的机器上,这样某台机器宕机,只不过是Partition其中一个副本丢失。如果某个Partition有多副本的话,Kafka会选举其中一个Parititon副本作为Leader,然后其他的Partition副本是Follo

2020-12-18 15:29:02 2264 3

原创 Kafka 如何高效地发送消息

看了上一篇文章的同学,肯定都知道了Kafka是如何高效地写入消息的,那么问题来了,它又是如何高效地发送消息给消费者的呢?答案是零拷贝技术。零拷贝技术没错,熟悉java的同学应该都知道Netty也是采用了零拷贝技术吧,Kafka和它是类似的。零拷贝,从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能。那么什么是不需要的拷贝呢?如果Kafka很简单的从磁盘读数据发送给下游的消费者,那么大概过程如下:先看看要读的数据在不在os cache(操作系统缓存)里,如果不在的话就从磁盘文件里

2020-12-18 13:05:09 302

原创 Kafka 如何实现每秒几十万消息的写入?

总所周知,Kafka是高吞吐低延迟的高并发、高性能的分布式消息中间件,它还具有横向扩展,容错等优点,主要用于处理活跃的流式数据,在大数据领域有极为广泛的运用。配置良好的Kafka集群甚至可以做到每秒几十万、上百万的超高并发写入。Kafka为什么这么快?大家都知道Kafka会把收到的消息都写入到硬盘中。那么问题来了?写磁盘速度难道会快吗?这是作弊啊?没错,Kafka就是作弊了。。。。为了优化写入速度Kafak采用了两个技术,顺序写入和MMAP。顺序写磁盘也就是说,Kafka仅仅将数据追加到文件的末尾

2020-12-18 12:06:50 662

原创 MySQL 主从复制原理

什么是mysql的主从复制?MySQL 主从复制指的是数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。这里所说的数据可以是主数据库中的所有数据库或者特定的数据库,或者特定的表。MySQL 主从复制原理主库将数据变更写入二进制 binlog 日志。从库连接到主库之后,从库有一个 IO 线程,将主库的二进制 binlog 日志拷贝到自己本地,写入 relay 中继日志中。接着从库中有一个 SQL 线程会从 relay 中继日志读取 binlog,然后执行 binlog 日志中的内容

2020-12-17 22:06:12 83 1

原创 redis企业级持久化方案

企业级的持久化的配置策略redis.conf:save 60 1000:每隔60秒如果有1000个更新则保存一份RDB,如果你希望尽可能确保说,RDB最多丢1分钟的数据,那么尽量就是每隔1分钟都生成一个快照,1000这个数字根据你自己的应用和业务的数据量,你自己去决定AOF一定要打开appendonly yes : 打开AOFappendfsync everysec :每隔一秒将AOF刷到磁盘上auto-aof-rewrite-percentage 100: 当前AOF大小膨胀到超过上次100%

2020-12-10 21:27:45 176

原创 Redis 并发竞争解决方案

什么是 redis 的并发竞争?所谓redis 的并发竞争,通俗地说就是多客户端同时并发写一个 key,可能本来应该后修改的数据先修改到了,导致数据的版本错乱,或者是多客户端同时获取一个 key,修改值之后再写回去,只要顺序错了,数据就错了。举一个栗子多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,那么最后的值应该是4,但是实际修改顺序却变成了4,3,2,那么最后的值就变成了2。解决方案方案1可以使用独占锁的方式,类似操作系统的mutex机制。不过独占锁性能消耗较高

2020-12-10 21:02:38 400

原创 缓存击穿及其解决方案

缓存击穿是什么?缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发请求的用户特别多(就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况),当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞,引起数据库压力瞬间增大,造成过大压力。解决方式可以将热点数据设置为永远不过期;基于 redis 或者 zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。

2020-12-07 22:17:40 1541

原创 缓存穿透及其解决方案

缓存穿透描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时候这个请求就穿透了nginx,redis和mysql,导致每次这种请求都会打入数据库,这时的请求发起者很可能是攻击者,这种大量的不存在的请求会导致数据库压力过大。解决方案:缓存穿透的解决方案,其实非常的简单,就是说每次如果从源服务(商品服务)查询到的数据是空,就说明这个数据根本就不存在,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,

2020-12-07 22:09:30 518

原创 缓存雪崩问题及其解决方案

什么是缓存雪崩描述:缓存雪崩一般是指,缓存层(例如redis集群)出现了异常,不能正常工作了。于是所有的请求都会达到存储层(数据库层),存储层的QPS会暴增,出现大量请求压垮存储层的情况。当然如果缓存设置了过期时间,导致大量数据同时过期,进而大量请求打入数据库中,引起数据库压力过大甚至宕机。对于这种情况我们可以将缓存数据的过期时间设置随机或者设置缓存永不过期。然后实际上可能redis集群出现了崩溃,导致缓存不可用,那么此时可能会导致以下问题:缓存服务大量对redis的请求被hang住,占用资源

2020-12-07 21:49:48 716

原创 提高nginx缓存命中率

nginx缓存命中率低的原因?实际生产中,我们通常会部署nginx集群来做负载均衡,每个nginx里面都会放一些缓存来为redis集群减少压力,但在默认情况下,此时缓存命中率是比较低的。如何提升缓存命中率分发层+应用层,双层nginx分发层nginx,负责流量分发的逻辑和策略,这个里面它可以根据你自己定义的一些规则,比如根据productId去进行hash,然后对后端的nginx数量取模将某一个商品的访问的请求,就固定路由到一个nginx后端服务器上去,保证说只会从redis中获取一次缓存数

2020-12-07 21:02:36 271 1

原创 高并发下数据库与缓存双写不一致解决方案

为什么会出现数据库与缓存不一致?缓存作为抵挡前端访问洪峰的工具,用的好的话可以大大减轻服务端压力。我们知道缓存中的数据来源是数据库,如果数据库的数据发生了改变怎么办呢?难道直接去修改缓存吗?最经典的缓存+数据库读写的模式,cache aside pattern为什么是删除缓存,而不是更新缓存呢?原因很简单,在复杂一点的缓存场景,缓存往往不是简单从数据库中直接取出来的值。比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。另外更新缓存

2020-12-05 17:20:19 401

原创 Redis 6.0 新特性----多线程来了

5 月 2 日Redis 6.0正式发布了。这个版本提供了诸多新特性及功能改进,比如新网络协议RESP3,新的集群代理,ACL等,本文围绕其中关注度最高的“多线程的引入”来说明。Redis6.0之前的版本真的是单线程吗?Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。但如果严格来讲从Redis4.0之后并不是单线程,除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无

2020-11-27 13:31:23 165

原创 zookeeper实现分布式锁 (基于临时顺序节点)

大致思想为:每个客户端在尝试获取锁时,会在 zookeeper 上生成一个唯一的临时有序节点。 判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。 当释放锁的时候,只需将这个临时节点删除即可。而其余没有获取到锁的客户端只需要监听它的前一个节点即可。这就避免了惊群效应。java客户端实现依赖<dependencies> <dependency> <groupId>org.apache.zookeeper</

2020-11-26 17:08:59 631 1

原创 zookeeper实现分布式锁 (基于临时节点)

zk 分布式锁是基于watch机制实现的。其中一种比较简单的思路:就是某个客户端尝试创建临时 znode,此时创建成功了就获取了这个锁;这个时候别的客户端来创建锁会失败,只能注册个监听器监听这个锁。释放锁就是删除这个 znode,一旦释放掉就会通知客户端,然后有一个等待着的客户端就可以再次重新加锁。java实现依赖<dependencies> <dependency> <groupId>org.apache.zookeepe

2020-11-26 17:01:07 497

原创 zookeeper 简介和其应用场景

Zookeeper 简介ZooKeeper 是一个开源的分布式框架,提供了协调分布式应用的基本服务。它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度。它是 Google 的 Chubby 一个开源的实现。它本身可以搭建成一个集群,这个 zk 集群用来对应用程序集群进行管理,监视应用程序集群中各个节点的状态,并根据应用程序集群中

2020-11-26 16:38:30 200

原创 redis 的持久化方式

问题Redis的数据都缓存在内存中,如果没有配置持久化, redis 宕机了再重启,内存里的数据就全部都弄丢了啊。于是需要开启redis的持久化功能,将数据写入内存的同时,异步的慢慢的将数据写入磁盘文件里,进行持久化。当redis 宕机重启,会自动从磁盘上加载之前持久化的一些数据,也许会丢失少许数据,但是至少不会将所有数据都弄丢。可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(ap

2020-11-26 14:47:35 77

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除