<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xichen97的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/xichen97</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xichen97]]></copyright><item><title><![CDATA[redis性能的排查]]></title><link>https://blog.youkuaiyun.com/xichen97/article/details/118161501</link><guid>https://blog.youkuaiyun.com/xichen97/article/details/118161501</guid><author>xichen97</author><pubDate>Wed, 23 Jun 2021 20:04:51 +0800</pubDate><description><![CDATA[关于 redis 性能的排查 我首先能想到的方面是 以下几个 (可以类比数据库sql变慢的原因)：

redis 在大部分情况下都会使用单线程来完成指令操作，那么在一些命令中会导致变慢，他会阻塞其他指令 比如key * （改用 SCAN）
redis 作为一个内存数据库，那么如果数据都在内存中可以获得，那么速度是很快的，但是如果涉及到要到磁盘去进行读取 速度就很很慢。
查看慢日志 查看慢的那些命令

1. 进行排查，是否redis是否真的慢了
在服务内部集成链路追踪，查看对应方法在调用redis 服务时是否]]></description><category></category></item><item><title><![CDATA[二分查找详解]]></title><link>https://blog.youkuaiyun.com/xichen97/article/details/117786101</link><guid>https://blog.youkuaiyun.com/xichen97/article/details/117786101</guid><author>xichen97</author><pubDate>Thu, 10 Jun 2021 17:07:35 +0800</pubDate><description><![CDATA[历程

一开始业务量小的数据，单体应用直接去操纵数据库进行读写的操作，就可以完成操作，相对简单。
在后期，业务量的增长，导致数据库查询耗时较大，在这时候使用redis等分布式缓存，来提高效率。
随着数据量不断增大，导致分布式缓存压力过大，所以在分布式缓存中，可以在添加一层本地缓存来减少分布式缓存的压力。
数据量还在不断增大，为了避免继续出现问题，需要使用CPU缓存来继续提高应用的缓存能力

不同阶段出现的问题
使用分布式缓存
使用分布式缓存确实提高了应用的能力，但是架构变得复杂了，也会带来喝多问题
数据一致]]></description><category></category></item><item><title><![CDATA[回溯算法概览]]></title><link>https://blog.youkuaiyun.com/xichen97/article/details/116302834</link><guid>https://blog.youkuaiyun.com/xichen97/article/details/116302834</guid><author>xichen97</author><pubDate>Fri, 30 Apr 2021 14:28:59 +0800</pubDate><description><![CDATA[在leetCode 中涉及到回溯的题目中 有以下几个基本题目，
39.组合总和
40. 组合总和 II
46. 全排列
47. 全排列 II
77.组合
78. 子集
90. 子集 II
通过这些题目，我们可以容易的整理出回溯的基本模版
46.全排列
问题是这样的 ：给定一个 没有重复数字的序列，返回其所有可能的全排列。
整体的回溯树如下图所示：

当前在红色节点上，我们选择的列表有1，3。由于2在后面，2将无法选择。那么就便变成了树的遍历
代码如下：
class Solution {
    List&l]]></description><category></category></item><item><title><![CDATA[Spring事务源码阅读(一)]]></title><link>https://blog.youkuaiyun.com/xichen97/article/details/115830030</link><guid>https://blog.youkuaiyun.com/xichen97/article/details/115830030</guid><author>xichen97</author><pubDate>Sun, 18 Apr 2021 15:00:45 +0800</pubDate><description><![CDATA[Spring事务
注解一：@EnableTransactionManagement
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {

	/** 是否使用cglib代理 默认是jdk代理 这个参数 也会]]></description><category></category></item><item><title><![CDATA[AOP结合redis实现自动存取]]></title><link>https://blog.youkuaiyun.com/xichen97/article/details/115338312</link><guid>https://blog.youkuaiyun.com/xichen97/article/details/115338312</guid><author>xichen97</author><pubDate>Tue, 30 Mar 2021 22:48:46 +0800</pubDate><description><![CDATA[Redis自定义注解@RedisSimpleCache
注解的作用
在使用过程中，不需要进行Redis中是否有数据的判断，就如同正常的查询数据库一般，当内容在数据库中不存在的情况下，会执行代码，在得到结果之后，再将数据存储中Redis中
注解的实现
使用Aop的技术，在方法中执行前查询数据，发现数据没有存在于数据库中，执行方法后，将数据存储中Redis的
具体的实现步骤

AOP拦截注解过的方法后，先去校验中key是否存在，
存在的话，执行后续方法，判断方法返回的类型，来确定序列化以及反序列化的规则
将Re]]></description><category></category></item><item><title><![CDATA[redis Sentinel 部署以及spring boot集成]]></title><link>https://blog.youkuaiyun.com/xichen97/article/details/115060339</link><guid>https://blog.youkuaiyun.com/xichen97/article/details/115060339</guid><author>xichen97</author><pubDate>Mon, 22 Mar 2021 08:05:54 +0800</pubDate><description><![CDATA[Sentinel
sentinel(哨兵) 是一种redis的解决方案，可以由多个Sentinel实例组成的Sentinel系统可以监视多个主服务器，以及这些主服务器之下的从服务器，同时如果主服务器下线之后，就会通过推举将从服务器升级为主服务器。
这里不推荐在一个机器上使用docker来搭建一个redis Sentinel系统，只要是考虑到使用docker之后，之后集成到spring boot之后，sentinel得到了一个内网地址，spring boot无法连接
redis 主从

修改主配置文件

po]]></description><category></category></item><item><title><![CDATA[跳表]]></title><link>https://blog.youkuaiyun.com/xichen97/article/details/114633731</link><guid>https://blog.youkuaiyun.com/xichen97/article/details/114633731</guid><author>xichen97</author><pubDate>Wed, 10 Mar 2021 14:22:42 +0800</pubDate><description><![CDATA[结论
跳表是一个二维的链表，通过牺牲一部分空间来换取比链表更快的速度。
从链表开始
链表在查找数据的时候，我们需要从头往后进行遍历，时间复杂度为O(n)，如果我们为了提高链表在查找时候的效率引入了跳表的结构，就是构建了一个二维的链表。
我们通过将提取一条有序的链表上的若干个节点，在其之上构建出了一层新的链表，通过先检索上层的链表来一步步的缩小范围，直到最后确定位置。

跳表的遍历
拿上图举例， 假设我们需要找到数据 8，那么遍历的步骤如下

从L2的第一个节点出发，找到该条链表中小于等于数据8的最大值，也就]]></description><category></category></item></channel></rss>