<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_52462015的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_52462015</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_52462015]]></copyright><item><title><![CDATA[什么是 RBAC 模型？]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/122224362</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/122224362</guid><author>m0_52462015</author><pubDate>Wed, 29 Dec 2021 20:48:59 +0800</pubDate><description><![CDATA[前言
RBAC（Role-Based Access Control），基于角色的访问控制，现在主流的权限管理系统的权限设计都是 RBAC 模型，或者是 RBAC 模型的变形。
我们需要思考一个问题：为什么要做权限的管理？
我的理解是在每一个系统中，每个用户所拥有的权限是不一样的，例如一个数据表，管理员可以修改、增加、查看等操作，而普通用户只能查看。所以如何进行用户权限的设计，就是我们需要考虑的问题了。

RBAC 模型是什么
RBAC（Role-Based Access Control），基于角色的访问控制]]></description><category></category></item><item><title><![CDATA[Java 实现 LRU 算法]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/122203650</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/122203650</guid><author>m0_52462015</author><pubDate>Tue, 28 Dec 2021 21:48:55 +0800</pubDate><description><![CDATA[力扣题目：146. LRU 缓存
LRU 是什么？
最近最少使用算法。一个队列，将最近使用的元素放到队列的头部，当队列长度不够时，移除队列的最后一个元素，也就是最近最少使用的元素。

解法 1：继承 LinkedHashMap
投机取巧解法（最好还是自己实现），利用 Java 的 LinkedHashMap 已经实现好的方法，所以直接继承 LinkedHashMap 为父类即可。
有兴趣可以自己阅读 LinkedHashMap 源码。重点关注这三个方法：

afterNodeAccess()：访问元素之后，]]></description><category></category></item><item><title><![CDATA[《MySQL 实战 45 讲》学习笔记 （2）-- 极客时间]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121939291</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121939291</guid><author>m0_52462015</author><pubDate>Tue, 14 Dec 2021 20:54:34 +0800</pubDate><description><![CDATA[08 | 事务到底是隔离的还是不隔离的？
如果是可重复读隔离级别，事务 T 启动的时候会创建一个视图 read-view（一致性视图），之后事务 T 执行期间，即使有其他事务修改了数据，事务 T 看到的仍然跟在启动时看到的一样。也就是说，一个在可重复读隔离级别下执行的事务，好像与世无争，不受外界影响。
假如一个事务要更新一行，如果刚好有另外一个事务拥有这一行的行锁，它又不能这么超然了，会被锁住，进入等待状态。问题是，既然进入了等待状态，那么等到这个事务自己获取到行锁要更新数据的时候，它读到的值又是什么呢？
]]></description><category></category></item><item><title><![CDATA[Spring 容器工具类]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121704226</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121704226</guid><author>m0_52462015</author><pubDate>Fri, 03 Dec 2021 17:57:20 +0800</pubDate><description><![CDATA[Spring 容器工具类]]></description><category></category></item><item><title><![CDATA[MySQL 实战 45 讲学习笔记（1） -- 极客时间]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121663189</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121663189</guid><author>m0_52462015</author><pubDate>Wed, 01 Dec 2021 20:02:57 +0800</pubDate><description><![CDATA[01 |  基础架构：一条 SQL 查询语句是如何执行的？
1. 思考
这条查询语句在 MySQL 内部的执行过程？
select * from T where id=10


2. MySQL 逻辑架构图

大体来说，MySQL 可以分为 Server 层和存储引擎层两部分。
Server 层包括连接器、查询缓存、分析器、优化器、执行器等，涵盖 MySQL 的大多数核心服务功能，以及所有的内置函数（如日期、时间、数学和加密函数等），所有跨存储引擎的功能都在 这一层实现，比如存储过程、触发器、视图等。
而存]]></description><category></category></item><item><title><![CDATA[ArrayList 源码 + 扩容机制分析]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121552324</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121552324</guid><author>m0_52462015</author><pubDate>Fri, 26 Nov 2021 09:13:08 +0800</pubDate><description><![CDATA[1. ArrayList 简介
ArrayList 的底层是数组队列，相当于动态数组。与 Java 中的数组相比，它的容量能动态增长。在添加大量元素前，我们可以使用 ensureCapacity() 方法来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
ArrayList继承于 AbstractList ，实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。
public class ArrayList&lt;E&g]]></description><category></category></item><item><title><![CDATA[HashMap 源码分析]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121473048</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121473048</guid><author>m0_52462015</author><pubDate>Mon, 22 Nov 2021 15:45:31 +0800</pubDate><description><![CDATA[1、简介

HashMap 主要用来存放键值对，它基于哈希表的 Map 接口实现，是常用的 Java 容器之一，是非线程安全的。
HashMap 可以存储 null 的 key 和 value，但 null 作为 key 只能有一个，null 作为 value 可以有多个（注意：仅仅只是 HashMap 可以有为 null 的 key）。



底层数据结构：

JDK 1.7 数组 + 链表
JDK 1.8 数组 + （链表 | 红黑树）

JDK 1.8 以前，HashMap 的底层结构是由 数组 + ]]></description><category></category></item><item><title><![CDATA[Java 基础]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121435825</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121435825</guid><author>m0_52462015</author><pubDate>Sat, 20 Nov 2021 10:24:14 +0800</pubDate><description><![CDATA[Java 基础
基础概念与常识
1、Java 语言有哪些特点?

简单易学；
面向对象（封装，继承，多态）；
平台无关性（ Java 虚拟机实现平台无关性）；
支持多线程 ；
可靠性；
安全性；
支持网络编程并且很方便（ Java 语言诞生本身就是为简化网络编程设计的，因此 Java 语言不仅支持网络编程而且很方便）；
编译与解释并存；



2、JVM vs JDK vs JRE
2.1 JVM
Java 虚拟机（JVM）是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现（Windows，]]></description><category></category></item><item><title><![CDATA[HashMap 的 7 种遍历方式与性能分析]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121296670</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121296670</guid><author>m0_52462015</author><pubDate>Fri, 12 Nov 2021 21:45:20 +0800</pubDate><description><![CDATA[1、遍历方式
1.1 迭代器 EntrySet
/**
 * 1. 迭代器 EntrySet
 */
@Test
public void test1() {
    Map&lt;Integer, String&gt; map = new HashMap&lt;&gt;();
    map.put(1, "Java");
    map.put(2, "JavaSE");
    map.put(3, "JavaEE");
    map.put(4, "Spring");
    map.put(5, ]]></description><category></category></item><item><title><![CDATA[SpringCloud 微服务学习]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121255035</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121255035</guid><author>m0_52462015</author><pubDate>Wed, 10 Nov 2021 19:59:25 +0800</pubDate><description><![CDATA[引言
为什么要学习微服务？


需要学习哪些知识？










1、认识微服务
1.1 服务架构演变
单体架构

分布式架构

服务治理：

总结
微服务是一种经过良好架构设计的分布式架构方案，微服务架构特征：


单一职责：微服务拆分粒度更小，每一个服务都对应唯一的业务能力，做到单一职责，避免重复业务开发


面向服务：微服务对外暴露业务接口


自治：团队独立、技术独立、数据独立、部署独立


隔离性强：服务调用做好隔离、容错、降级，避免出现级联问题



单体架构特点？

简单方便，高度耦合，]]></description><category></category></item><item><title><![CDATA[Spring Boot Admin 快速入门]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121183859</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121183859</guid><author>m0_52462015</author><pubDate>Sat, 06 Nov 2021 19:36:32 +0800</pubDate><description><![CDATA[参考博客地址
1、介绍
官网地址

Spring Boot Admin 是开源社区孵化的项目，用于对 Spring Boot 应用的管理和监控。Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client)，服务端和客户端之间采用 http 通讯方式实现数据交互；单体项目中需要整合 spring-boot-admin-client 才能让应用被监控。在 SpringCloud 项目中，spring-boot-ad]]></description><category></category></item><item><title><![CDATA[快速创建 Spring Boot 工程 -- 阿里云版（极力推荐）]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/121055030</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/121055030</guid><author>m0_52462015</author><pubDate>Sat, 30 Oct 2021 19:11:33 +0800</pubDate><description><![CDATA[当我们使用 IDEA 的 Spring Initializr 创建 Spring Boot 工程的时候，往往 https://start.spring.io 的速度不尽人意，毕竟是外网，有墙，懂的都懂。所以我们使用另外一种方式 — 阿里云版。

1、选择 Custom
填入 https://start.aliyun.com/


2、填入相应的信息


3、选择对应的技术


4、创建成功


...]]></description><category></category></item><item><title><![CDATA[Swagger 3 整合 knife4j]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120952625</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120952625</guid><author>m0_52462015</author><pubDate>Mon, 25 Oct 2021 15:15:31 +0800</pubDate><description><![CDATA[1、引入依赖
&lt;!--整合Knife4j--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.github.xiaoymin&lt;/groupId&gt;
    &lt;artifactId&gt;knife4j-spring-boot-starter&lt;/artifactId&gt;
    &lt;version&gt;3.0.3&lt;/version&gt;
&lt;/dependency&gt;

&lt;!--如果SpringBoot版本]]></description><category></category></item><item><title><![CDATA[快速排序实现（Java）]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120695967</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120695967</guid><author>m0_52462015</author><pubDate>Mon, 11 Oct 2021 08:33:20 +0800</pubDate><description><![CDATA[文字描述：
1、每一轮排序选择一个基准点（pivot）进行分区
（1）让小于基准点的元素的进入一个分区，大于基准点的元素进入另一个分区
（2）当分区完成后时，基准点元素的位置就是其最终位置
2、在子分区内重复以上过程，直至子分区元素个数少于等于 1，这体现的是分而治之的思想（divide-and-conquer)

实现方式：
1、单边循环快排
（1）选择最右元素作为基准点元素
（2）j 指针负责找到比基准点小的元素，一旦找到则与 i 进行交换
（3）i 指针维护小于基准点元素的边界，也就是每次交换的目标索]]></description><category></category></item><item><title><![CDATA[Leetcode 题解 - 树]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120677512</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120677512</guid><author>m0_52462015</author><pubDate>Sat, 09 Oct 2021 19:11:28 +0800</pubDate><description><![CDATA[参考☞：CS-Notes


递归

一棵树要么是空树，要么有两个指针，每个指针指向一棵树。树是一种递归结构，很多树的问题可以使用递归来处理。



1. 树的高度
Leetcode (opens new window)/ 力扣
class Solution {
    public int maxDepth(TreeNode root) {
        // 结束条件
        if (root == null) {
            return 0;
        }

      ]]></description><category></category></item><item><title><![CDATA[单例模式实现]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120605597</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120605597</guid><author>m0_52462015</author><pubDate>Mon, 04 Oct 2021 16:59:42 +0800</pubDate><description><![CDATA[1、代码实现
1.1 饿汉式-1
静态变量方式
public class Singleton {
    private static Singleton singleton = new Singleton();

    /**
     * 私有构造方法
     */
    private Singleton() {}

    public static Singleton getInstance() {
        return singleton;
    }
}



1.2 饿汉式-2]]></description><category></category></item><item><title><![CDATA[大厂面试题第二季（阳哥）--上]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120589041</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120589041</guid><author>m0_52462015</author><pubDate>Sat, 02 Oct 2021 20:52:46 +0800</pubDate><description><![CDATA[1、Volatile
volatile 是 JVM 提供的一种轻量级的同步机制。
三大特性：

保证可见性
不保证原子性
禁止指令重排

代码实践：
package com.yanghui;

import java.util.concurrent.TimeUnit;

/**
 * @ClassName VolatileDemo
 * @Author YH
 * @Date 2021/9/25
 * @Version 1.0
 */
public class VolatileDemo {

    /**]]></description><category></category></item><item><title><![CDATA[Leetcode 题解 - 链表]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120486240</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120486240</guid><author>m0_52462015</author><pubDate>Sun, 26 Sep 2021 12:06:31 +0800</pubDate><description><![CDATA[参考：CS-Notes


1. 找出两个链表的交点
Leetcode (opens new window)/ 力扣

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
pu]]></description><category></category></item><item><title><![CDATA[Spring Boot 整合 Swagger3]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120400763</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120400763</guid><author>m0_52462015</author><pubDate>Tue, 21 Sep 2021 13:14:19 +0800</pubDate><description><![CDATA[​	前后端分离的项目，接口文档的存在十分重要。与手动编写接口文档不同，Swagger 是一个自动生成接口文档的工具，在需求不断变更的环境下，手动编写文档的效率实在太低。与 Swagger2 相比新版的 Swagger3 配置更少，使用更加方便。


1、引入依赖
&lt;dependency&gt;
    &lt;groupId&gt;io.springfox&lt;/groupId&gt;
    &lt;artifactId&gt;springfox-boot-starter&lt;/artifact]]></description><category></category></item><item><title><![CDATA[OAuth2]]></title><link>https://blog.youkuaiyun.com/m0_52462015/article/details/120386014</link><guid>https://blog.youkuaiyun.com/m0_52462015/article/details/120386014</guid><author>m0_52462015</author><pubDate>Sun, 19 Sep 2021 22:59:59 +0800</pubDate><description><![CDATA[一、OAuth2 解决什么问题
1、OAuth2 提出的背景
照片拥有者想要在云冲印服务上打印照片，云打印服务需要访问云存储服务上的资源。
某个服务想访问某个用户的某个资源，但是不能完全放开权限，这样不安全。




2、图例
资源拥有者：照片拥有者
客户应用：云打印
受保护的资源：照片


3、方式一：用户名密码复制
适用于同一公司内部的多个系统，不适用于不受信的第三方应用。




4、方式二：通用开发者 key
适用于合作商或者授信的不同业务部门之间。




5、方式三：颁发令牌
接近 OAuth2]]></description><category></category></item></channel></rss>