- 博客(31)
- 收藏
- 关注
原创 Redis用法及实现原理
虽然项目中一直在使用Redis,但是在实际的工作中,对Redis的使用还是仅仅停留在分布式缓存上,并且也仅仅只是会set和get,对于Redis的一些高级用法以及Redis为什么高性能模棱两可,所以最近也一直在钻研Redis,学习了Redis很多不为人知的东西。所以在这里记录一下,希望自己能够坚持把所有的内容完善。Redis用法集分布式缓存缓存一致性问题同步双删解决方案订阅binlog,同步数据解决方案缓存穿透空对象布隆过滤器缓存击穿互斥锁永不过期缓存雪崩
2020-10-17 09:50:44 373 1
原创 Redis入门到放弃--缓存
众所周知,Redis是一个高性能分布式缓存中间件,在应对高并发的场景时,我们往往需要通过Redis对一些热点数据进行缓存处理。但是,在分布式系统中,在应对高并发情况时,对出现缓存穿透, 缓存击穿,缓存雪崩等问题。那么接下来,我们就来聊一聊在缓存的设计中,如何应对这些高并发问题:缓存穿透什么是缓存击穿:缓存击穿是指一个不存在的数据,由于缓存是不命中时被动写的,并且处于容错考虑,如果从存储层查不到数据则写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询DB,失去了缓存的意义,这种现象就叫缓存穿透
2020-09-29 00:42:09 184
原创 Redis入门到放弃
Redis作为分布式缓存中间件,在高性能架构中担任着举足轻重的作用,下面我们就来简单聊聊Redis中的 一些坑。帮助大家入门(当然希望大家不要放弃_)编译安装Redis不知什么时候开始,Redis官网https://redis.io/download 竟然已经不提供编译好的二进制包(也可能是我没有找到,有找到的小伙伴麻烦留言告诉我一声),所以就只能自己通过源码编译安装。截止目前,Redis提供的最新稳定版本是Redis-6.0.8.按照官方网站提示进行make, make install,但是在ma
2020-09-26 21:06:45 216
原创 MySQL之事务的实现原理
在上一章节,详细阐述了MySQL的事务的特性,以及存在的并发问题。并且,也详细阐述了MySQL内置的四种不同的隔离级别,分别都解决了对应的并发问题。那么,同学们有没有思考一个问题:MySQL是怎么实现的这些不同的隔离级别?例如,在可重复读的隔离级别下,B事务明明已经提交了事务,表示对数据的修改已经写入了磁盘(至少可以保证能够写入磁盘),但是A事务是通过什么方式仍然获取到的原来的数据呢?要搞懂这些原理,我们必须首先了解MySQL的底层存储,MVCC机制以及锁的相关特性。下面我们一一进行讲解。MySQL 体
2020-09-26 12:49:07 260
原创 MySQL之事务的隔离性
最近看了不少关于MySQL的文章,对MySQL中的事务的概念和原理也有了更加深刻的理解。所以这里也结合自己的一些理解和实战,记录一下。MySQL的事务的四大原则首先,我们先聊一聊事务的四大原则, 即大家耳熟能详的 ACID。原子性(Atomicity):事务内的一系列的CRUD操作,对于一个事务而言,是一个原子操作。要么全部成功,要么全部失败。隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发.
2020-09-24 01:02:47 538
原创 Zookeeper专题
作为一个分布式架构中的协调组件,zookeeper起着举足轻重的作用。并且在多个分布式架构中,总是能够看到zookeeper的身影,例如dubbo+zookeeper通过rpc远程调用实现微服务架构,再比如kafka通过zookeeper作为元数据管理和协调。那么下面我们就一起来探索一下如何搭建一个高可用的zookeeper集群以及zookeeper实现高可用的原理又是什么?什么是zookeeperZookeeper是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于Zookeeper实现诸
2020-09-13 16:37:20 113
原创 聊一聊MySQL为什么选择B+Tree做索引及MySQL调优实战
众所周知,我们在使用MySQL时,当数据量较大时,会在一些常用的查询条件字段上添加索引,以此来优化查询性能。但是大家是否知道索引为什么能够优化查询性能呢?以及MySQL的索引是一种什么样的数据结构,能够如此高效的优化查询语句?下面我将和大家一起聊一聊MySQL索引的一些知识。MySQL索引结构MySQL在创建索引时,选择的B+Tree作为索引的数据结构。那么B+Tree是一种什么样的数据结构呢,以及B+Tree为什么能够提高查询性能呢?这就引入了两个问题:B+Tree:是一种有序的多叉树的树形结构。
2020-09-02 00:07:35 185
原创 21天搞定Spring---Spring设计初衷及设计理念(day3)
在真正涉足Spring的核心之前,先了解一下Spring的设计初衷及设计理念是有必要的。它可以让我们从设计者的角度出发思考问题,然后站在巨人的肩膀上去学习并使用这些理念,而不仅仅是学习如何使用这些框架,并且学习设计理念也可以让我们在一个大的方向上对Spring有一个整体的认识。Spring的设计初衷Spring的设计初衷其实就四个字:简化编程。但是为了真正做到这四个字,Spring做了很多事情。如:约定大于配置基于POJO的轻量级和最小侵入性编程(BOP,面向Bean编程)。通过依赖注入(DI
2020-08-22 00:51:32 368
原创 21天搞定Spring---Spring常用设计模式(day2)
书接上回,我们继续较为深入的分析Spring中常用的一些设计模式.上一章节,我们主要分析Spring的一些架构原则(其实也是软件设计的6大设计原则),并且较为详细的阐述了工厂模式和代理模式的常用实现方式。这一节主要包含以下内容:单例模式委派模型(不是23中设计模式的成员)策略模式模式方法描述单例模式单例模式,顾名思义,就是在JVM的整个运行期间,一个类只会存在一个对象。因此叫做单例模式。如Spring实现的IOC,默认就是单例模式(可以通过修改scope=“prototype”来改
2020-08-18 00:36:06 216
原创 21天搞定Spring---Spring架构设计原则(day1)
在接下来的21天,我将按照Spring架构设计原则,到Spring IOC,AOP的实现,通过源码分析的手段较为深入的讲解Spring的内核心法。架构设计原则首先,从大的方向了解Spring的结构设计是有必要的,因此我将详细介绍Spring的软件架构设计原则(也是通用的软件架构设计原则)以及Spring中常用的设计模式。开闭原则:开闭原则是指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。它强调的是用抽象构建框架,用实现扩展细节,从而提高软件系统的可复用性和可维护性。即在项目需求发生变更
2020-08-16 12:38:09 344
原创 玩转高并发系列----JUC并发工具类(二)
在前一章节我们详细分析了Semaphore以及CountDownLatch的基本用法及实现原理,并且在将CountDownLatch时,也举了一个运动员赛跑的栗子。下面我将接着这个栗子详细分析CyclicBarrier的基本用法及底层实现原理。CyclicBarrier顾名思义,是一个可被循环使用的屏障。在前一章讲述CountDownLatch的时候说道,CountDownLatch可以用在等待指定的线程数执行完成,即到达一个指定的时间节点后,同时开始其他的任务。而CyclicBarrier在其上做了
2020-08-12 23:15:46 143
原创 玩转高并发系列----JUC并发工具类(一)
在这一章节中,我将详细讲解JUC中提供的一些常用的并发工具类的使用,如CountDownLatch, Semaphore,ThreadLocal,CyclicBarrier等进行逐一讲解,并通过一行一行品源码的方式来逐步探索多线程的奥秘。CountDownLatch...
2020-08-10 23:57:56 296
原创 玩转高并发系列----锁(三)
这一章我们将着重讲解Condition的基本用法以及其实现原理,让读者不光知其然,更知其所以然。并且将带领大家一行一行通过源码的方式剖析其实现细节。基本用法Condition本身是一个接口,其功能和用法类似wait()和notify()。并且在使用Condition时,必须和Lock一起使用,即必须获取到Condition对应的lock锁之后,才能调用Condition的阻塞(await)和唤醒(signal)方法。先看一下Condition的接口声明。public interface Condi
2020-08-08 02:34:40 188
原创 玩转高并发系列----锁(二)
这一章,我将结合JDK源码详细介绍如何通过AQS实现了读写锁以及如何通过Unsafe的park()和unpark()方法并结合条件队列实现Condition。读写锁(ReentrantReadWriteLock)1 读写锁的基本用法:首先我们看一看读写的基本用法:顾名思义,读写锁,就是能够保证读写分离,在高并发情况下,做到读读不互斥,读写互斥,写写互斥,从而提高并发量。读写锁也是基于AQS实现的,通过AQS内部的state变量,同时记录的读线程的个数和写线程的个数(因为是可重入的,对于写线程的
2020-08-05 22:47:10 203
原创 玩转高并发系列----锁(一)
锁的基本概念可重入锁:指当一个线程获得锁A,进入互斥区域后,可以再次获取到锁A。而不是说一个线程获得锁A之后,还可以进入锁B。很显然,通常的锁都要设计成可重入的,否则就会发生死锁。 如下代码展示了锁的可重入性:private int value;private Lock lock = new ReentrantLock();public void increment(){ try { lock.lock(); lock.lock(); va
2020-08-03 23:52:53 163
原创 玩转高并发系列----原子类型(一)
原子类型的意义对于一个共享变量,在多线程的情况下,我们需要对其进行同步操作,最常用的手段是添加synchronized关键字。如public class SharedValue { private int value; public synchronized void add(int count){ this.value += count; } public synchronized void sub(int count) { this.
2020-08-02 22:03:41 135
原创 玩转高并发系列----多线程基础(二)
volatile关键字多线程中的三个重要特性:原子性:指的是一个读/写操作可以当做是一个原子操作。如赋值操作等。注意点:JVM的规范并没有要求64位的long或者double的写入是原子的。因此,在32位的机器上,一个64位变量的写入可能被拆分成两个32位的写操作来执行。这样可能读线程只能读到写线程写入的“一半”的值。内存可见性:指的是“写完之后立即对其他线程可见”,它的反面不是“不可见”,而是“稍后才能见”,也就是volatile保证了强一致性。如上一节的示例代码中,线程关闭
2020-07-31 22:41:29 158
原创 玩转高并发系列----多线程基础(一)
如何优雅的关闭线程运行到一半的线程能否强制杀死?肯定是不能的。因为如果强制杀死线程,则线程中所使用的资源,例如文件描述符、网络连接等资源就无法正常关闭。一个线程一旦运行起来,就不要去强行打断它,合理的关闭方法是让其运行完(也就是线程执行结束),释放所有的资源后,退出线程。所以Java中不建议使用stop()和destory()方法。设置守护线程,使得所有非守护线程执行结束后,守护线程自动优雅关闭。如经典的JVM中的垃圾回收线程。设置关闭的标志位。如下所示/*** 执行结果如下:*
2020-07-30 23:38:26 199
转载 RocketMQ篇.Topic配置中perm的含义
作用: 设置该 Topic 的读写模式。取值说明如下:6:同时支持读写4:禁写2:禁读一般情况设置为: 6引用:[原文](https://blog.csdn.net/lwf006164/article/details/91565117)
2020-06-17 13:29:46 2684 1
原创 RocketMQ一个不兼容BUG: No route info for this topic
现象在使用RocketMQ的DefaultMQProducer发送消息时,如果此消息的Topic之前不存在,则会报错:Exception in thread "main" org.apache.rocketmq.client.exception.MQClientException: No route info for this topic, TopicTestFor more information, please visit the url, http://rocketmq.apache.org/d
2020-05-30 14:07:06 777
原创 SpringBoot整合Mybatis和ShardingJDBC实现分库分表
案例描述通过一个简单的案例实现SpringBoot+Mybatis+ShardingJdbc分库分表实践通过商品表(good)进行演示:最简单的good表有三个属性:id,good_name, good_type根据id进行分库,当id<=20时使用database0,id>20时,使用database1根据good_type进行分表:当good_type为偶数时,使用go...
2020-04-25 23:54:39 1247
原创 CompletableFuture踩坑记
使用CompletableFuture踩的坑坑才是重点,所以放在最前面阐述,希望能给大家解决问题提供一点帮助。现象通过CompletabltableFuture异步执行任务,并通过其whenComplete方法设置异步回调后,在回调方法中将值插入list或map中,结果发现获取不到回调方法中的值public class CompletableFutureDemo02 { /...
2020-04-15 22:07:21 8244 2
原创 阿里云搭建网站流程(二)--- 服务器环境搭建
连接阿里云第一种方式:通过阿里云控制台提供的远程连接进行远程服务器到连接。第二种方式:通过XShell等远程连接工具连接远程服务器。环境配置根据自己网站项目,配置相应的环境。如常见到LAMP(LNMP)架构,Java的Tomcat环境等。通过宝塔面板进行一站式的环境配置及网站部署和维护。下面主要介绍宝塔面板的基本安装和配置。安装宝塔面板yum install -y wge...
2020-04-13 01:05:48 164
原创 阿里云搭建网站流程(一)----服务器购买及配置
购买阿里云服务器进入阿里云官网根据自己需要选择合适自己的服务器配置。学习使用:新注册用户可以免费领取一个月的ECS服务器。若不是新用户,网站较小或者作为学习使用到话,可以购买轻量应用服务器.创业公司:根据网站大概到访问量,选择合适到服务器。服务器配置进入阿里云控制台根据阿里云控制台到面板找到自己购买到服务器购买阿里云服务器后,系统会默认创建一个实例,并分配一个外网...
2020-04-13 00:46:37 279
原创 dubbo客户端通过rpc调用dubbo 服务的时出现参数丢失的问题
现象服务A提供一个dubbo接口,LoginServer.login(LoginReqDTO reqDTO);服务B通过rpc调用A提供的LoginService接口的login方法。查看日志发现服务B发起调用时传递的reqDTO参数与服务A接收到的参数部分不一致。例如:服务B请求参数reqDTO=LoginReqDTO(appKey="appKey", mobile="188123...
2020-02-29 23:22:55 3312
原创 Java网络通信中 ObjectInputStream与ObjectOutputStream阻塞(block)问题
现象在Java Socket进行网络通信过程中,通过socket.getInputStream()方法获取到InputStream后,创建ObjectInputStream对象,同理创建ObjectOutputStream对象,进行对象传输时,发生阻塞现象原因分析这是因为当从InputStream创建一个ObjectInputStream时,需要从流中读入并验证一个Header,这时如...
2020-02-26 23:25:09 846 1
原创 启动Tomcat时,抛出异常java.rmi.server.ExportException: Port already in use: 65333的解决办法
问题描述在一个服务器部署Tomcat时,发生端口占用冲突的异常。错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 65333; nested exception is: java.net.BindException: Address already in use: JVM_Bind问题分析检查端口...
2020-01-15 18:59:32 871
原创 Chrome 浏览器崩溃的解决方案
Chrome 浏览器崩溃的解决方案场景:Chrome浏览器所有页面全部显示崩溃了到情况下,各种重启浏览器和电脑,重装Chrome都没有用的情况下怎么解决:查看C:\Windows\System32\drivers\bowser.sys目录下有没有bd*.sys文件,该类文件是百度卫士遗留的系统文件,删除此类文件,若无法删除,则修改文件名。右键Chrome浏览器图标,在快捷方式项目中的目标C...
2020-01-04 17:46:39 1329
原创 Java内存模型学习笔记
一、主内存和工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处理器的...
2018-11-12 17:02:29 69
原创 Idea常用快捷键
Alt+Insert,可以生成构造器/Getter/Setter等Shift+Click,可以关闭文件Ctrl+Alt+T,可以把代码包在一个块内,例如:try/catchCtrl+Alt+V,可以引入变量。例如:new String(); 自动导入变量定义Ctrl+Alt+L,格式化代码Ctrl+Alt+I,将选中的代码进行自动缩进编排,这个功能在编辑 JSP 文件时也可以工...
2018-11-07 15:33:17 83
转载 如果你报createSQLQuery is not valid without active transaction,请看这里
当我在dao中执行hibernate的方法时,如save,delete,update,createQuery,总是说不能在没有活动的事务中执行(org.hibernate.HibernateException: createSQLQuery is not valid without active transaction)。立马上google查,一无所获。曾几度怀疑是否配置写出了,dao或servi...
2018-11-04 13:46:30 253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人