- 博客(217)
- 收藏
- 关注
原创 Docker镜像
是什么:是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。分层的镜像:以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载UnionFS(联合文件系统): Union文件系统(UnionFS)是一种分层、轻量级
2022-03-26 17:32:13
284
原创 Docker常用命令
有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)docker pull centosdocker pull ubuntu新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]OPTIONS说明(常用):有些是一个减号,有些是两个减号–name=“容器新名字” 为容器指定一个名称;-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);-i:以交互模式运行容器,通常与 -t 同时
2022-03-26 16:35:25
1527
原创 Docker配置阿里云镜像加速
是什么?https://promotion.aliyun.com/ntms/act/kubernetes.html注册一个属于自己的阿里云账户(可复用淘宝账号)获得加速器地址连接:登陆阿里云开发者平台:点击控制台:选择容器镜像服务:获取加速器地址:粘贴脚本直接执行:直接粘:mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://aa25jng
2022-03-26 16:10:59
1598
原创 Docker安装
镜像:Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。容器:1 从面向对象角度Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在
2022-03-26 16:04:27
843
原创 Docker为什么会比VM虚拟机快
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2022-03-12 15:12:10
1659
原创 SpringBoot自定义条件注解
开发过程中经常用到自定义条件注解,今天记录一个这个常用的小技巧:需求是当某些属性存在的时候,才能注入Bean第一步:实现Condition接口 注意是import org.springframework.context.annotation.Condition;这个包下面的import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionC
2021-09-19 20:43:14
355
原创 @Resource与@AutoWired的区别
@Autowired是spring定义的注解,而@Resource是JSR-250定义的注解@Autowire默认是按照ByType自动装配,而@resource默认是byName自动装配@Autowired只包含了一个参数:required,表示是否开启自动准入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name和type@Autowired如果使用ByName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配.
2021-09-04 16:14:08
164
原创 JUC基础知识扫盲
进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。是指系统中正在运行的一个应用程序;程序一旦运行就是进程,进程----资源分配的最小的单元线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单元。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同的任务。系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程-----程序执行的最小单元。线程
2021-07-27 23:33:40
183
原创 redis数据类型及底层实现(三)
总结:redis数据类型以及数据结构的关系:不同数据类型对应的底层数据结构:1. 字符串int:8个字节的长整型。embstr:小于等于44个字节的字符串。raw:大于44个字节的字符串。Redis会根据当前值的类型和长度决定使用哪种内部编码实现。2. 哈希ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64 字节)时,Redis会使用zipl
2021-05-30 18:26:23
204
1
原创 redis数据类型及底层实现(二)
Hash数据结构介绍:案例:hash-max-ziplist-entries:使用压缩列表保存时哈希集合中的最大元素个数。hash-max-ziplist-value:使用压缩列表保存时哈希集合中单个元素的最大长度。Hash类型键的字段个数 小于 hash-max-ziplist-entries 并且每个字段名和字段值的长度 小于 hash-max-ziplist-value 时,Redis才会使用 OBJ_ENCODING_ZIPLIST来存储该键,前述条件任意一个不满足则会转换为 OBJ_EN
2021-05-30 18:24:07
315
原创 redis数据类型及底层实现(一)
Redis源代码的核心部分:src源码包下面该如何看?Redis基本的数据结构(骨架):1.简单动态字符串sds.c2.整数集合intset.c3.压缩列表ziplist.c4.快速链表quicklist.c5.字典dict.c6.Streams的底层实现结构listpack.c和rax.cRedis数据类型的底层实现:Github官网说明:https://github.com/redis/redisRedis对象object.c字符串t_string.c列表t_list.c字
2021-05-30 18:03:09
289
原创 Redis的缓存过期淘汰策略
Redis的缓存过期淘汰策略Redis内存满了怎么办?redis默认内存多少?在哪里查看?如何设置修改?查看Redis最大占用内存打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。redis默认内存多少可以用?一般生产上你如何配置?一般推荐Redis设置内存为最大物理内存的四分之三如何修改redis内存设置:通过修改文件配置:通过命令修改:什么命令查看redis内存使用情况?info memory真要打满了会怎么样?如果
2021-05-28 22:24:34
195
原创 Redis分布式锁
使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击)Redis分布式锁比较正确的姿势是采用redisson这个客户端工具RedLock理念:http://redis.cn/topics/distlock.htmlredisson实现:Redisson是java的redis客户端之一,提供了一些api方便操作redisredisson之官网:https://redisson.org/redisson之Github:https://github.co
2021-05-26 23:00:34
329
原创 缓存击穿
缓存击穿:大量的请求同时查询一个key时,此时这个key正好失效了,就会导致大量的请求打到数据库上面去。简单说就是热点Key突然失效了,暴打mysql危害:会造成某一时刻数据库请求量过大,压力剧增解决:方案1: 缓存击穿------热点Key失效-------互斥更新、随机退避、差异失效时间方案2: 对于访问频繁的热点key,干脆就不设置过期时间方案3:互斥锁独占防止击穿 多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。其他的线程走到
2021-05-23 14:35:25
623
3
原创 缓存雪崩和缓存穿透
缓存雪崩发生:redis主机挂了,Redis 全盘崩溃比如缓存中有大量数据同时过期解决:redis缓存集群实现高可用,主从+哨兵Redis Clusterehcache本地缓存 + Hystrix或者阿里sentinel限流&降级开启Redis持久化机制aof/rdb,尽快恢复缓存集群缓存穿透:请求去查询一条记录,先redis后mysql发现都查询不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这种现象我们称为缓存穿透,这个redis变成了一个摆设。。
2021-05-22 17:13:42
170
原创 布隆过滤器BloomFilter
布隆过滤器BloomFilter:是什么?由一个初值都为零的bit数组和多个哈希函数构成,用来快速判断某个数据是否存在本质就是判断具体数据存不存在一个大的集合中布隆过滤器是一种类似set的数据结构,只是统计的结果不太准确特点:1.高效的插入和查询,占用空间少,返回的结果是不确定的。2.一个元素如果判断结果为存在的时候元素不一定存在但是判断结果为不存在的时候则一定不存在3.布隆过滤器可以添加元素,但是不能删除元素 因为删除元素会导致误判率增加4. 误判只会发生在过滤器没有添加过的元素,对
2021-05-22 16:58:12
305
原创 Redis的GEO
GEO简介:移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名曲他在地球的位置。例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆使用如下SQL即可:sele
2021-05-19 23:28:39
289
原创 Redis的hyperloglog
互联网名词:什么是UV?Unique Visitor,独立访客,一般理解为客户端IP,需要去重考虑什么是PV?Page View,页面浏览量,不用去重什么是DAU?Daily Active User 日活跃用户量登录或者使用了某个产品的用户数(去重复登录的用户)常用于反映网站、互联网应用或者网络游戏的运营情况什么是MAU?MonthIy Active User 月活跃用户量看需求:统计某个网站的UV、统计某个文章的UV用户搜索网站关键词的数量统计用户每天搜索不同词条
2021-05-19 23:04:09
386
2
原创 标记-压缩算法
标记压缩算法:指针碰撞:优点:消除了标记-清除算法当中,内存区域分散的缺点,我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可。消除了复制算法当中,内存减半的高额代价缺点:从效率上来说,标记-整理算法要低于复制算法移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址移动过程中,需要全程暂停用户的应用程序,即STW...
2021-05-18 23:43:47
658
原创 复制算法
复制算法:优点:没有标记和清除过程,实现简单,运行高效复制过去以后保证空间的连续性,不会出现碎片问题缺点:此算法的缺点也是很明显的,就是需要两倍的内存空间对于G1这种分拆成为大量的region的GC,复制而不是移动,意味着GC需要维护region之间对象引用关系,不管是内存占用或时间开销也不小特别的:如果系统中垃圾对象很多,复制算法需要复制的存活对象数量并不会太大,或者说非常低才行。...
2021-05-18 23:37:22
453
原创 标记清除算法
标记-清除(Mark-Sweep)算法:执行过程:当堆中的有效内存空间被耗尽的时候,就会停止整个程序,然后进行两项工作,第一项则是标记,第二项则是清除。标记: Collector从引用根节点开始遍历,标记所有被引用的对象,一般是在对象的Header中记录为可达对象。清除:Collector对堆内存从头到未进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收。缺点:效率不算高在进行GC的时候,需要停止整个应用程序,导致用户体验差这种方式清理出来的空闲内存时不连续
2021-05-18 23:32:12
454
原创 可达性分析算法
可达分析算法: 相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法 可以有效地** 解决在引用计数算法中循环引用的问题,防止内存泄漏的发生**所谓GCRoots根集合就是一组必须活跃的引用:在Java语言中,GCRoots包含以下几类元素:除了这些固定的GCRoots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象临时性加入,共同构成完整GCRoots集合,比如 分代收集和局部回收小技巧:由于Root,采用
2021-05-18 22:48:18
279
原创 引用计数算法
垃圾标记阶段:对象存活判断在堆里面存放着几乎所有的java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段判断对象存活一般有两种方式: 引用计数算法和可达性分析算法...
2021-05-18 22:37:00
76
原创 虚拟机栈
虚拟机栈:优点,跨平台,指令集小,编译器容易实现缺点,性能下降,实现同样的功能需要更多的指令栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪java虚拟机栈是什么?每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用 ,线程私有的生命周期和线程一致作用:主管Java程序的运行,它保存方法的局部变量、部分结果、并参与方法的调用和返回。栈的特点(优点):栈是
2021-05-17 22:49:57
99
原创 程序计数器
介绍:JVM中的程序计数寄存器中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息,CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器会更加贴切,并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟作用:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令?它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域。在JVM规范中,每个线
2021-05-16 23:27:25
176
原创 运行时数据区基础理论
图解:JVM的内存布局:关于线程间共享的说明:线程:线程是一个程序里的运行单元。JVM运行一个应用有多个线程并行的执行。在HotspotJVM里,每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建,Java线程执行终止后,本地线程也会回收、操作系统负载所有线程的安排调度到任何一个可用的CPU上,一旦本地线程初始化成功,它就会调用java线程中的run()方法。...
2021-05-16 22:55:33
63
原创 Redis新类型bitmap
常见的四种统计聚合统计:统计多个集合元素的聚合结果,就是交差并等集合统计交并差集和聚合函数的应用排序统计:抖音视频最新评论留言的场景,请你设计一个展现列表。考察你的数据结构和设计思路?设计案例和回答思路:以抖音vcr最新的留言评价为案例,所有评论需要两个功能,按照时间排序+分页显示能够排序+分页显示的redis数据结构是什么合适?answer:list:每个商品评价对应一个list集合,这个List包含了对这个商品的所有评论,而且会按照评论时间保存这些评论,每一个新评论就用LPU
2021-05-16 22:18:16
380
1
原创 jvm-类加载子系统
类加载器与类加载过程:加载:1.通过一个类的全限定名获取定义此类的二进制字节流2.将这个字节流所代表的静态静态存储结构转化为方法区的运行时数据结构3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口补充:加载.class 文件的方式从本地系统中直接加载通过网络获取,典型场景,WebApplet从zip压缩包中读取,成为日后jar、war格式的基础运行时计算生成,使用最多的是:动态代理技术由其他文件生成,典型场景:JSP应用从
2021-05-15 22:07:43
95
原创 Redis入门篇
redis官网查阅和基本配置:https://redis.io/http://redis.cn/https://redis.io/download官网命令大全网址http://www.redis.cn/commands.htmlhttp://doc.redisfans.com/安全Bug按照官网提示,升级成为6.0.8查看自己redis版本的命令redis配置文件初始redis.conf配置文件2.1 修改daemonize 改为 daemonize yes2.2 修改pro
2021-05-12 23:14:43
283
1
原创 分析GC日志
GC日志参数:-verbose:gc 输出gc日志信息,默认输出到标准输出-XX:+PrintGC 输出GC日志。类似:-verbose:gc-XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况-XX:+PrintGCTimeStamps 输出GC发生时的时间戳-XX:+PrintGCDateStamps 输出GC发生时的时间戳(以日期的形式,如
2021-05-03 18:14:43
166
原创 垃圾回收器
GC分类:按照线程数分,可以分为串行垃圾回收器和并行垃圾回收器按照工作模式分为,并发式垃圾回收器和独占式垃圾回收器:并发式垃圾回收器,与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。独占式垃圾回收器,一旦运行,就停止应用程序中的其他所有线程,直到垃圾回收过程完全结束。按碎片处理方式可以分为压缩式垃圾回收器和非压缩式垃圾回收器:压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。非压缩式的垃圾回收器不进行这步操作。按工作的内存区间,又可分为年轻代垃圾回收器和老年
2021-05-03 16:23:49
106
原创 Spring事物的传播属性
Transactional没有开启事物之前,运行代码,如果代码中出现异常,异常前进行的数据库操作会保存到数据库中,异常后进行的数据库操作不会保存到数据库中Propagation属性:REQUIRED:使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的;如果当前存在事务,则加入这个事务,成为一个整体。// 父类service方法 @Transactional(propagation = Propagation.REQUIRED) @Overri
2021-04-23 23:03:24
165
原创 Spring循环依赖
什么是循环依赖?多个bean之间相互依赖,形成了一个闭环。 比如:A依赖于B、B依赖于c、c依赖于A通常来说,如果问spring容器内部如何解决循环依赖, 一定是指默认的单例Bean中,属性互相引用的场景也就是说,Spring的循环依赖,是Spring容器注入时候出现的问题两种注入方式对循环依赖的影响:我们AB循环依赖问题只要A的注入方式是setter且singleton, 就不会有循环依赖问题spring容器循环依赖报错演示BeanCurrentlylnCreationException:
2021-04-22 21:46:08
133
原创 全局唯一ID
索引:既然分布式id是主键,然后主键是包含索引的,然后mysql索引是通过b+树来实现的,每一次新的UUID数据插入,为了查询的优化,都会对索引底层的b+树进行修改,因为UUID数据是无序的,所以每一次UUID数据的插入都会对主键的b+树进行很大的修改,这一点很不好。插入完全无序,不但会导致一些中间节点产生分裂,也会白白创造出很多不饱和的节点,这样大大降低了数据库插入的性能。mysql自增:在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace int
2021-04-15 21:02:19
116
原创 redis缓存过期淘汰策略
redis默认内存多少?在哪里查看? 如何设置修改?查看Redis最大占用内存:redis默认内存多少可以用?一般生产上你如何配置?一般推荐Redis设置内存为最大物理内存的四分之三,也就是0.75如何修改redis内存设置:通过修改文件配置;通过命令修改:什么命令查看redis内存使用情况?info memory真要打满了会怎么样? 如果Redis内存使用超出了设置的最大值会怎样?改改配置,故意把最大值设为1个byte试试设置了maxmemory的选项,假如redis内存
2021-04-14 22:08:31
244
原创 Redis基本数据类型及分布式锁的使用
redis 官网命令查看 http://www.redis.cn/commands.html八大类型:1.String(字符类型)最常用:set key valueget key同时设置/获取多个键值:MSET key value [key value …]MGET key [key …]数值增减:递增数字: INCR key增加指定的整数: INCRBY key increment递减数值: DECR key减少指定的整数: DECRBY key decrement获取字符
2021-04-14 21:35:56
648
原创 ThreadLocal
ThreadLocal简介:是什么?ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。能干嘛?实现每一个线程都有自己专属的本地变量副本(自己用自己的变量不麻烦别人,不和其他人共享,人人有份,人各一份),主要解决了让每个线程绑定自己的值,通过使用get(
2021-04-08 19:33:31
145
原创 原子操作类
基本类型原子类AtomicIntegerAtomicBooleanAtomicLong常用API简介public final int get() //获取当前的值public final int getAndSet(int newValue)//获取当前的值,并设置新的值public final int getAndIncrement()//获取当前的值,并自增public final int getAndDecrement() //获取当前的值,并自减public final int .
2021-04-08 19:06:39
220
1
原创 CAS
CAScompare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期原值及更新值。执行CAS操作的时候,将内存位置的值与预期原值比较:如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。原理:硬件级别保证:CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性。它是非阻塞的且自身原子性,也就是说这玩意效率更高且通过硬件保证,说明这玩意更
2021-04-08 18:33:32
162
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅