自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 资源 (1)
  • 收藏
  • 关注

原创 git入门

Ⅰ-Git操作一、初始化该处是用来提交时当作签名使用的git config --global user.name "我的用户名"git config --global user.email "我的邮箱"#删除配置信息git config --global --unset user.namegit config --global --unset user.email二、Git工作流程与区域1、区域 工作区 平时写代码的文件目录 暂存区...

2021-12-13 19:01:39 359 4

原创 一文搞懂PV、UV、VV、IP及其关系与计算

什么是PV?PV即Page View,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者通过不断的刷新页面,也可以制造出非常高的PV。具体的说,PV值就是所有访问者在24小时(0点到24点)内看了某个网站多少个页面或某个网页多少次。PV是指页面刷新的次数,每一次页面刷新,就算做一次PV流量。度量方法就是从浏览器发出一个对网

2021-12-09 23:44:16 2660 2

原创 jmeter入门

修改编码和中文保存后,重新打开jmeter.bat添加线程组配置线程添加http请求默认值添加http请求

2021-12-08 23:54:49 249 1

原创 MyBatis-Plus代码生成器

打开网站地址:代码生成器(历史版本) | MyBatis-Plus今天讲的是3.5.1之前的版本1.添加依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.

2021-12-07 22:44:27 536 2

原创 ThreadPoolExecutor:线程池不允许使用Executors创建

合理利用线程池能够带来三个好处第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌线程池的主要工作流程从上图我们可以看出,当提交一个新任务到线程池时,线程池的处理流程如下:首先线程池判断基本线程池.

2021-12-03 15:30:39 219

原创 什么是Java内存模型?

内容有点长,请花十分钟认真读,你会收获很多。快读在内存里,Java内存模型规定了所有的变量都存储在主内存(物理内存)中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行。不同的线程无法访问其他线程的工作内存里的内容。我们可以使用下图来表示在逻辑上 线程、主内存、工作内存的三者交互关系。现在,我们都理解了缓存导致了可见性问题,编译优化导致了有序性问题。也就是说解决可见性和有序性问题的最直接的办法就是禁用缓存和编译优化。但是,如果只是简单的禁用了缓存和编译优化,那我们..

2021-12-03 15:23:52 751 3

转载 JVM堆内存溢出后,其他线程是否可继续工作?

最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。由于题目中给出的OOM,java中OOM又分很多类型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久带溢出(“java.lang.OutOfMemoryError:Permgen space”)、不能创建线程(“java.lang.

2021-12-01 08:58:15 580

原创 Redis key的过期时间和永久有效分别怎么设置?

EXPIRE和PERSIST命令。我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢?除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: 定时去清理过期的缓存; 当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断

2021-11-29 16:45:55 1627

原创 Redis的内存淘汰策略有哪些

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。全局的键空间选择性移除 noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。 allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的) allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。 设置过期时间的键空间选择性移除 volatile-lru:当内

2021-11-29 16:45:46 141 2

原创 Redis如何做内存优化?

可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面...

2021-11-29 16:45:37 327

原创 Redis线程模型

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准备好执行连接应答(accept)、读取(read

2021-11-29 16:45:28 83

原创 什么是事务?

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。Redis事务的概念Redis 事务的本质是通过MULTI、EXEC、WATCH等一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。总结说:redis事务就是一次性、顺序性、

2021-11-29 16:45:13 1161

原创 redis集群方案

哨兵的介绍sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 slave 进程是否正常工作。 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。 哨兵...

2021-11-29 16:44:59 564

原创 Redis实现分布式锁

Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系Redis中可以使用SETNX命令实现分布式锁。当且仅当 key 不存在,将 key 的值设为 value。若给定的 key 已经存在,则 SETNX 不做任何动作SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。返回值:设置成功,返回 1 。设置失败,返回 0 。img使用SETNX完成同步锁的流程及事项如下:使用SETNX命令获取锁

2021-11-29 16:44:39 164

原创 什么是 RedLock

Redis 官方站提出了一种权威的基于 Redis 实现分布式锁的方式名叫 Redlock,此种方式比原先的单节点的方法更安全。它可以保证以下特性: 安全特性:互斥访问,即永远只有一个 client 能拿到锁 避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash 了或者出现了网络分区 容错性:只要大部分 Redis 节点存活就可以正常提供服务 ...

2021-11-29 16:44:24 341

原创 redis缓存异常

缓存雪崩缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。解决方案 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。 缓存穿透缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。解决方

2021-11-29 16:43:55 95

原创 如何保证缓存与数据库双写时的数据一致性?

你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。还有一种方式就是可能会暂时产生不一致的情况,但是发生的几率特别小,就是先更

2021-11-29 16:43:44 197

原创 Redis的过期键的删除策略

我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最

2021-11-28 23:07:04 86

原创 Redis持久化数据和缓存怎么做扩容?

如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。 如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。 ...

2021-11-28 23:06:25 1438 1

原创 如何选择合适的持久化方式

一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。 如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。 有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速..

2021-11-28 23:05:50 439

原创 什么是Redis持久化?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。Redis 的持久化机制是什么?各自的优缺点?Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:RDB:是Redis DataBase缩写快照RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。img优点: 1、只有一个文件 dump.rdb,方便持久化。 2、容灾性

2021-11-28 23:05:28 433

原创 Redis的应用场景

总结二Redis相比其他缓存,有一个非常大的优势,就是支持多种数据类型。数据类型说明string字符串,最简单的k-v存储hashhash格式,value为field和value,适合ID-Detail这样的场景。list简单的list,顺序列表,支持首位或者末尾插入数据set无序list,查找速度快,适合交集、并集、差集处理sorted set有序的set其实,通过上面的数据类型的特性,基本就能想到合适的应用场景了。如上所述,虽然Redis不像关系数据库那么复杂的数据结构,但是,也能适

2021-11-28 23:04:39 413

原创 Redis的应用场景

总结一 计数器 可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。 缓存 将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。 会话缓存 可以使用 Redis 来统一存储多台应用服务器的会话信息。当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。 全页缓存(FPC) 除基本的会话token

2021-11-28 23:04:08 79

原创 Redis为什么这么快

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;4、使用多路 I/O 复用模型,非阻塞 IO;5、使用底层模型不同,它们

2021-11-28 23:03:34 620

原创 为什么要用 Redis /为什么要用缓存

主要从“高性能”和“高并发”这两点来看待这个问题。高性能:假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!高并发:直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过.

2021-11-28 23:03:11 871

原创 什么是Redis

Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经

2021-11-28 23:01:38 61

原创 高并发环境下如何优化Tomcat配置?

Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢?Tomcat运行模式Tomcat的运行模式有3种。1.bio模式默认的模式,性能非常低下,没有经过任何优化处理和支持。2.nio模式利用java的异步io护理技术,noblocking IO技术。要想运行在该模式下,则直接修改server.xml里的Connector节点,修改protocol为如下配置。protocol="o.

2021-11-28 22:15:57 218

原创 死磕并发编程第十六篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。ThreadLocal学会了这些,你也能和面试官扯皮了!前言我们都知道,在多线程环境下访问同一个共享变量,可能会出现线程安全的问题,为了保证线程安全,我们往往会在访问这个共享变量的时候加锁,以达到同步的效果,如下图所示。对共享变量加锁虽然能够保证线程的安全,但是却增加了开发人员对锁的使用技能,如果锁使用不当,则会导致死锁的问题。而ThreadLocal能够做到在创建变量后,每个...

2021-11-27 11:20:43 85

原创 死磕并发编程第十五篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与ConditionReentrantLock概述Java中主要分为两类锁,一类是synchronized修饰的锁,另外一类就是J.U.C中提供的锁。J.U.C中提供的核心锁就是ReentrantLock。ReentrantLock(可重入锁)与synchronized区别:..

2021-11-27 10:54:25 94

原创 死磕并发编程第十四篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。温故而知新AQS中的CountDownLatch、Semaphore与CyclicBarrierCountDownLatch概述同步辅助类,通过它可以阻塞当前线程。也就是说,能够实现一个线程或者多个线程一直等待,直到其他线程执行的操作完成。使用一个给定的计数器进行初始化,该计数器的操作是原子操作,即同时只能有一个线程操作该计数器。调用该类await()方法的线程会一直阻塞,...

2021-11-27 10:33:12 82

原创 死磕并发编程第十三篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。人生就像骑单车,想保持平衡就得往前走深入理解Thread类源码本文是基于JDK 1.8来进行分析的。Thread类的继承关系我们可以使用下图来表示Thread类的继承关系。由上图我们可以看出,Thread类实现了Runnable接口,而Runnable在JDK 1.8中被@FunctionalInterface注解标记为函数式接口,Runnable接口在JDK 1.8中...

2021-11-27 10:10:58 102

原创 死磕并发编程第十二篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。行百里者半九十,坚持就会胜利。深度解析ScheduledThreadPoolExecutor类的源代码ScheduledThreadPoolExecutor类是ThreadPoolExecutor类的子类。今天我们就来一起手撕ScheduledThreadPoolExecutor类的源代码。构造方法我们先来看下ScheduledThreadPoolExecutor的构造方法,源..

2021-11-27 00:56:42 231

原创 死磕并发编程第十一篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。重复是学习之母从源码角度深度解析线程池是如何实现优雅退出的本文,我们就来从源码角度深度解析线程池是如何优雅的退出程序的。首先,我们来看下ThreadPoolExecutor类中的shutdown()方法。shutdown()方法当使用线程池的时候,调用了shutdown()方法后,线程池就不会再接受新的执行任务了。但是在调用shutdown()方法之前放入任务队列中的任务还是要..

2021-11-22 22:06:45 80

原创 死磕并发编程第十篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。

2021-11-21 17:10:27 163

原创 死磕并发编程第九篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。

2021-11-21 17:08:52 71

原创 死磕并发编程第八篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。

2021-11-21 17:08:34 164

原创 死磕并发编程第七篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。

2021-11-21 17:08:08 68

原创 死磕并发编程第六篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。

2021-11-21 17:01:51 94

原创 死磕并发编程第五篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。

2021-11-20 22:26:32 91

原创 死磕并发编程第四篇

大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。

2021-11-20 22:03:52 74

mySpringBoot.zip

参照网上大佬的博客,模仿的项目

2021-10-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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