多级缓存
参考视频非原创!!! 介绍多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能: JVM进程缓存本地进程缓存 缓存在日常开发中起着至关重要的作用,由于是储存在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。 我们把缓存分为两类: 分布式缓存,例如Redis: 优点:储存容量更大、可靠性更好、可以在集群间共享 缺点:访问缓存有网络开销 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享 进程本地缓存,例如HashMap、GuavaCache: 优点:读取本地内存,没有网络开销,速度更快 缺点:储存容量有限、可靠性较低、无法共享 场景:性能要求较高,缓存数据量较小 了解CaffeineCaffeine是基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。GitHub仓库:caffeine-可以在wiki界面中查阅官方文档缓存使用的基本API: 12345678910111213141516171819202122@Testvoid testBasicOps() { //...
Docker使用
视频参考:https://www.bilibili.com/video/BV1THKyzBER6/文章参考:https://www.runoob.com/docker/docker-tutorial.html Docker的核心概念Docker就是用容器化技术给应用程序封装独立的运行环境,而每一个运行环境就是一个容器 优点: 更轻,更小,启动快:Docker容器之间共用同一个系统内核,区别于虚拟机每一个系统都包含一个自己的操作系统的完整内核 核心概念: 宿主机:运行容器的计算机被称为宿主机 镜像:镜像就是软件安装包,而容器就是安装出来的软件 镜像仓库(Docker Registry):就是用来存放分享的镜像的地方,分享上来的镜像其他人就可以下载使用Docker的官方仓库:Docker Hub 安装DockerUbuntu下安装docker 第一步: 1curl -fsSL https://get.docker.com -o install-docker.sh 第二步: 1sudo sh install-docker.sh Windows下安装docker 搜索Wi...
设计模式
参考文章23种设计模式(Java版,超详细!),菜鸟教程-设计模式 设计模式介绍设计模式的优点 提供了一种共享的设计词汇和概念,使开发人员能够更好地沟通和理解彼此的设计意图。 提供了经过验证的解决方案,可以提高软件的可维护性、可复用性和灵活性。 促进了代码的重用,避免了重复的设计和实现。 通过遵循设计模式,可以减少系统中的错误和问题,提高代码质量。 设计模式六大原则 开闭原则(Open Close Principle): 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 里氏代换原则(Liskov Substitution Principle): 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上...
Redission
参考Redisson-分布式锁 问题分析在集群模式下或者分布式的系统下,存在多个JVM,不同JVM之间用的是不同的锁监视器,也就意味着可能产生并行而锁不生效的问题,也就导致了线程并发安全问题,为此就需要一种锁监视器,可以让不同的JVM之间使用,也就需要分布式锁 基本原理 什么是分布式锁:满足分布式系统或者集群模式下多进程可见并互斥的锁 特点: 多进程可见 互斥 高可用 高性能(高并发) 安全性 分布式锁的实现(常见) redis常见的实现之一就是通过Redisson Redisson快速开始 引入依赖: 12345<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.2</version></dependency> 配置Redission客户端: 123456789101112@Configurationpublic...
强、软、弱、虚引用
参考文章强、软、弱、虚引用的区别和使用文章的引用介绍也是由强到弱 强引用(StrongReference) 强引用在 java.lang.ref 中并没有实际的对应类型,但我们程序中几乎所有的引用使用的都是强引用。 强引用有如下特点: 强引用可以直接访问目标对象 强引用(存在)指向的对象任何时候都不会被回收,JVM宁愿抛出OOM异常,也不会回收。 强引用可能会导致内存泄漏 注意: 为了尽量避免内存不足的情况,我们可以在变量使用后通过显示的将变量置为null,来加速对象的回收。 区分: 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory. 内存泄漏(memory leak) 是指 程序申请内存后,无法释放已申请的内存空间,这样的泄漏积少成多,memory leak 会导致 out of memory . 软引用(SoftReference)软引用对应的类为java.lang.ref.SoftReference, 一个软引用中的对象,不会很快被JVM回收,JVM会根据当前堆的使用情况来判断何时回收,当...
缓存问题
视频参考黑马的Redis教程 缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库 如果放任这种请求不断访问,就很容易搞垮数据库T_T,于是有了两种常见的解决方案 缓存空对象 思路:缓存空对象到Redis中,这样下次再请求就不会到达数据库 优点: 实现简单,维护方便 缺点: 额外的内存消耗 可能造成短期的不一致 常见的解决办法就是为null设置TTL(有效时间),避免存太多了null垃圾 业务中实现流程: 在数据库查询为空的时候向Redis添加空值,并设置TTL 向Redis请求时对空值做判断 布隆过滤 思路:在客户端与Redis之间再加入一层布隆过滤器,如果不存在数据,直接拒绝请求返回,有才继续 布隆过滤器:基于某种哈希算法去计算出数据对应的hash值,再转换为二进制保存到布隆过滤器中 所以布隆过滤器可以看作一个二进制的数组,而布隆过滤实际是一种算法 优点: 内存占用较少,没有多余的key 缺点: 实现复杂 存在误判的可能 这里可以看出布隆过滤器借助了哈希,也就意味着不存在时真不存在,但布...
MobaXterm连接教程
前言使用的版本是Ubuntu22.04,目前只在连接虚拟机尝试成功过,如有问题欢迎指正 前置条件 安装好MobaXterm官网下载 在Ubuntu中安装好ssh服务 1sudo apt install openssh-server 通过hostname -I可以获取到自己的ip地址 开始连接 打开MobaXterm的左上角的Session 选择SSH连接 在Remote host上填写你上面获得的ip地址 在Spercify username勾选,然后写上你Ubuntu的用户名 点击OK,输入密码就可以成功连接了 这里端口默认就行,除非被占用
乐观锁、悲观锁
相关文章参考: 面试官灵魂4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点? 乐观锁和悲观锁详解 概念乐观锁乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。 乐观锁本身不会上锁。但是可以与加锁操作合作实现一些业务需求 悲观锁悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。 实现悲观锁的实现像 Java 中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 12345678910111213public void performSynchronisedTask() { synchronized (this) { // 需要同步的操作 }}private Lock lock = new R...
正则表达式
匹配规则 注意正则表达式在Java代码中也是一个字符串,所以,对于正则表达式a&c来说,对应的Java字符串是”a\&c”,因为\也是Java字符串的转义字符,两个\实际上表示的是一个\ 单个字符的匹配规则如下:多个字符的匹配规则如下: 复杂匹配规则 分组匹配String.matches()正则表达式用(…)分组可以通过Matcher对象快速提取子串: group(0)表示匹配的整个字符串; group(1)表示第1个子串,group(2)表示第2个子串,以此类推。eg: 12345678910111213141516import java.util.regex.*;public class Main { public static void main(String[] args) { Pattern p = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})"); Matcher m = p.matcher(&qu...
SpringMVC
封面图片来源文章参考视频参考 概述MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。SpringMVC可以帮助我们进行更简洁的Web层的开发,并且它天生与 Spring 框架集成。SpringMVC下我们一般把后端项目分为 Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面). SpringMVC的核心组件 DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应 HandlerMapping:处理器映射器,根据URL去匹配查找能处理的Handler,并会将请求涉及到的拦截器和 Handler 一起封装。 HandlerAdapter:处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler; Handler:请求处理器,处理实际请求的处理器。 ViewResolver:视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 Dispatche...
Redis入门
Redis官方文档 在开始之前NoSQL-非关系型数据库特点 结构-非结构化 键值(Redis) 文档(MongoDB) 图(Neo4j) 列(HBase) 关联-无关联的 查询-非SQL 1SELECT id,name age FROM tb_user WHERE id =1 非SQL-不统一的语法 1get user: 1 1db.users.find({_id: 1}) 事务-BASE-相对于SQL的ACID(原子性,一致性,隔离性,持久性) 存储-内存 SQL为磁盘存储 扩展性- 水平 SQL为垂直 使用场景 数据结构不固定 对一致性、安全性要求不高 对性能要求高的时候 Redis介绍和Redis的安装Redis的特征 键值型 单线程(核心),每个命令具备原子性 低延迟,速度快(基于内存、IO多路复用、良好的编码) 支持数据持久化 支持主从集群、分片集群 支持多语言客户端 Redis的安装 Ubuntu 下安装 参考文章戳我跳转 Redis的启动我觉得最舒服的还是service 1service redis-ser...
跨域认证
参考视频 Session认证提要互联网用户认证的一般流程: 用户向服务器发送用户名和密码 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登陆时间等。 服务器向用户返回一个session_id,写入用户的Cookie 用户随后的每一次请求,都会通过Cookie,将session_id传回服务器 服务器收到session_id,找到前期保存的数据,由此得知用户的身份 Session的问题与解决方案session认证扩展性不好,如果是服务器集群,或者是跨域的武器导向架构,就要求session数据共享,每台服务器都能够读取session,针对这种问题一般有两种方案: session数据持久化,写入数据库或者别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大 服务器不再保存session数据,所有数据都保存在客户端,每次请求都发回服务器。Token认证就是这种方案的代表 Token认证是服务器产生的一串字符串,是客户端访问资源接口(API)时所需要的资源凭证,流程如下: 客户端使用用户名跟密码请求登...












