<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[u011521890的专栏]]></title><description><![CDATA[生活的乐趣在于不断编程!]]></description><link>https://blog.youkuaiyun.com/u011521890</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u011521890]]></copyright><item><title><![CDATA[数据库和缓存双写一致性方案]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/103394896</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/103394896</guid><author>u011521890</author><pubDate>Wed, 04 Dec 2019 22:02:33 +0800</pubDate><description><![CDATA[常用的双写一致性策略
通常我们使用数据库和缓存的套路是这样的。
查询
先查询缓存，如果不存在；则查询数据库，并更新缓存。

更新
更新策略则有很多版本，大体可以总结为以下三种：

方案一：先更新数据库，再更新缓存
方案二：先清除缓存，再更新数据库
方案三：先更新数据库，再清除缓存

分析三种方案的利弊
先更新数据库，再更新缓存
假设我们有这么一个场景:

线程A更新数据库。如： (update A...]]></description><category></category></item><item><title><![CDATA[【elasticSearch学习与实践】elastic stack环境搭建(7.3)]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/101223411</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/101223411</guid><author>u011521890</author><pubDate>Fri, 04 Oct 2019 08:32:33 +0800</pubDate><description><![CDATA[elastic stack的介绍
在elastic架构下面有：elasticsearch、kibana、logstash（俗称ELK）和beats。
他们的介绍依次如下：

我对elastic stack的理解


图片来自网络


elasticsearch是一个分布式搜索引擎，通过指定的_index可以快速搜索到需要的内容。通常用于日志搜索和电商商品搜索等大数据搜索。
它的优点：


支持re...]]></description><category></category></item><item><title><![CDATA[【Redis】Redis布隆过滤器]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/89605577</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/89605577</guid><author>u011521890</author><pubDate>Sat, 18 May 2019 08:57:59 +0800</pubDate><description><![CDATA[缓存击穿介绍
什么是缓存击穿

我们通常使用redis作为数据缓存，当请求进来时先通过key去redis缓存查询，如果缓存中数据不存在，需要去查询数据库的数据。当数据库和缓存中都不存在的数据来查询时候，请求都打在数据库的请求中。如果这种请求量很大，会给数据库造成更大的压力进而影响系统的性能。


解决这类问题的方法

方法一:当DB和redis中都不存在key，在DB返回null时，在redis中...]]></description><category></category></item><item><title><![CDATA[【分布式锁】Redis实现分布式锁]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/88912351</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/88912351</guid><author>u011521890</author><pubDate>Sun, 12 May 2019 11:11:30 +0800</pubDate><description><![CDATA[在分布式应用中常会遇到并发问题，例如：一个用户在同一之间内创建多个订单；执行订单修改状态，需要查询订单并更新订单状态，这是非原子性操作，存在并发问题。以上的问题需要通过分布式锁来解决。
常用的分布式锁有两种分别是基于redis和zk来实现的，下面会分别介绍一下。
redis分布式锁
使用分布式锁的流程如下所示:
下面主要基于单节点的redis服务进行分析：
tryLock
通常使用setnx(se...]]></description><category></category></item><item><title><![CDATA[junit单元测试web项目的方法]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/87889892</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/87889892</guid><author>u011521890</author><pubDate>Sat, 23 Feb 2019 13:22:46 +0800</pubDate><description><![CDATA[在项目开发中，常通过junit单元测试来测试自己方法逻辑。下面主要展示，junit测试web项目的方法步骤。包括service、dao层的方法和使用Mock测试cotroller层的方法。
以下测试用例时基于公司的项目展示的，所以不便于粘贴所有的源码
junit测试环境依赖
&amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;junit&amp;lt;/groupI...]]></description><category></category></item><item><title><![CDATA[jvm虚拟机模型实例演示]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/79507128</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/79507128</guid><author>u011521890</author><pubDate>Tue, 13 Mar 2018 15:41:25 +0800</pubDate><description><![CDATA[
  通过一个代码实例，来说明变量，方法，对象和类之间在jvm所存放的位置。




public class JvmHeapStackDistribute {
    public static void main(String[] args) {
        Program program = new Program(&quot;java&quot;);
        program.sayHello();...]]></description><category></category></item><item><title><![CDATA[idea创建maven工程的spark项目]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/78826343</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/78826343</guid><author>u011521890</author><pubDate>Sun, 17 Dec 2017 17:36:00 +0800</pubDate><description><![CDATA[idea工具可以创建maven工程的spark项目，今天就试着做了一下，然后写了一个基于集合创建RDD的小的demo，并且遇到了不少的坑，在这里总结一下。



创建maven工程的spark项目


  这个项目是机遇scala语言进行开发的 
  下面是截图步骤 
   
   
   
  


基于集合创建RDD



object RddBasedOnCollections {
  de]]></description><category></category></item><item><title><![CDATA[windows环境下安装spark]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/78577582</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/78577582</guid><author>u011521890</author><pubDate>Mon, 20 Nov 2017 22:04:51 +0800</pubDate><description><![CDATA[前言


  花了近两周的时间学习了scala的语法，然后就迫不及待的想要玩一下spark的开发了。这里先介绍一下spark在windows环境下的安装步骤和方法。
  
  因为spark大数据的计算肯定是基于分布式集群的方式才能发挥其巨大的作用，所以，在windows环境下学习大数据，只是纸上谈兵的方式。因为环境的限制，所以只能在现有的电脑上进行大数据的学习，先了解spark的API吧!先把原]]></description><category></category></item><item><title><![CDATA[linux环境指令总结(针对服务器环境部署的指令)]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/78497053</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/78497053</guid><author>u011521890</author><pubDate>Fri, 10 Nov 2017 10:46:15 +0800</pubDate><description><![CDATA[前言

在使用linux系统进行服务部署时候，难免会用到常用的linux指令。但是有时候，有些指令不知道如何使用，最近也是在玩部署的时候发现自己对linux指令的不了解，但是最后通过查资料也学到了不少的linux常用指令。在这里做一个总结吧，难免以后会再用到。

ssh登录

语法说明(p为小写)

ssh -p 端口 用户名@IP



ssh -p 5188 support@127.0.0.1]]></description><category></category></item><item><title><![CDATA[springboot配置Redis主从服务]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/78088799</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/78088799</guid><author>u011521890</author><pubDate>Mon, 25 Sep 2017 19:55:06 +0800</pubDate><description><![CDATA[今天学了一下springboot配置redis的主从服务器。根据一主二从三哨兵的原则来搭建一个分布式的缓存服务。主要还是针对redis的一些配置。下面与大家分享一下！ 
附上对redis的官方介绍 
http://redis.majunwei.com/topics/sentinel.html 
要想通过springboot搭建redis主从服务，就要先使用redis配置一个主从服务。

测试red]]></description><category></category></item><item><title><![CDATA[Springboot中Spring-cache与redis整合]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/78078576</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/78078576</guid><author>u011521890</author><pubDate>Sun, 24 Sep 2017 18:42:00 +0800</pubDate><description><![CDATA[也是在整合redis的时候偶然间发现spring-cache的。这也是一个不错的框架，与spring的事务使用类似，只要添加一些注解方法，就可以动态的去操作缓存了，减少代码的操作。如果这些注解不满足项目的需求，我们也可以参考spring-cache的实现思想，使用AOP代理+缓存操作来管理缓存的使用。 
在这个例子中我使用的是redis，当然，因为spring-cache的存在，我们可以整合多样的缓]]></description><category></category></item><item><title><![CDATA[Springboot整合Redis缓存]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/78070773</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/78070773</guid><author>u011521890</author><pubDate>Sat, 23 Sep 2017 14:43:58 +0800</pubDate><description><![CDATA[springboot提供了spring-data-redis的框架来整合redis的操作。下面主要介绍，springboot整合redis的配置，以及spring-data-redis是如何提供便捷的操作来处理redis。 
1. redis环境准备在使用redis之前需要先安装redis数据库，具体的安装流程可以参考 
http://blog.youkuaiyun.com/u011521890/article]]></description><category></category></item><item><title><![CDATA[java多线程之Lock介绍]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/78035307</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/78035307</guid><author>u011521890</author><pubDate>Tue, 19 Sep 2017 22:19:23 +0800</pubDate><description><![CDATA[java.util.concurrent包中有关于Lock显示锁的定义。它提供了ReentrantLock、ReetrantReadWriteLock.ReadLock 和 ReetrantReadWriteLock.WriteLock，重入锁、读锁和写锁等。

ReentrantLock



公平锁和非公平锁

Lcok与synchronized的区别


lock是显示的锁，调用lock()]]></description><category></category></item><item><title><![CDATA[java线程池介绍（一）]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/77985903</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/77985903</guid><author>u011521890</author><pubDate>Thu, 14 Sep 2017 21:58:13 +0800</pubDate><description><![CDATA[今天看了一下java并发包中的API，这里做一个总结。 
首先我们先看一下，java线程池相关的类以及他们的关系uml图 
 
从类图和源码中可以了解到，Executors类是提供线程池创建的类，而Executor系列的类则是提供线程池所有用的行为。例如execute、submit、shutDown等 
Executors类中提供四种创建线程池的静态方法。

创建线程池的几种方式

创建缓存线程池]]></description><category></category></item><item><title><![CDATA[synchronized的介绍]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/77950106</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/77950106</guid><author>u011521890</author><pubDate>Tue, 12 Sep 2017 21:42:48 +0800</pubDate><description><![CDATA[我对synchronized关键字算是很熟悉的了，但是有些时候一些概念还是没有搞明白，今天通过对wiki翻译以及博客的学习，从概念和类别上对其进行区分，并整理了一套自己的理解方式。



从类别来区分

从类别上可以将锁分为类级别锁和对象级别锁 
1. 类级别锁，作用于整个类的的同步锁，例如Object.class 
2. 对象级别锁，new Object()产生的锁，不同的实例所持有的锁是不同的]]></description><category></category></item><item><title><![CDATA[java多线程方法的总结]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/77940372</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/77940372</guid><author>u011521890</author><pubDate>Tue, 12 Sep 2017 21:07:51 +0800</pubDate><description><![CDATA[interrupt、isinterrupted、interrupted的区别



从结论上来区分


interrupted() 是Thread类的静态方法，测试当前线程是否已经中断，线程的中断状态也是由该方法清除。
isInterrupted() 测试线程Thread对象是否已经处于中断状态。但不具有清除功能
interrupt() 中断线程的方法，并不能真正中断线程，只是设置了一个中断标志]]></description><category></category></item><item><title><![CDATA[javaIO的装饰者模式]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/77920918</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/77920918</guid><author>u011521890</author><pubDate>Mon, 11 Sep 2017 10:10:54 +0800</pubDate><description><![CDATA[装饰者模式的uml


通过继承和组合的方式类设计对象的修饰作用
在继承的基础上，通过引用让对象具有多重修饰（拥有其他子类的方法和修改）的特性。 
 
这个类图是《Head first 设计模式》上的例子 
装饰者的魔力主要在于CondimentDecorator的身上，它是抽象的装饰者类。继承CondimentDecorator在构造方法上都引用了Baverage抽象类。




抽象的Beve]]></description><category></category></item><item><title><![CDATA[java中的观察者模式]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/77920474</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/77920474</guid><author>u011521890</author><pubDate>Sun, 10 Sep 2017 11:00:30 +0800</pubDate><description><![CDATA[最近在学习《head first 设计模式》，站在巨人的肩膀上学习设计模式，一定会有很大的收获。通过了解设计模式的uml图，来看java源码，让我对java中的一些实现又多了更深层次的了解。在这里，也记录一下学习历程，并与大家分享学习心得。观察者模式的类图
观察者模式运用接口和组合的方式来进行设计。
类似于报纸的订阅，被订阅信息称为主题(Subject),订阅者称为观察者。当主题有更新时，会通知观察]]></description><category></category></item><item><title><![CDATA[zookeeper与dubbo结合实例]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/77148623</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/77148623</guid><author>u011521890</author><pubDate>Sun, 13 Aug 2017 18:38:28 +0800</pubDate><description><![CDATA[dubbo是阿里开源的一个分布式服务框架，使用它可以完成远程服务调用（RPC）。今天来写一下这种分布式开发的demo
  RPC可以简单理解为，两个不同工程之间代码的中的方法相互调用的过程。
  
  实现的基本过程：建立两个java工程provider（生产者）和consumer(消费者)，一个provider负责提供服务(service)，另一个consumer可以调用provider提供的服务]]></description><category></category></item><item><title><![CDATA[zookeeper的环境搭建]]></title><link>https://blog.youkuaiyun.com/u011521890/article/details/76099694</link><guid>https://blog.youkuaiyun.com/u011521890/article/details/76099694</guid><author>u011521890</author><pubDate>Sun, 13 Aug 2017 18:11:26 +0800</pubDate><description><![CDATA[zookeeper是hadoop大家族的一个成员，是Apache的一个产品。我使用到zookeeper的主要原因是：Zookeeper作为Dubbo服务的注册中心，能与dubbo做到集群部署。当提供者出现断电等异常停机时，Zookeeper注册中心能自动删除提供者信息，当提供者重启时，能自动恢复注册数据，以及订阅请求。关于zookeeper的介绍和原理http://blog.youkuaiyun.com/guc]]></description><category></category></item></channel></rss>