自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式_自定义Spring框架(IOC)

首先我们有一个 BeanFactory 顶级父接口,定义统一的规范;然后我们再搞一个 ApplicationContext 接口继承 BeanFactory,目的就是为了实现非延时加载 BD 对象;然后创建一个 AbstractApplicationContext 子实现类它主要实现非延加载时的功能,也就是 refresh() 方法,它调用了 XmlBeanDefinitionReader#loadBeanDefinitions 方法,这个方法可以加载并解析 xml 文件,将所有 bean 标签封装为

2023-01-23 12:22:02 1140

原创 设计模式_行为型模式 -《迭代器模式》

迭代器模式 (Iterator Pattern) 主要包含以下角色:抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(Concrete Aggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。具体迭代器(Concrete lterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

2023-01-22 13:08:47 1334

原创 设计模式_行为型模式 -《观察者模式》

观察者模式 (Observer Pattern) 中有如下角色:Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。

2023-01-20 11:04:57 1316

原创 设计模式_行为型模式 -《责任链模式》

责任链模式 (Chain of Responsibility Pattern) 主要包含以下角色:抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接(下一个对象的引用)。具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。现需要开发一个请假流程控制系统。请假

2023-01-19 11:33:00 1428

原创 设计模式_行为型模式 -《策略模式》

策略模式 (Strategy Pattern) 的主要角色如下:抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。环境(Context)类:持有一个策略类的引用,最终给客户端调用。【例】促销活动一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。类图如下:

2023-01-18 12:15:24 417

原创 设计模式_行为型模式 -《模板方法模式》

模板方法模式 (Template Method Pattern) 包含以下主要角色:抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method):一个抽象方法由抽象类声明、由其具体子类实现。具体方法(Concrete Method):一个具体方法由一个抽象类或具体类声明

2023-01-17 11:57:09 312

原创 设计模式_结构型模式 -《装饰器模式》

装饰器模式 (Decorator Pattern) 中的角色:抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰(Decorator)角色:继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。这个角色就是装饰者。具体装饰(Concrete Decorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

2023-01-16 10:57:08 291

原创 设计模式_结构型模式 -《适配器模式》

适配器模式 (Adapter Pattern) 包含以下主要角色:目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。【例】读卡器现有一台电脑只能读取 SD 卡,而要读取 TF 卡中的

2023-01-15 14:35:39 351

原创 设计模式_结构型模式 -《代理模式》

代理模式 (Proxy Pattern) :由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。Java 中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成而动态代理代理类则是在 Java 运行时动态生成。动态代理又有:JDK 代理CGLib 代理代理(Proxy)模式分为三种角色:抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。

2023-01-14 13:38:48 380

原创 设计模式_创建型模式 -《建造者模式》

建造者模式 (Builder Pattern) 包含如下角色:抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。 具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。 产品类(Produc* 产品类(Product):要创建的复杂对象。* 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责

2023-01-13 10:25:26 183

原创 设计模式_创建型模式 -《原型模式》

原型模式 (Prototype Pattern) :用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。结构原型模式包含如下角色:抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。访问类:使用具体原型类中的 clone() 方法来复制新的对象。原型模式的克隆分为浅克隆和深克隆。浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象

2023-01-12 14:16:38 293

原创 设计模式_创建型模式 -《工厂模式》

在 java 中,万物皆对象,这些对象都需要创建,如果创建的时候直接 new 该对象,就会对该对象耦合严重,假如我们要更换对象,所有 new 对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式 (Factory Pattern) 最大的优点就是:解耦。在本教程中会介绍三种工厂的使用:简单工厂模式(不属于 GOF 的 23 种经典设计模式)

2023-01-11 11:12:48 147

原创 设计模式_创建型模式 -《单例模式》

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。单例模式 (Singleton Pattern) 是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式的主要有以下角色:单例类:只能创建一个实例的

2023-01-10 11:43:50 59

原创 线程池 - ThreadPoolExecutor 详解

线程池:一个容纳多个线程的容器,容器中的线程可以重复使用,省去了频繁创建和销毁线程对象的操作。降低资源消耗,减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。提高响应速度,当任务到达时,如果有线程可以直接用,不会出现系统僵死。提高线程的可管理性,如果无限制的创建线程,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程复用,同一个线程可以被重复使用,来处理多个任务。池化技术 (Pool) :一种编程技巧,核心思想是资源复用,在请求量大时能优化应用

2023-01-08 20:21:56 387

原创 ConcurrentSkipListMap-跳跃表 源码解析

跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。最底层的节点,每一个都是 Node 节点,按照 key 升序排序。而上方具有等级的节点,是索引节点,上图的跳跃表是具有 3 层索引的跳跃表,第一层 level-1 的索引密度最大,第二层 level-2 是对一层索引的索引,第三层 level

2022-12-28 12:53:43 437

原创 Redis原理篇—内存回收

内存过期策略-过期key处理Redis 之所以性能强,最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能。我们可以通过修改配置文件来设置 Redis 的最大内存当内存使用达到上限时,就无法存储更多数据了。为了解决这个问题,Redis 提供了一些策略实现内存回收:内存过期策略内存淘汰策略在学习 Redis 缓存的时候我们说过,可以通过 expire 命令给 Redis 的 key 设置 TTL(存活时间)可以发现,当 key 的 TTL

2022-12-27 10:37:25 620

原创 Redis原理篇—通信协议

RESP协议Redis 是一个 CS 架构的软件,通信一般分两步(不包括 pipeline 和 PubSub):客户端(client)向服务端(server)发送一条命令服务端解析并执行命令,返回响应结果给客户端因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。而在 Redis 中采用的是 RESP(Redis Serialization Protocol)协议:Redis 1.2 版本引入了 RESP 协议Redis 2.0 版本中成为与 Redis

2022-12-26 12:33:52 343

原创 Redis原理篇—网络模型

用户空间和内核态空间服务器大多都采用 Linux 系统,这里我们以 Linux 为例来讲解:ubuntu 和 Centos 都是 Linux 的发行版,发行版可以看成对 Linux 包了一层壳,任何 Linux 发行版,其系统内核都是 Linux。我们的应用都需要通过 Linux 内核与硬件交互。用户的应用,比如 redis,mysql 等其实是没有办法去执行访问我们操作系统的硬件的,所以我们可以通过发行版的这个壳子去访问内核,再通过内核去访问计算机硬件。计算机硬件包括,如 cpu,内存,网卡等等

2022-12-25 12:55:14 795

原创 Redis原理篇—数据结构

底层数据结构动态字符串SDS我们都知道 Redis 中保存的 Key 是字符串,value 往往是字符串或者字符串的集合。可见字符串是 Redis 中最常用的一种数据结构。不过 Redis 没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:获取字符串长度的需要通过运算非二进制安全不可修改Redis 构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称 SDS。例如,我们执行命令:那么 Redis 将在底层创建两个 SDS,其中一个是包含

2022-12-24 15:45:51 414

原创 Redis高级篇之最佳实践

Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。

2022-12-23 11:59:32 805

原创 消息队列—RabbitMQ(万字详解)

在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出来的商品价格同步更新呢?同步调用➢ A服务调用B服务,需要等待B服务执行完毕的返回值,A服务才可以继续往下执行。和RPC(Dubbo)实现同步调用。异步调用➢ A服务调用B服务,而无需等待B服务的执行结果,也就是说在B服务执行的同时A服务可以继续往下执行。➢ 通过:消息队列实现异步调用。MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通

2022-12-22 12:07:39 857

原创 WeakHashMap源码解析

WeakHashMap 是一种 弱引用 map,内部的 key 会存储为弱引用,当 jvm gc 的时候,如果这些 key 没有强引用存在的话,会被 gc 回收掉,下一次当我们操作 map 的时候会把对应的 Entry 整个删除掉,基于这种特性,WeakHashMap 特别适用于 缓存 处理。WeakHashMap 因为 gc 的时候会把没有强引用的 key 回收掉,所以注定了它里面的元素不会太多,因此也就不需要像 HashMap 那样元素多的时候转化为红黑树来处理了。因此,WeakHashMap 的

2022-12-21 11:34:23 267

原创 LinkedHashSet源码解析

上一节我们说 HashSet 中的元素是无序的,那么有没有什么办法保证 Set 中的元素是有序的呢?答案是当然可以。我们今天的主角 LinkedHashSet 就有这个功能,它是怎么实现有序的呢?让我们来一起学习吧。如果你已看过前面关于 HashSet 和 HashMap,一定能够想到本文将要讲解的 LinkedHashSet 和 LinkedHashMap 其实也是一回事,前者仅仅是对后者做了一层包装,也就是说 LinkedHashSet 里面有一个 LinkedHashMap(适配器模式)。

2022-12-20 15:00:25 247

原创 LinkedHashMap源码解析

LinkedHashMap 继承于 HashMap,其内部的 Entry 多了两个前驱、后继指针,内部额外维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现 LRU 缓存策略。LinkedHashMap 实现了 Map 接口,即允许放入 key 为 null 的元素,也允许插入 value 为 null 的元素。LinkedHashMap 可以看成是 LinkedList + HashMap,从名字上可以看出该容器是 LinkedList 和 HashMap 的混合体,

2022-12-19 13:48:21 244

原创 HashTable源码解析

HashTable 是一个古老的(JDK1.0 时就已存在)线程安全的容器,其核心方法都是 synchronized 修饰的。相反 HashMap 不是线程安全的。从图中可以对比得出,二者都是源于 Map 接口,都实现了 Cloneable 和 Serializable接口,二者都可以克隆和序列化。但 HashMap 的父类是 AbstractMap,HashTable父类是 Dictionary。Dictionary 类是一个已经被废弃的类(见其源码中的注释)。父类被废弃,自然其子类 Has

2022-12-18 12:14:16 297

原创 HashSet源码解析

HashSet 是 Set 的一种实现方式,底层主要使用 HashMap 来确保元素不重复。对于 HashSet 和 HashMap,前者仅仅是对后者做了一层包装,也就是说 HashSet 里面有一个 HashMap(适配器模式)。HashSet 保证元素不重复的关键就在于这个 add() 方法;在 HashMap 中如果插入元素的 key 与当前桶位的 key 完全一致,则会认为这是一次替换操作,更新键值对的 value 值;而对于 HashSet 的实现,添加相同的 key 时,利用是否存

2022-12-17 13:40:16 437

原创 HashMap源码解析

jdk1.8之前,由 数组+链表 组成。jdk1.8开始,由 数组+链表+红黑树 组成。HashMap 的默认初始容量为 16(1 左移 4位),默认装载因子为 0.75f,容量总是 2 的 n 次方;HashMap 扩容时每次容量变为原来的两倍;当桶的数量小于 64 时不会进行树化,只会扩容;当桶的数量大于 64 且单个桶中元素的数量大于 8 时,进行树化;当单个桶中元素数量小于 6 时,进行反树化;HashMap 是非线程安全的容器;HashMap 查找添加元素的时间复杂度都为 O(1);

2022-12-16 13:36:43 562

原创 Stack源码解析

Stack 是 Vector 的子类,也是一个线程安全的容器(方法上都加了synchronized),从名字上可以看出,其是一个栈结构。// 继承于Vectorpublic class Stack extends Vector {Stack 这个类实现的非常简单,因为栈的结构本身就非常简单,所以这个类甚至都没有属性。Java 里有一个叫做 Stack 的类 ,却没有叫做 Queue 的类(它是个接口名字),但是 Stack 继承自 Vector,方法都是同步的,一般不使用。当需要使

2022-12-15 10:43:23 14

原创 Vector源码解析

Vector 是一个古老的 线程安全(内部的核心方法都加了synchronized) 的容器,在 JDK1.0 时就已经存在,到如今已经很少使用。基本结构与 ArrayList 类似,可以认为是线程安全版本的 ArrayList,但因为 Vector 效率低下,所以在多线程下使用的基本都是 CopyOnWriteArrayList,其效率更高。Vector 实现了 List 接口,是顺序容器,即元素存存放的数据与放进去的顺序相同,允许存入 null 元素。底层通过数组实现。Vector 继承了 Abs

2022-12-14 11:19:55 278

原创 ArrayDeque源码解析

双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列。ArrayDeque 是一种以数组方式实现的双端队列,它是非线程安全的。由其名字可以看出,其是一个由数组实现的双端队列,对比 LinkedList 是由链表实现的双端队列。(1)ArrayDeque 是采用数组方式实现的双端队列;(2)ArrayDeque 的出队入队是通过头尾指针循环利用数组实现的;(3)ArrayDeque 容量不足时是会扩容的,每次扩容容量增加 1 倍;(4)ArrayDeque 可以直接作为栈使用;

2022-12-13 09:55:03 255

原创 LinkedList源码解析

LinkedList 是一个双向链表(内部是 Node 节点)实现的 List,并且还实现了 Deque 接口,它除了作为 List 使用,还可以作为队列或者栈来使用。这样看来,LinkedList 简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用 LinkedList,一方面是因为 Java 官方已经声明不建议使用 Stack 类,更遗憾的是,Java 里根本没有一个叫做 Queue 的类(它是个接口名字)。关于栈或队列,现在的首选是 ArrayDeque,它有着比 LinkedList

2022-12-12 10:39:28 303

原创 CopyOnWriteArrayList源码解析

我们知道 ArrayList 是线程不安全的,其存在一个古老的线程安全的 Vector,但是由于 Vector 效率太低 (方法都加了synchronzed),在 JDK1.5 时 Doug Lea 提供了一个效率较高的线程安全的 CopyOnWriteArrayList,其实现了阻塞写操作而不阻塞读操作,写时拷贝原数组写完替换原数组,实现了读写分离。CopyOnWriteArrayList 实现了 List,RandomAccess,Cloneable,java.io.Serializable 等接口。

2022-12-11 13:46:04 199

原创 ArrayList源码解析

简介ArrayList 是一种以数组实现的 List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。ArrayList 线程不安全,除该类未实现同步外,其余跟 Vector 大致相同。Java 泛型只是编译器提供的语法糖,所以这里的数组是一个 Object 数组,以便能够容纳任何类型的对象。ArrayList 实现了 List,RandomAccess,Cloneable,java.io.Serializable 等接口。ArrayList 实现了 List,提供了基础的添加、删除、

2022-12-10 10:41:21 381

原创 「Redis」10 三大缓存问题、分布式锁

1. 三大缓存缓存穿透问题描述key 对应的数据在数据源并不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户 id 获取用户信息,不论缓存还是数据库都没有,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。若黑客利用此漏洞进行攻击可能压垮数据库。通俗理解指查询一个不存在的key,但是 redis 没有将 null 值写入缓存,导致所有的请求全去查询数据库,大量请求进

2022-12-09 11:50:22 332

原创 「Redis」09 集群

1. 概述问题容量不够,redis 如何进行扩容?并发写操作,redis 如何分摊?主从模式,薪火相传模式,主机宕机,导致 ip 地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。解决方法代理主机(之前)无中心化集群配置(redis3.0)任何一台服务器都可以作为集群的入口,它们之间可以互相连通。什么是集群Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 Redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N 。

2022-12-08 10:39:27 17

原创 「Redis」08 主从复制

主机数据更新后根据配置和策略, 自动同步到备机的机制,Master以写为主,Slaver以读为主。主从复制的好处读写分离,性能扩展容灾快速恢复反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。Sentinel哨兵主要用来监控redis主从集群,提高了redis主从集群的可用性。哨兵机制解决了主从复制架构中的主节点宕掉后从节点无法作为主节点对外服务的问题Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例 组成的。

2022-12-07 11:39:39 340

原创 「Redis」07 持久化操作(RDB、AOF)

以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,如果Redis重启就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。AOF持久化流程客户端的请求写命令会被append追加到AOF缓冲区内;AOF缓冲区根据AOF持久化策略将操作sync同步到磁盘的AOF文件中;AOF文件大小超过重写策略或手动重写时,会对AOF文件Rewrite重写,压缩AOF文件容量;

2022-12-06 10:26:19 328

原创 「Redis」06 事务与锁机制

1. Redis的事务定义Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。注意:Redis 的事务与 MySQL 的事务不同Redis 事务的主要作用就是串联多个命令防止别的命令插队。2. 事务基本命令 (Multi、Exec、Discard)从输入 Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入 Exec 后,Redis 会将之前的命令队列中的命令依次执行。组队的过程中可以

2022-12-05 11:51:24 116

原创 「Redis」05 Jedis操作Redis

即通过 Java 操作 Redis。1. Jedis基本操作Ⅰ. 测试连接连接Redis注意事项禁用Linux的防火墙:Linux(CentOS7)里执行命令:systemctl stop/disable firewalld.serviceredis.conf中注释掉bind 127.0.0.1,然后 protected-mode no引入依赖测试连接如果Redis安装在云服务器中,注意配置服务器的防护墙安全组。控制台打印:PONG说明连接成功。Ⅱ. 操作 RedisKey

2022-12-04 12:02:37 235

原创 「Redis」04 发布和订阅

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。客户端可以订阅频道当给这个频道发布消息后,消息就会发送给订阅的客户端。发布订阅命令行实现打开一个客户端订阅 channel1SUBSCRIBE channel1打开另一个客户端,给 channel1 发布消息 hellopublish channel1 hello返回的 1 是订阅者数量。打开第一个客户端可以看到发送的消息注:发布的消息没有持久

2022-12-03 13:39:12 572

空空如也

空空如也

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

TA关注的人

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