自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 基于Redis实现消息队列典型方案

概述 消息队列,Message Queue,常用于解决并发系统中的资源一致性问题,提升峰值的处理能力,同时保证消息的顺序性、可恢复性、必送达性,对应用进行解耦,或者实现异步通讯等。市面上的 MQ应用有很多(例如:Kafka,RabbitMQ,Disque),同时也可以基于 Redis 来实现,比...

2020-01-08 15:08:26

阅读数 23

评论数 0

原创 Spring Boot 整合——Redis延时队列的简单实现

业务流程 用户提交任务。首先将任务推送至延迟队列中。 延迟队列接收到任务后,首先将任务推送至job pool中,然后计算其执行时间。 然后生成延迟任务(仅仅包含任务id)放入某个桶中 时间组件时刻轮询各个桶,当时间到达的时候从job pool中获得任务元信息。 监测任务的合法性如果已经删...

2019-12-13 11:24:58

阅读数 31

评论数 0

原创 redis的五种常用数据结构、Pub/Sub数据结构、Stream数据结构

目录 Redis五种数据结构如下: 1.String 字符串类型 Redis 字符串命令 实战场景: 2.Hash (哈希) Redis hash 命令 实战场景: 3.链表 list Redis 列表命令 实战场景: 4.Set 集合 Redis 集合命令 实战场景; ...

2019-12-02 10:04:39

阅读数 28

评论数 0

原创 Redis事务深入解析和WATCH使用

目录 1.前言 2.事务基本使用 1)开启事务 2)命令入列 3)执行事务/放弃事务 3.事务错误&回滚 1)执行时错误 2)入列错误不会导致事务结束 3)入列错误会导致事务结束 4)为什么不支持事务回滚? 4.监控watch 5.事务在程序中使用 6.小结 ...

2019-11-28 00:35:00

阅读数 17

评论数 0

原创 Redis实现库存扣减操作

具体关于lua脚本的内容使用请移步至redis命令参考–Script脚本 : http://doc.redisfans.com/script/index.html 在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。 解决方案 使用mysql数据库...

2019-11-05 16:55:22

阅读数 49

评论数 0

原创 Redis实现分布式锁方式

在Java中,关于锁我想大家都很熟悉。在并发编程中,我们通过锁,来避免由于竞争而造成的数据不一致问题。通常,我们以synchronized 、Lock来使用它。 但是Java中的锁,只能保证在同一个JVM进程内中执行。如果在分布式集群环境下呢? 一、分布式锁 分布式锁,是一种思想,它的实现方...

2019-10-10 16:35:59

阅读数 23

评论数 0

转载 Spring Boot + Spring Cloud 实现:集成 Swagger API

Spring Boot + Spring Cloud 实现:集成 Swagger API spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口。这些接口不但会服务于传统的web端(b/s),也会服务于移动端。在实际开...

2019-10-09 16:11:57

阅读数 93

评论数 0

原创 9-手动实现一个可重入锁

首先 自定义一个锁,我们可以实现Lock接口;lock接口源码如下: package java.util.concurrent.locks; import java.util.concurrent.TimeUnit; public interface Lock { void loc...

2019-09-29 19:26:22

阅读数 12

评论数 0

原创 8-Lock接口的认识与使用

关于Lock,Lock顾名思义就是锁,我们之前也已经了解过了关于锁,它其实是解决线程安全性问题的另外一种方案, 解决线程安全性问题,我们已经学习了哪些呢? 第一个就是synchronized; 第二个,我们了解了volatile。这两个可以追溯的历史是比较远的,synchronized在JD...

2019-09-29 17:43:14

阅读数 11

评论数 0

原创 7-JDK5提供的原子类的操作以及实现原理

关于线程安全性问题的一个解决方案,我们之前对于之前所出现的线程安全性问题已经了解了两个解决方案,第一个是synchronized,第二个是volatile。但是对于我们之前的数值序列生成器来讲,使用volatile并不是一个合理的解决方案,因为volatile只能够保证读和写的多个线程之间的可见性...

2019-09-29 15:54:35

阅读数 7

评论数 0

原创 6-深入理解volatile原理与使用

深入理解volatile原理 volatile:称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的。 可见:一个线程修改了这个变量的值,在另一个线程中能够读取到这个修改后的值。 synchronized除了线程之间互斥之外,还有一个非常大的作用,就是保证可见性。以下demo即保...

2019-09-29 14:50:30

阅读数 12

评论数 0

原创 5-理解自旋锁,重入锁

重入锁 重入锁,也就是锁重入,什么意思呢?之前我们用到的synchronized就是一个重入锁。那么,什么是重入锁呢? 先说非重入锁,我们知道,当多个线程来访问一个方法的时候,比如说这个方法上已经加了一个synchronized,多个线程来进行访问的时候,那么,显然,当一个线程拿到我们的锁之后...

2019-09-27 17:28:11

阅读数 12

评论数 0

原创 Spring Boot之日志配置-logback和log4j2

一、简介 支持日志框架:Java Util Logging, Log4J2 and Logback,默认是使用logback 配置方式: 默认配置文件配置 引用外部配置文件配置 二、默认配置文件配置(不建议使用:不够灵活,对log4j2等不够友好) # 日志文件名,比如:ron...

2019-09-20 04:44:57

阅读数 12

评论数 0

原创 Spring Boot -- 配置文件详解:Properties 和 YAML

配置文件的生效顺序,会对值进行覆盖 @TestPropertySource 注解 命令行参数 Jave 系统属性(System.getProperties()) 操作系统环境变量 只有在 random.* 里包含的属性会产生一个 RandomValuePropertySource 在打...

2019-09-20 04:27:25

阅读数 8

评论数 0

原创 RabbitMQ的持久化与非持久化

登录RabbitMQ的图形化管理界面,选择“Queue”队列查看模块,可以看到之前在Spring-Rabbit工程中创建的MyQueue的队列: 我们可以观察到在“myQueue”列中,后面有一个Features的属性,为“D”,和下面的队列都有不同,这是一个什么参数呢?其实该参数“D”就是...

2019-09-18 17:35:33

阅读数 14

评论数 0

原创 死信消息与延时消息的两种实现

死信队列介绍 死信队列:DLX,dead-letter-exchange 利用DLX,当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX Dead Letter Exchanges(DLX)特性 Ra...

2019-09-03 20:08:51

阅读数 59

评论数 0

原创 RabbitMQ:消息发送确认 与 消息接收确认(ACK)

默认情况下如果一个 Message 被消费者所正确接收则会被从 Queue 中移除 如果一个 Queue 没被任何消费者订阅,那么这个 Queue 中的消息会被 Cache(缓存),当有消费者订阅时则会立即发送,当 Message 被消费者正确接收时,就会被从 Queue 中移除 为什么...

2019-08-30 17:55:19

阅读数 29

评论数 0

原创 发布/订阅模式Publish/Subscribe、路由模式Routing、通配符模式Topics

发布/订阅模式Publish/Subscribe、路由模式Routing、通配符模式Topics 这三种模式其实都可以归为一种,叫做交换机模式。 只不过交换机的类型不一样。 发布/订阅模式Publish/Subscribe 使用交换机类型为fanout 路由模式Routing 使用交换机类型...

2019-08-30 16:38:43

阅读数 29

评论数 0

原创 work工作模式(资源的竞争)

功能:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列 消息产生者将消息放入队列消费者可以有多个,消费者1 ,消费者2 , 同时监听同一个队列,消息被消费? C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消...

2019-08-30 16:18:28

阅读数 19

评论数 0

原创 简单模式Hello World

功能:一个生产者P发送消息到队列Q,一个消费者C接收 生产者实现思路: 创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道...

2019-08-30 16:04:07

阅读数 18

评论数 0

原创 RabbitMQ基本概念介绍

目录 一、Producer:生产者,消息的投递方 二、Consumer :消费者,就是接收消息的一方 三、Broker :消息中间件的服务节点 四、Queue :队列,是RabbitMQ的内部对象,用于存储消息 五、Exchange:交换器 六、RoutingKey :路由键 七、B...

2019-08-30 15:41:51

阅读数 24

评论数 0

原创 37-缓存预热实现

上一篇文章的时候,我们大概的讲了一下缓存预热的步骤和思路。大概分为六个步骤。这里开始我们说一下大概的实现。 1、将访问流量上报到消息队列中 如果一个电商网站,当顾客去访问商品的时候,我们便可以将这个请求的商品信息上传到mq,其实这一步比较简单,根据自己的代码逻辑,加上上传mq的代码即可。 因...

2019-08-30 14:24:57

阅读数 37

评论数 0

原创 36-缓存冷启动问题:新系统上线、redis彻底崩溃导致数据无法恢复两种情况

缓存冷启动,redis启动后,一点数据都没有,直接就对外提供服务了,mysql就裸奔,就容易崩溃 缓存预热思路 (1)提前给redis中灌入部分数据,再提供服务 (2)肯定不可能将所有数据都写入redis,因为数据量太大了,第一耗费的时间太长了,第二根本redis容纳不下所有的数据 (3)需要...

2019-08-23 15:06:03

阅读数 33

评论数 0

原创 35-Storm学习-Storm教程:纯手工集群部署Storm

上一章节讲了如何手写一个storm wordcount程序:34-Storm学习-Storm教程:纯手敲WordCount程序 蕴含了很多的知识点,如下: (1)Spout (2)Bolt (3)OutputCollector,Declarer (4)Topology (5)设置worker,...

2019-08-21 02:19:14

阅读数 2015

评论数 0

转载 Stream入门及Stream在JVM中的线程表现

目录 一、什么是 Stream 二、Stream 操作的三个步骤 三、创建Stream 的四种方式 四、Stream 中间操作 1). 筛选与切片 2).跳过元素 3).筛选 4).映射 5).排序 五、Stream 终止操作 1). 查找与匹配 2). 归约(可以将流中元...

2019-08-20 16:00:59

阅读数 35

评论数 0

原创 Lambda语法精讲

lambda的语法 简述:一个不用被绑定到一个标识符上,并且可能被调用的函数。 这个解释还不够通俗,lambda表达式可以这样定义(不精确,自己的理解):一段带有输入参数的可执行语句块。 lambda表达式的一般语法: 上面的lambda表达式语法可以认为是最全的版本,写起来还是稍稍有...

2019-08-19 14:34:46

阅读数 25

评论数 0

原创 Lambda表达式

什么是Lambda表达式? Lambada表达式: 它们通过使用表达式来提供一种清晰简洁的方式来表示方法接口 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参...

2019-08-13 17:21:09

阅读数 26

评论数 0

原创 Java设计模式—策略模式

特点 策略模式体现了面向对象程序设计中非常重要的两个原则: 封装变化的概念。 编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。 举例:我们就以Java中的TreeSet为例,TreeSet仅仅知道它只是接收一个Comparator这种接口类型,但是具体是哪种实现类,TreeSet...

2019-08-13 14:15:14

阅读数 26

评论数 0

原创 4-synchronized保证线程安全的原理

synchronized保证线程安全的原理-内置锁 在看synchronized之前,我们首先来看内置锁,什么是内置锁呢?就是说,Java中每一个对象都可以用作同步的锁,那么,这些锁就被称之为内置锁. 其实synchronized的原理其实就是加了锁,内置锁和互斥锁所决定的。每个对象都有锁,而...

2019-08-08 15:13:11

阅读数 44

评论数 0

原创 3-多线程存在哪些问题

目录 多线程存在哪些问题 1.线程安全性问题 什么是线程安全问题? 线程安全问题产生的根本原因 线程安全问题解决思路 2.性能问题:线程上下文切换,带来一定的性能损耗。 3.活跃性问题:死锁、饥饿、活锁。 死锁: java中导致死锁的原因 java避免死锁的解决意见 饥饿: ...

2019-07-23 17:21:05

阅读数 59

评论数 0

原创 34-Storm学习-Storm教程:纯手敲WordCount程序

storm核心的基本原理,上一篇我们大概都了解了一下。 33-Storm学习-史上最通俗易懂Storm教程:大白话介绍Storm 现在我们,写一下代码,去体验一下storm的程序是怎么开发的,通过了解了代码之后,再回头去看一下之前讲解的一些基本原理,就清楚了一些。 案列做一个单词计数器。 ...

2019-07-23 14:35:48

阅读数 46

评论数 0

原创 springboot+redis+切面实现数据字典功能

自定义注解:DataDict,用于bo对象类,需要翻译的属性 package com.zddts.common.annotation.dict; import java.lang.annotation.*; /** * 说明:数据字典处理类 * Created by luojie ...

2019-07-22 16:00:36

阅读数 79

评论数 0

原创 33-Storm学习-史上最通俗易懂Storm教程:大白话介绍Storm

一、Storm到底是什么? Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。 Storm 是一个分布式的,可靠的,容错的数据流处理系统。它会把工作任务委托给不同类型的组件,每个组件负责处理一项简单特定的任务。 相较于hadoop...

2019-07-15 22:23:05

阅读数 60

评论数 0

原创 32-分布式锁-zookeeper实现分布式锁

zk分布式锁的原理: 查看文章:zookeeper分布式锁实现 我们通过去创建zk的一个临时node,来模拟给一个商品id加锁 zk会保证只会创建一个临时node,其他请求过来如果再要创建临时node,就会报错,NodeExistsException 那么说我们的所谓上锁,其实就是去创建某...

2019-07-15 21:50:34

阅读数 37

评论数 0

原创 2-创建线程的四种方式

1.继承Thread类实现多线程 通过继承Thread类来创建并启动多线程的一般步骤如下 1、定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。 2、创建Thread子类的实例,也就是创建了线程对象 3、启动线程,即...

2019-07-12 16:37:04

阅读数 26

评论数 0

原创 1-线程的状态

线程状态介绍 在线程的生命周期中,它要经过7种状态。 初始化状态 通过实现Runnable接口,new出来实例,线程进入初始化状态。 就绪状态 初始化状态调用start()方法,启动一个线程,程序进入了就绪状态,因为还没有抢到CPU资源。 运行状态 线程抢占到CPU资源。...

2019-07-12 14:32:01

阅读数 19

评论数 0

原创 Mysql索引的理解

相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构. 索引概念 索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。 索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录...

2019-07-11 11:08:56

阅读数 36

评论数 0

原创 31-多级缓存架构-业务层缓存实现-基于nginx+lua+java完成多级缓存架构的核心业务逻辑

业务层缓存实现 在上一篇我们完成了分发层nginx得配置。上一层操作我们只是在lua脚本中获取产品id,然后进行这次。这次做一些修改,分发层nginx,lua应用,会将商品id,商品店铺id,都转发到后端的应用nginx。 业务逻辑 1、应用nginx的lua脚本接收到请求 2、获取请求参...

2019-07-10 17:41:56

阅读数 35

评论数 0

原创 30-多级缓存架构-分发层缓存实现-部署分发层nginx以及基于lua完成基于商品id的定向流量分发策略

基于OpenResty在另外两台机器上都部署一下nginx+lua的开发环境 我已经在01、02和03上都部署好了 是打算用01和02作为应用层nginx服务器,用03作为分发层nginx。 在03,也就是分发层nginx中,编写lua脚本,完成基于商品id的流量分发策略 当然了,我们这里...

2019-06-17 15:16:37

阅读数 74

评论数 0

原创 29-多级缓存架构-基于OpenResty部署应用层nginx以及nginx+lua开发hello world

我们这里使用nginx,全都会在nginx里去写lua脚本,因为我们需要自定义一些特殊的业务逻辑。 比如说,流量分发,自己用lua去写分发的逻辑,在分发层nginx里去写的 再比如说,要用lua去写多级缓存架构存取的控制逻辑,在应用层nginx里去写的 后面还要做热点数据的自动降级机制,也是...

2019-06-14 16:53:56

阅读数 105

评论数 0

提示
确定要删除当前文章?
取消 删除