- 博客(50)
- 收藏
- 关注
原创 利用Currenthashmap+FutureTask+分布式锁,解决分布式场景下的线程安全问题
举一个例子某甲方公司要进行招标,来竞标的有A,B,C,D四家公司,每个公司都来了4个人。现有要求在进行产品演示的过程中,每家公司只能出一人与甲方爸爸进行产品演示。问题对于甲方爸爸来说,现在要采取一个方案,保证进入会议室的乙方人员只能是一人正常方案我们一般情况下的方案是,就设置一个门,乙方公司的人都在门外,每次只允许一个人进去。这样做虽然满足要求,但是效率不高,还容易出错。优化方案现在我们设置两道门,第一道门能够保证乙方每个公司都只能进去一个人,那么在第二道门前就只有4个人了,这样效率提高很多,
2022-06-30 18:31:46
717
原创 Nacos源码构建
1.环境准备Nacos版本:我这里用的版本是1.4.1,github中下载源码就好Protoc版本:windows版本的3.17.3,地址:https://github.com/protocolbuffers/protobuf/releasesJava版本:1.82.使用maven打开项目3.安装Protoc,设置环境变量然后我们cmd打开后执行下:protoc --version接下来进入到源码的consistency/src/main/proto/路径下,使用cmd命令,运行如
2021-07-27 19:32:13
294
原创 Thumbnails压缩图片
应用场景在和腾讯广点通交互生成视频的智能封面时,由于返回的智能封面图片的大小太大超出了限制,因此需要把图片压缩大小后再上传至腾讯关于图片压缩的解决方案在这里我主要使用的是Thumbnails来进行图片的压缩,下面会简单介绍一下工具类的使用。依赖<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId>
2021-07-14 15:48:52
2790
1
原创 SpringBoot系列:自定义统一接口返回格式和统一全局异常处理
前言在我们日常后台的开发中,统一的接口数据返回格式以及统一的全局异常处理,能够大大的提高我们开发效率和接口的友好性,当我们在写后台代码时,在我们的业务中出现一些判断的结果时,可以直接抛出自定义的异常,controller会做一个统一的异常处理返回给前端,我们只需要关注业务返回的结果就好了,把统一的数据返回格式写在controller层就好了。开始(1)定义一个基础的错误信息接口类public interface BaseErrorInterface { /** * 错误码
2021-01-16 15:08:52
1186
1
原创 Redis系列:缓存击穿.穿透.雪崩(九)
什么是热key吗?热key问题怎么解决?所谓热key问题就是,突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机引发雪崩针对热key的解决方案:(1)提前把热key打散到不同的服务器,降低压力(2)加入二级缓存,提前加载热key数据到内存中,如果redis宕机,走内存查询缓存击穿缓存击穿的概念就是单个key并发访问过高,过期时导致所有请求直接打到db上,这个和热key的问题比较类似,只是说的点在
2020-12-15 21:49:37
288
原创 Redis系列:事务机制(三)
快速理解redis的事务机制redis通过MULTI、EXEC、WATCH等命令来实现事务机制,事务执行过程将一系列多个命令按照顺序一次性执行,并且在执行期间,事务不会被中断,也不会去执行客户端的其他请求,直到所有命令执行完毕。事务的执行过程如下:(1)服务端收到客户端请求,事务以MULTI开始(2)如果客户端正处于事务状态,则会把事务放入队列同时返回给客户端QUEUED,反之则直接执行这个命令(3)当收到客户端EXEC命令时,WATCH命令监视整个事务中的key是否有被修改,如果有则返回空回复到客
2020-12-15 19:09:35
114
原创 Redis系列:哨兵模式(八)
序言基于主从方案的缺点还是很明显的,假设master宕机,那么就不能写入数据,那么slave也就失去了作用,整个架构就不可用了,除非你手动切换,主要原因就是因为没有自动故障转移机制。而哨兵(sentinel)的功能比单纯的主从架构全面的多了,它具备自动故障转移、集群监控、消息通知等功能。哨兵模式原理哨兵可以同时监视多个主从服务器,并且在被监视的master下线时,自动将某个slave提升为master,然后由新的master继续接收命令。整个过程如下:(1)初始化sentinel,将普通的redi
2020-12-15 19:05:15
247
1
原创 Redis系列:redis主从复制(七)
序言主从复制简单来说就是把redis_a服务器上的数据复制到redis_b,redis_c,redis_d等等服务器上,前者redis_a称为主节点(master),后者redis_b,redis_c…等被称为从节点(slave)。
2020-12-15 16:42:37
188
1
原创 Redis系列:redis持久化(六)
序言在之前的文章种主要介绍了redis的基础部分。在memcache和redis对比中,redis提供可靠的数据持久化方案,而memcache没有数据持久化方案。在这篇文章种我将详细介绍redis所提供的持久化方案:RDB持久化和AOF持久化以及redis新特性混合持久化。redis的持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。理解掌握持久化机制对于我们学习redis非常重要。RDB持久化RDB持久化方式是通过快照(snapshotting)完
2020-11-30 18:24:14
126
原创 Redis系列:Redis.conf详解(五)
序言本篇文章主要是围绕redis.conf配置文件详解,来配置自己的redis.conf,并且通过配置文件来启动redis。正文(1)单位# Note on units: when memory size is needed, it is possible to specify# it in the usual form of 1k 5GB 4M and so forth:1k => 1000 bytes1kb => 1024 bytes1m => 1000000 byte
2020-11-28 19:54:44
207
原创 Redis系列:自定义Redistemplate和RediUtil撰写(四)
序言在前面的文章中,关于RedisConfig配置中Redistemplate的重写没有过多的介绍,在这篇文章中具体讲Redistemplate的通用配置,拿来就能用。还会补充通用的RediUtils的撰写(企业开发中常用)等自定义Redistemplate首先我们找到org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration:然后我们点进去看一下redis自动配置的源码如下:@Configuration(
2020-11-27 19:07:07
358
原创 Redis系列:五大基本类型和三大特殊类型详细解析(二)
序言Redis是一个开源(BSD许可),内存中的数据结构存储,用作数据库、缓存和消息代理。它支持数据结构,如字符串、哈希、列表、集合、带范围查询的排序集、位图、超日志、带有radius查询和流的地理空间索引。Redis-key的基本知识127.0.0.1:6379> set name xiaotang //设置keyOK127.0.0.1:6379> keys * //查看所有key1) "name"127.0.0.1:6379> exists name //判断key
2020-11-24 20:08:51
849
原创 Redis系列:安装和基础知识(一)
在Linux中使用docker安装1. docker pull redis:latest //下载redis2. docker images //查看3. docker run -itd --name redis-twy -p 6379:6379 redis //运行redis容器4. docker ps //查看是否运行5. docker exec -it redis-twy /bin/bash //使用 docker exec -it redis /bin/bash进入redis
2020-11-21 09:54:34
202
原创 SpringBoot系列:Redis消息的发布和订阅(三)
序言redis不但能用于对数据的CRUD,也可以作为一个消息中间件,用来进行消息的发布和订阅。在下面的demo中,配置了多个监听器,来监听不同的通道。消息的发布创建一个消息发布者类MessageSender.java,两个发送者分别向通道chatA和通道chatB发送消息:/** * 消息发布者 */@EnableScheduling//开启定时器功能@Component//自动注入public class MessageSender { @Autowired priva
2020-11-19 21:46:49
198
2
原创 SpringBoot系列:Redis的不同类型值的存取(二)
序言在SpringBoot系列:简单整合redis(一)文章中已经具体的阐述了怎么安装Redis及SpringBoot整合Redis的环境的配置等,在接下来关于Redis的文章中就不会去一一阐述环境的配置了。Redis的不同类型值的存取/** * Redis的值的各种方式的存储与取出 */@RestController@RequestMapping("RedisStoreValueTest")public class RedisController { @Autowired
2020-11-19 10:17:38
729
4
原创 SpringBoot系列:自动装配原理分析
序言不管在工作中还是在求职面试中,SpringBoot成为了我们必会的知识技能之一。当然,作为Spring Boot的精髓,自动配置原理首当其冲。在本文章的下面,也是自己在源代码中挣扎的一些简单理解。原理分析首先打开一个基本的springboot项目,我们可以看到@SpringBootApplication,说明这个类是SpringBoot的主配置类,SpringBoot就会运行这个类的main方法来启动SpringBoot项目:点进去@SpringBootApplication注解,我们
2020-11-15 23:01:01
179
原创 SpringBoot系列:多数据源动态切换(AOP方式实现)
序言在平常,项目中经常会有集成其他数据库的情况,项目是使用spring Boot+Druid+Mybatis Plus开发的前提下。在本次的文章中主要使用SpringBoot+Mybatisplus+druid实现多数据源的动态切换,使用AOP的方式动态的获取数据源。在上一篇的文章中具体讲了怎么去整合MybatisPlus:SpringBoot系列:带你整合MybatisPlus。环境搭建首先我们准备好要用的数据源,在这里我准备了两个环境的数据库,一个是本地的MySql,还有一个是服务器上的MyS
2020-11-14 19:15:18
840
原创 SpringBoot系列:带你整合MybatisPlus
简介MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。特性(来自:官网):无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用:
2020-11-13 17:12:07
281
原创 你最想要的RabbitMQ干货来啦!!!
序言在文章的开始,首先引出几个问题:你是否还在为两个(多个)系统间需要通过定时任务来同步某些数据而苦恼?你是否在为异构系统的不同进程间相互调用、通讯的问题而苦恼、挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题。消息服务擅长于解决多系统、异构系统间的数据交换(消息通知/通讯)问题,你也可以把它用于系统间服务的相互调用(RPC)。本文将要介绍的RabbitMQ就是当前最主流的消息中间件之一。主要通过概念的阐述和示例的结合来简单的介绍RabbitMQ,希望能有所帮助。基本概念Ra
2020-11-07 11:32:14
265
原创 Spring5----学习笔记(上)
IOC理论推导在这里我会通过一个简单的例子来引出IOC,首先我们简单的新建一个maven项目,里面主要有dao层和service层,具体的代码如下://userDao层接口public interface UserDao { void getUserData();}//获取mysql数据的实现public class UserMysqlDaoImpl implements UserDao{ public void getUserData() { System.ou
2020-10-22 14:32:00
147
4
原创 Java编程思想:动态代理的实现
简介代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际对象”的对象,这些操作通常涉及与“实际对象”的通信,因此代理通常充当中间人的角色,我们首先展示简单的静态代理从而引出动态代理。静态代理/** * 简单静态代理 */interface Interface{ void doSomething(); void somethingElse(String arg);}class RealObject implements Interface{
2020-10-11 20:10:55
169
原创 Java编程思想:关于Java中 ? extends T 和 ? super T 的理解
?通配符类型<? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类;(上界通配符)<? super T> 表示类型下界,表示参数化类型是此类型的超类型(父类型),直至Object;(下界通配符)上界通配符<? extends T>不能往里存,只能往外取public class test { public static void main(String[] args) { List<Class&
2020-10-11 09:02:08
455
原创 SpringBoot系列:简单整合redis(一)
简介Redis的特点:1,Redis读取的速度是110000次/s,写的速度是81000次/s;2,原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。3,支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)4,持久化,集群部署5,支持过期时间,支持事务,消息订阅redis的配置依赖<!-- redis --> <dependency> <grou
2020-09-29 00:10:25
322
原创 letcode_实现strStr()
题目实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needle = "bba"输出: -1来源:力扣(LeetCode)解法一:(窗口移动)思路 子串逐一比较:沿
2020-08-31 19:18:36
115
原创 letcode_合并两个有序链表
题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解法一:迭代思路 (1)当l1或者l2其中一个为空时,则返回相对应的链表 (2)当l1和l2都不为空的时候,判断l1和l2哪一个链表的头节点值更小,将较小值添加到结果链表里 (3)当一个节点被添加到结果链表中时,将对应链表的指针向后移一位代码/**
2020-08-29 10:53:58
86
原创 letcode_有效括号
题目给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出: false示例 4:输入: "([)]"输出: false示例 5:输入: "{[]}"输出: true解法一:暴力解法
2020-08-29 10:45:33
251
原创 letcode--最长公共前缀
题目示例 1:输入: ["flower","flow","flight"]输出: "fl"示例 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。解法一:暴力解法思路 (1)找到字符串数组中字符串最短的长度 (2)循环截取每个字符串放到数组中,循环(1)获取的最短长度,在对每个list去重 (3)如果list去完重以后的长度为1,则说明是公共字符串,否者退出循环,返回代码 /** * 解法一: *
2020-08-23 19:35:12
154
原创 letcode-回文数
普通解法最简单粗暴的解法,把整数转为字符串,并把字符串分割成字符串数组,循环一般的数组判断是否相等。代码一class Solution { public boolean isPalindrome(int x) { //遍历一半数组,判断是否相等 if(x < 0){ return false; } char[] num_char = (x+"").toCharArray(); for(
2020-08-19 14:15:34
147
原创 letcode--最小栈
题目设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null
2020-08-12 19:30:09
121
原创 Letcode--整数反转
题目给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。普遍的思路,新建一个数组反过来存,简单除暴,但是效率和内存消耗大class Solution { public int
2020-08-10 20:46:02
137
1
原创 Letcode-两数之和
题目给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1](1)方法一:双重for循环,简单粗暴class Solution { public int[] twoSum(int[] nums, int target) { int[] index = new int[2]; //双重递归 for(int i = 0;i < nums.
2020-08-09 20:19:40
164
原创 Hystrix的快速入门
Spring Cloud调用接口过程Spring Cloud 在接口调用上,大致会经过如下几个组件配合:Feign ----->Hystrix —>Ribbon —>Http Client(apache http components 或者 Okhttp) 具体交互流程上,如下图所示:接口化请求调用当调用被@FeignClient注解修饰的接口时,在框架内部,将请求转换成Feign的请求实例feign.Request,交由Feign框架处理。Feign :转化请求Feign是一
2020-07-22 21:41:08
422
原创 Nacos和Feign的简单使用
nacosSpring Cloud相关基础服务组件服务发现——Netflix Eureka (Nacos)服务调用——Netflix Feign熔断器——Netflix Hystrix服务网关——Spring Cloud GateWay分布式配置——Spring Cloud Config (Nacos)消息总线 —— Spring Cloud Bus (Nacos)基本概念(1)Nacos 是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理
2020-07-21 09:05:27
21221
4
原创 Java实现阿里云视频点播的功能
获取视频的播放地址1.在阿里云中开通视频点播功能,上传一个测试视频视频基本信息:(视频ID)2.创建一个maven项目,引入依赖<dependencies> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> </d
2020-07-19 11:37:43
3112
1
原创 在Linux服务器上安装SVN并上传项目
安装svn(1)安装svn服务器:yum install subversion(2)查看版本(随自己意愿):svnserve --version创建svn仓库并配置(1)创建svn仓库在/home下创建svn目录并用svn管理员创建库:[root@izbp19p16mcz7awt4d8kahz /]# cd /home [root@izbp19p16mcz7awt4d8kahz home]# mkdir svn[root@izbp19p16mcz7awt4d8kahz home
2020-07-18 10:38:47
751
原创 Tensorflow深度学习的日常——day-5
什么是过拟合(overfitting)?其实过拟合就相当于我们生活中的自负,机器学习模型于自信,已经到了自负的阶段了,这样往往得不到我们想要的结果.分类例子(图引用莫凡python)上图分类的例子中(我们的目的是把红色和蓝色区分开来),其中黑色的曲线是正常的模型。然而绿色的线就是过拟合模型,尽管它很精确的区分了训练数据,但是并没有具体描述这些数据的整体特征,因此我们换上新的测试数据时,适应性会很差。Regression(回归)(图引用莫凡python)由回归例子的图可以看出,..
2020-06-29 18:17:34
118
原创 Tensorflow深度学习的日常——day-4
分类学习基于TensorFlow,实现softmax Regression手写体分类首先先上完整的代码,过后再具体的解析:代码softmax Regression可以算作没有隐含层的最浅的神经网络,实现的过程主要分为四个阶段:1. 定义算法公式,即神经网络前向传播的计算;2. 定义损失函数,选定优化器,并且制定优化器优化损失函数;3. 迭代地对数据进行训练;4. 在测试集或者验证集上对准确率进行计算。具体一些介绍和定义以及代码中重要语法看:http://www.ten
2020-06-29 18:17:00
168
原创 Tensorflow深度学习的日常——day-3
1.可视化神经网络(TensorBoard)在我们运行完程序后,图结构将以日志文件的形式保存到给定的路径下。然后在命令行启动Tensorboardtensorboard --logdir=C://Users//Administrator//Desktop//tensorboard运行完上述代码后,我们可以得到一个ip》》》》http://SC-201706201654:6006然后把其复制粘贴到浏览器打开就好2.可视化day_2 代码的神经网络的建造过程代码:运行结果
2020-06-29 18:16:19
252
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人