- 博客(54)
- 资源 (1)
- 收藏
- 关注
原创 多线程之wait()和notify()详解
1.每个Java对象都有一个监视器(monitor),它是用来控制对该对象的访问的。一个线程要想进入某个对象的监视器区域,必须先获得该对象的锁。然后可以通过wait方法来释放该对象的锁并进入等待状态,直到其他线程调用notify或notifyAll方法唤醒它。notify方法会选择一个等待该对象的线程进行唤醒,而notifyAll方法会唤醒所有等待该对象的线程。如果一个线程在调用wait方法前没有获得该对象的锁,会抛出IllegalMonitorStateException异常。
2023-06-28 17:55:20 307
原创 mysql索引
*一.MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。二.order by满足两种情况会使用Using index。1.order by语句使用索引最左前列。2.使用where子句与order by子句条件列组合满足索引最左前列。三.尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最佳左前缀法则。
2023-03-27 18:19:29 783 1
转载 Java NIO 编程:Buffer、Channel、Selector原理详解
https://blog.csdn.net/qq_36389060/article/details/124233851?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-5-124233851-blog-125304376.pc_relevant_downloadblacklistv1&depth_1-utm_source=distribu
2022-06-15 21:07:57 185
原创 网络编程之channel
ServerSocketChannelnio服务端ServerSocketChannel 是一个基于通道的 socket 监听器(本身不传数据,而是一个监听器)。由于 ServerSocketChannel 没有 bind()方法,因此有必要取出对等的 socket 并使用它来绑定到一个端口以开始监听连接。我们也是使用对等 ServerSocket 的 API 来根据需要设置其他的 socket 选项。SocketChannelnio客户端1、SocketChannel 介绍Java N
2022-06-15 20:54:27 372
原创 网络编程之ByteBuffer(缓冲区)
对于ByteBuffer,其主要有五个属性:mark,position,limit,capacity和array。这五个属性的作用如下:** mark:记录了当前所标记的索引下标;* position:对于写入模式,表示当前可写入数据的下标,对于读取模式,表示接下来可以读取的数据的下标;* limit:对于写入模式,表示当前可以写入的数组大小,默认为数组的最大长度,对于读取模式,表示当前最多可以读取的数据的位置下标;* capacity:表示当前数组的容量大小;* array:保存了当前写入的数
2022-06-15 20:19:40 283
原创 集合之Set
set接口无序:存入元素的顺序和取出的顺序不一致, set集合没有下标无法维持顺序不可重复:Set集合不存储重复的数据,对象调用hashCode和equals方法,因为输入重复的数据,hashCode得到的哈希值相等,不能存入。实现类hashSet底层维护一个hashMap集合,新增元素的时候把元素存到hashMap中HashSet初始容量是16,加载因子为0.75,即当元素个数超过容量长度的0.75倍 时,进行扩容,扩容增量是原容量的1倍。初始容量16指的是数组的容量。哈希表是数组+链
2022-05-09 14:35:37 321
原创 集合之map
map接口map集合和collection集合没有关系双列集合:以key和value这种键值对的方式进行存储Map中的key:无序的、不可重复的,使用Set存储所有的key —>Key所在的类要重写equals方法和HashCode方法(以HashMap为例) 因为存储的key可能是我们自定义的类Map中的value:可重复的、无序的,使用Collection存储所有的value---->value所在的类要重写equals方法一个键值对:key-value构成了一个Entry对象
2022-05-09 13:41:21 344
原创 集合之List
List接口有序, 可重复, 数据结构:数组,双向链表。继承collection接口api难点contains()和containsAll()底层调用的是元素的equals方法返回true包含,否则不包含remove(Object obj)底层也是调用的equals()方法,返回true移除,否则不移除区别remove(int index)/remove(Object obj)当我们使用remove方法,里面传入的是一个整型数据,默认认为 我们要移除该索引位置的元素如果我们想要移除对应元素,
2022-05-07 16:46:42 486
原创 Java基础之Arrays.asList()遇到的坑
知识点:该方法适用于对象型数据的数组(String、Integer…),如果使用的是基本数据类型,则会把基本数据类型的数组作为一个元素存储到新集合中,新生成的集合只有一个元素,就是该数组的地址值该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新;不支持add()、remove()、clear()等方法这个ArrayList不是java.util包下的,而是java.util.Arrays.ArrayList,它是Arrays类自己定义的一个静态内部类,这个内部类没有实现a
2022-05-06 16:39:27 781
原创 Java基础之集合
集合的特性集合的应用场景基础知识list的基础知识Vector初始容量是10,扩容增量:原来的1倍Vector线程安全,但是速度慢ArrayList初始容量是10,扩容增量:原来容量*0.5+1ArrayList线程不安全,查询速度快set的基础知识Set集合不存储重复的数据,对象调用hashCode和equals方法,因为输入重复的数据,hashCode得到的哈希值相等,不能存入。HashSet初始容量是16,加载因子为0.75,即当元素个数超过容量长度的0.75倍 时,进行扩容,
2022-05-06 16:29:09 121
原创 java基础之Integer与Integer比较(牵扯缓存)
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象equals 用来比较的是两个对象的内容是否相等注意:一个是-128<=x<=127的整数,将会直接缓存在IntegerCache中,当赋值在这个区间的时候,不会创建新的Integer对象,而是从缓存中获取已经创建好的Integer对象二是当大于这个范围的时候,直接new Integer来创建Integer对象验证Integer i1 = 127; /.
2022-05-06 14:49:24 486
原创 网络编程之BIO(同步阻塞)
1.服务端package com.io.bio2;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import static java.util.concurrent.Executors.newCachedThreadPool;/** * @author yangmin * @version
2022-04-27 15:35:50 407
原创 设计模式之观察者模式
主体对象package com.observer;import java.util.ArrayList;import java.util.List;/** * @author yangmin * @version 1.0 * @description: 观察者模式中被观察的对象 * @date 2022/4/21 11:50 */public class Subject { /** * 观察者监听的对象 */ private int stat;
2022-04-21 13:44:31 369
原创 redis中常见的面试题之击穿/穿透/雪崩/redis实现分布式锁
缓存穿透一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。如何避免?1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。3:使用布隆过滤器,记录key是否在DB中存在,在获取
2022-04-06 20:11:49 283
原创 redis集群搭建之redis-cluster
Redis 集群介绍Redis Cluster 提供一种Redis安装方式:数据自动在多个Redis节点间分片。Redis Cluster 提供一定程度的高可用,在实际的环境中当某些节点失败或者不能通讯的情况下能够继续提供服务。大量节点失败的情况下集群也会停止服务(例如大多数主节点不可用)。Redis集群提供的能力:自动切分数据集到多个节点上。当部分节点故障或不可达的情况下继续提供服务。Redis 集群的端口每个Redis集群节点需要打开两个TCP连接。端口6379提供给客户端连接,外加上
2022-03-28 20:49:57 5811
原创 redis集群搭建实操之predixy代理
架构图我们采用的是一个predixy代理两套哨兵机制的主从复制, 每套主从复制都是一个主节点2个从节点搭建前期准备要搭建两套哨兵机制,需要3个sentinel实例,2套主从复制(每套一个主节点,一个从节点),参考文章: redis集群搭建之主从复制 ; Redis哨兵-实现Redis高可用这里是一个sentinel实例分别监听两个master,配置文件如下:三个sentinel和6个redis实例全部启动; sentinel日志输出:下载predixy下载源码,predixy源码
2022-03-25 19:17:14 1299
原创 Redis集群理论
前言Redis集群混合使用了查询路由和客户端分区。集群Redis集群提供的能力:自动切分数据集到多个节点上。当部分节点故障或不可达的情况下继续提供服务。Redis 集群和数据分片Redis集群不是使用一致性哈希,而是使用哈希槽。整个redis集群有16384个哈希槽,决定一个key应该分配到那个槽的算法是:计算该key的CRC16结果再模16834。集群中的每个节点负责一部分哈希槽,比如集群中有3个节点,则:节点A存储的哈希槽范围是:0 – 5500节点B存储的哈希槽范围是:550
2022-03-24 21:22:40 1233
原创 Redis 分区之如何把数据存储到多个Redis实例中
回顾redis中的AKF理论和CAP理论详解中我们知道redis可以从xyz三个方向进行扩展,前面我们通过主从复制可哨兵机制解决了redis的高可用,没有解决容量有限问题,这篇文章主要对redis集群的理论知识进行分享客户端拆分业务如果数据交集比较少, 我们可以把业务进行拆分,比如:我们可以把用户信息放到redis-1中,订单放到redis-2中,如图:弊端:如果用户信息数据量比较大,一个实例承载不下,数据分析有限,怎么办?如果业务耦合比较严重,数据交集比较多,这种方案肯定是不合适的。按算法拆分
2022-03-24 20:49:49 2291
原创 Redis哨兵-实现Redis高可用
上一篇文章的内容是redis的主从复制,当一个主结点挂后,从节点可以通过执行命令 replicaof no one 主节点的切换,这里我们主要是实现自动切换,采用哨兵机制(Redis Sentinel)架构图Sentinel的功能列表:监控(Monitoring):Sentinel不断的去检查你的主从实例是否按照预期在工作。通知(Notification):Sentinel可以通过一个api来通知系统管理员或者另外的应用程序,被监控的Redis实例有一些问题自动故障转移(Automatic
2022-03-21 20:49:06 998
原创 redis集群搭建之主从复制
前期准备把安装的三个redis服务全部停掉2. 建立一个redistest文件夹,把三个redis实例的配置文件复制一份到这里修改配置文件:让日志在控制台输出关闭后台运行关闭aof启动redis ,发现日志全部打印到了控制台主从复制设计图通过命令行手动启动5.0版本以前命令是SLAVEOF, 5.0以后的版本是REPLICAOF 127.0.0.1 63791.启动所有的redis实例的服务端和客户端1.我们把6379实例当做主节点,6380和6381当做从节点
2022-03-18 11:39:46 1455
原创 redis中的AKF理论和CAP理论详解
redis的可用性通过AKF理论构建集群单机redis的会带来的问题容量有限,内存有限单点故障,挂机后,导致服务不可用连接压力,I/O压力大,并发压力大根据AKF理论解决上面的三个问题,分别从X,Y,Z三个方向解决,如下图:上面通过AKF实现了一边多,实现了高可用,那么怎么保证主机和备机(从机)的数据一致性了?数据强一致性, 弱一致性,最终一致性但是主节点依然是单实例, 如果主节点挂了,服务还是不可用,我们应该怎么解决?分区容忍...
2022-03-16 21:30:49 1383
原创 redis的持久化机制详解
redis的持久化机制rdb(快照),可以在某个时间段内,生成某个时间点的rdb文件,rdb文件是一个二进制文件aof(日志),记录的是redis执行的所有写操作命令,redis在重启的时候会执行aof中的所有命令,来还原数据, 新操作的命令会追加到aof文件中, Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小还可以同时使用 AOF 持久化和 RDB 持久化,redis4.0版本之后,比如说8点触发了aof持久化计制,
2022-03-15 21:17:20 1158
原创 redis的key的过期原理以及redis的内存回收策略
过期原理过期时间会不会被延长?首先要明确一点,你不给key设置过期时间和有效期,这个key是一直存在的。除非调用del命令删除过期时间是不会被延长的;剔除过期时间的命令:DEL, SET, GETSET 和所有的 *STORE 命令,这样就成永久的了自增 key 中存储的值的 INCR , 向list中新增一个值 LPUSH, 或者修改 hash 域的值 HSET ,这些都不会修改 key 的过期时间。可以通过命令( PERSIST)把过期时间清除,让key变成永久的key使用 RENA
2022-03-10 21:03:05 2423
原创 redis的布隆过滤器的原理及使用
什么是布隆过滤器布隆过滤器(Bloom Filter)是由Howard Bloom在1970年提出的一种比较巧妙的概率型数据结构,它可以告诉你某种东西一定不存在或者可能存在。当布隆过滤器说,某种东西存在时,这种东西可能不存在;当布隆过滤器说,某种东西不存在时,那么这种东西一定不存在。布隆过滤器相对于Set、Map 等数据结构来说,它可以更高效地插入和查询,并且占用空间更少,它也有缺点,就是判断某种东西是否存在时,可能会被误判。但是只要参数设置的合理,它的精确度也可以控制的相对精确,只会有小小的误判概率。
2022-03-09 21:08:22 2481
原创 redis事物
Redis使用MULTI, EXEC, DISCARD 和 WATCH 命令来实现事务功能。事务可以一次执行多个命令,并带有两个重要的保证:1. 隔离性;顺序性事务中的所有命令都被序列化并按顺序执行。Redis执行事务期间,不会被其它客户端发送的命令打断,事务中的所有命令都作为一个隔离操作顺序执行。事务的执行顺序,取决于exec命令执行的顺序;我们先开启一个事务(A),执行set k1 aaa; get k1 aaa然后再创建一个事务(B), 执行get k1 ;A事务执行 del k1先
2022-03-09 10:37:17 1003
原创 redis之发布订阅
回顾在list的数据类型中,介绍过阻塞的单波队列,相关的命令是: lpush brpop rpush blpop这是点对点模式,实际上就是队列, 生产者添加元素后, 一个消费者消费后,其他的消费者就不能消费了,发布订阅: 发布一条消息后, 可以多人订阅发布订阅小费制必须开启订阅后, 然后生产者发布消息,消费者才能接受到;发布命令: PUBLISH channel messagechannel: 频道(可以理解为广播频道)message: 消息订阅命令: SUBSCRIBE chann
2022-03-07 20:56:57 2103
原创 redis简单使用管道
服务器下载ncyum install nc nc : 与服务器建立socket连接管道的意义Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务器。这意味着请求通常按如下步骤处理:客户端发送一个请求到服务器,并以阻塞的方式从socket读取数据,获取服务端响应 。服务端处理请求命令并发送响应回给客户端。Clients 和 Servers 通过网络连接. 可以是本地非常快的网络,或者是通过互联网连接很远的网络。不管网络延迟如何,数据包从客户端发给服务端,再从服务端返回给客户端
2022-03-07 20:00:38 854
原创 redis的value类型之SortedSet(有序集合)
SortedSet 有序集合,与list不同,list是取出和插入的位置有顺序,但是对元素本身的大小不排序,SortedSet则是对元素本身进行排序添加ZADD key score member [[score member] [score member] …]在添加的时候需要添加score分值,来保证它的位置和顺序,如果分值一样则按字典的顺序排序修改该元素的分值,需要重新插入该元素,保证它的分值取出按索引取出ZRANGE key start stop [WITHSCORES]按分值从小到
2022-03-07 19:20:39 882
原创 redis的value类型之Set命令
该集合不重复且没有顺序,添加SADD key member [member …]查询SMEMBERS key查询该集合中所有的元素SSCAN key cursor [MATCH pattern] [COUNT count]模糊查询cursor - 游标。pattern - 匹配的模式。count - 指定从数据集里返回多少元素,默认值为 10 。SCARD key查询该集合中一共有多少个元素删除元素SREM key member [member …]从集合 key中删除
2022-03-02 21:07:53 1026
原创 redis的value类型之hash详解
HSET key field value [field value …]Redis Hset 命令用于为存储在 key 中的哈希表的 field 字段赋值 value 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段(field)已经存在于哈希表中,旧值将被覆盖。HGET key fieldRedis HGET 命令用于返回哈希表中指定字段 field 的值。HSETNX key field valueRedis HSETNX 命令用于为哈希表中不存在的字段赋值 。
2022-03-01 23:26:53 2056
原创 redis的value类型之List详解
list底层是双向链表1.单向链表解释: 单向链表只有一个next指针指向后面的结点, 只能单向遍历, 相对于双向链表来说占用的内存小2.双向链表的基本结构有一个head结点和tail结点,方便再插入和删除的时候快速定位开始和结束结点的位置,然后通过pre和next指针寻找目标结点,然后进行插入和删除;还有一个size属性,用来记录链表中的元素个数;解释: next指针指向后一个结点, pre指针指向前一个结点; 对比于单向链表占用内存小;支持双向遍历,mysql的innodb搜索引擎的索引
2022-03-01 19:39:27 2306
原创 redis的value类型之String详解
string 类型又分为 字符串, 数值 , bitmap1. 字符串首先明白存储的是字节,并非是字符串操作字符串的命令1.1 APPEND key value追加字符串1.2
2022-02-24 21:09:06 1099
原创 springboot接口参数校验
依赖 <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>公共异常处理器package com.app.appapi.handler;import com.app.appapi.resul
2022-02-22 18:09:13 578
原创 springboot 配置Elasticsearch
依赖 <!--es--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch-rest-client-
2022-02-22 17:36:35 4246
原创 nacos配置中心的自定义配置自动刷新
配置文件username: ymuser: name: ssss age: 154JAVA代码@Data@ConfigurationProperties(prefix = "user")@Configurationpublic class UserProperties { private String name; private int age;}package com.woyaoce.paperapi.core.common.controller;impo
2022-02-22 17:25:07 1611
原创 redis的一些基础命令
DEL key [key …]:删除给定的一个或多个 key 。没有则忽略DUMP key:序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键。RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]反序列化给定的序列化值,并将它和给定的 key 关联。参数 ttl 以毫秒为单位为 key 设置生存时间;如果 ttl 为
2022-02-22 13:43:16 208
原创 MySQL的数据类型详解
数据类型概览约束条件约束条件就是在给字段加一些约束,使该字段存储的值更加符合我们的预期。常用约束条件有以下这些:UNSIGNED :无符号,值从0开始,无负数ZEROFILL:零填充,当数据的显示长度不够的时候可以使用前补0的效果填充至指定长度,字段会自动添加UNSIGNEDNOT NULL:非空约束,表示该字段的值不能为空DEFAULT:表示如果插入数据时没有给该字段赋值,那么就使用默认值PRIMARY KEY:主键约束,表示唯一标识,不能为空,且一个表只能有一个主键。一般都是用来约束i
2022-02-18 15:06:35 285
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人