自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 Session 不共享(仅供自己参考)

在有多台的Tomcat实现并发的时候,在进行轮询使用Tomcat,在一台Tomcat登录之后,这个用户的sessionID存储在第一个Tomcat,但是当再有请求,另外一个Tomcat接受,但是Tomcat没有上一个Tomcat的保存的sessionId,就又需要登录,导致用户的体验感不好。所以采用redis保存用户的信息,因为每个Tomcat都可以访问redis,就可以实现信息的共享。

2024-07-23 16:58:15 87

原创 Linux常用命令(仅供自己参考)

tail -f my.log :动态的获取日志,当更新了或者追加了 echo “内容”>> my.log, 就可以动态的获取日志中的内容。拷贝移动文件 source:文件源 dest:目标地址。echo 将后面这一句加到/etc/profile 文件后面。选项 -p :是可以创建多层目录。删除目录和文件 (不为空也能删)source 重新加载文件内容。以分页形式查看文件内容。

2024-07-23 16:57:33 124

原创 feed流(投喂)

优缺点:对于普通人,因为粉丝数量比较少,我们直接给他的粉丝推到粉丝的收件箱,不需要发件箱。所以大v的就直接放一个发件箱,对于普通的用户不做任何操作,但是对于活跃粉丝就需要将博客给推到他的收件箱。那么在第二次分页的时候,角标读取的不是5-1的数据,而是随着数据多了一个,读取的是6-2,那么就会造成第二次页数据和第一页数据有一个重复的数据6;滚动分页:通过记录一页中最后一个数据的id,第二页接着从这个数据的id的后面读取下一页的数据,这样就不会造成页与页之间的数据的重复了。优缺点:延迟低,耗时少。

2024-07-23 16:56:41 66

原创 redis的分片集群(仅供自己参考)

前言:为什么使用分片集群:因为redis的主从和哨兵机制主要是用来解决redis的高并发读的问题,还有redis的高并发的写的问题没有解决。使用分片集群就可以很好的解决redis写的问题,有多个master就可以实现并发的写。2、分片集群的插槽:插槽的大小分为16384(2的14次方),如果有多个master,则每个集群各占这些插槽的均分。使用{}来进行分类,{it}a,{it}b都被分在同一个插槽里面,到时候不用频繁的切换master,可以减少因频繁切换带来的性能问题。还有单个节点的大小的问题。

2024-07-21 14:22:55 227

原创 Redis哨兵机制

如果是主节点故障之后,那么哨兵就会从从节点中选一个来当主接主节点,判断的依据有很多,主要是看offset是否是最大的最接近故障的offset的值。选出来之后,就会执行slaveof no one,使这个从节点变为主节点,同时向存活的从节点发生信息,告知从节点,主节点发生变化。它是每隔1秒钟就向主从集群中的节点发送心跳,如果节点没有回复,则这个哨兵就主观的认为这个节点发生故障,这时候其他的哨兵也就向这个节点发送心跳,当有一半的哨兵主观的认为节点故障,那么就客观的认为这个节点不能工作了,发生故障。

2024-07-21 11:11:26 227

原创 reids的全量同步和增量同步

(1)首先master和slave节点建立连接,连接之后,slave会向master发送增量同步(slave会携带自己的repid和offset),master接收了slave的增量同步请求之后,就会拿自身的replId和slave的replId进行判断,如果相同则进行增量同步,不相同则进行全量同步,之后master会将自己的replId和offset发送给slave。slave执行log文件,将数据补充完整,每当数据不一致的时候,都进行增量同步。

2024-07-21 10:09:42 211

原创 微服务的技术栈

1、如下图:2、3、

2024-07-19 10:03:32 94

原创 redis持久化AOF(仅供自己参考)

1、redis每处理一个命令都会在AOF中添加一条命令,如果redis不小心发生宕机,那么只需要执行这个命令文件AOF文件就可以恢复数据了。3、bgrewriteaof命令,是对AOF文件中的数据进行重写,对重复的命令执行一次,对相同的命令合并执行。减少AOF文件的大小。4、RDB和AOF结合使用,RDB主要用来异地容灾,AOF数据安全性较高。

2024-07-18 16:13:16 127

原创 redis持久化RDB(仅供自己参考)

冲突的解决:在进行RDB的时候,主线程和子线程的读取不受任何影响,但是如果这个时候主线程有个写操作,那么如果直接在原数据上操作,那么就会和子进程的读取有冲突,解决方法:主线程会拷贝要修改的数据,得到数据的副本,同时将自己的页表的映射进行修改。解决了冲突带来了数据的不一致。共享的方式:在fork之后,子进程跟父进程几乎一模一样,那么父进程有的页表,子进程也有。(1)save命令:是直接占用主线程来执行持久化的(因为redis是单线程的,如果执行save命令,则其他命令,无论查询还是怎么的都被阻塞了)

2024-07-18 15:36:08 244

原创 HyperLogLog

2、HyperLogLog(算法)(对于重复数据,只保存一个)1、uv和pv的区别。

2024-07-18 14:33:42 97

原创 位运算和BitMap(位图)仅供自己参考

只要有一个对应的位是 1,结果位就是 1。只有两个都是0的时候才位0。只有当两个对应的位都是 1 时,结果位才是 1。&是只有两位都是1的时候才位1,其他的情况都为0。: 将一个数的二进制位向左移动指定的位数。(<<是有符号的左移),(<<<无符号的左移)(10<<1 == 20)(-10<< = -20)(>>有符号的右移),(>>>无符号的右移)(10>>1 = 5) (-10>>1 = )当两个对应的位相同时,结果位是 0。0和1为1,0和0为0,1和1为0。将 0 变成 1,将 1 变成 0。

2024-07-18 14:01:39 227

原创 redis消息队列

确认消息命令:XACK key group ID [ID ...] (如果消息只是拿到,没有确认的话,消息会存放在expending-list里面)第二个sub接收的频道(order.*)接收order.后面所有的频道,使得两次pub发送的消息都接收到了。创建一个消费者组: XGROUP CREATE s1 g1 $ (s1队列名称,g1消费者组的名称)第一个sub接收的信息通道(order.p1)使得pub发送第二次消息没有接受到。$:则实时取数据,在消息存放的时候才会获取。

2024-07-13 23:04:34 453

原创 redis redisson(仅供自己参考)

等待也不是死等(一直while循环),因为redis在释放一个键的时候,会发布一个通知,其他线程一直等待这个通过,有了通知之后,再次判断是否已经过了等待时间(设置的一个线程最长的等待时间,如果超出则获取锁失败)。为了解决这样的问题,给每一个获取锁的线程增加一个定时的任务(TimeOut),如果key释放的时间剩余key设置的释放时间的三分之一的话,就重新给key重新设置超时释放的值(这个值一直是原本的时间)。当主节点宕机,就会出现主节点的数据还没有同步到从节点,导致的一系列的问题。

2024-07-11 15:11:43 476

原创 全局唯一id

由于一个单表存储的数量有限,那么就会用多个表存储,每个表的id都是自增,这样导致id不唯一的情况。由于数据库的自增的id很有规律,会让人猜到后续id。具体解决方法:使用redis的string自增方法。

2024-07-10 19:16:06 127

原创 分布式锁(仅供自己参考)

分布式锁:满足分布式系统或集群式下多进程可见并且互斥的锁(使用外部的锁,因为如果是集群部署,每台服务器都有一个对应的tomcat,则每个tomcat的jvm就不同,锁对象就不同(加锁的机制,每个jvm有一个锁监听器,里面存放着是否含有所有加锁的对象。有一次线程来,首先判断该线程所具有的所要加锁的对象在锁监视器中是否有,有则让它等待,没有的话则将加锁的对象加进来,再有线程来判断,则和上面的流程一样))(自己理解的流程,可能不对,请指错)因为在加锁的时候new的不同的对象,使得每一个name都是不同的。

2024-07-09 21:54:18 580

原创 超卖问题(仅供自己参考)

(2):CAS使用要改变的字段(stock),通过在改变库存值的时候,看前面获取的stock值,和现在数据库中的stock值是否相同,相同就说明没有改变,不同则说明已经有其他线程已经改变了值。在一定的高并发的情况下,如果不加锁,干什么的,在我们判断最后的库存是否为0的时候,就会导致在库存为0之前,就有好多的线程拿到的库存是不为0之前的值,这就会导致库存的值在为0后还会修改。cas会导致很多数据失败(成功率很低),因为这里使用的库存,我们直接使用当库存大于0的时候都可以修改,这样就可以使成功率上升。

2024-07-08 16:46:15 229

原创 事务的范围比锁的范围大

原因:因为事务的范围比锁的范围大,当我们执行完这个方法,锁已经释放,由其他线程拿到这个锁来重新执行这段代码,但是这个时候,事务的内容还没有写入数据库,我们第二个锁进来判断数据库是否有值判断的肯定是为空,这第二个线程就会又进行插入,而不是进行修改。如果是在同一类当中,直接在加锁的地方调用这个类的另外一个方法(增加了事务的方法),这样是属于this调用。解决方法:在调用事务方法的地方加锁,这样保证锁的范围比事务的范围大。(1):自己依赖自己,自己将自己自动注入。(2):使用方法获取动态对象。

2024-07-08 14:16:58 249

原创 spring xml实现bean对象(仅供自己参考)

原型(prototype):通过设置scope属性,来指定bean的作用域为圆形模式,在自动注入的时候,bean容器会创建一个新的对象,把这个新的对象赋值给所需要的对象。单例(singleton):通过设置scope属性,来指定bean的作用域为单例模式,也就是说,所有的对象注入都是用的bean容器中那唯一一个对象。Spring Bean生命周期大致可以分为以下 5 个阶段:1.Bean 的实例化、2.Bean 属性赋值、3.Bean 的初始化、4.Bean 的使用、5.Bean 的销毁。

2024-07-08 10:50:08 287

原创 linux防火墙和mysql操作

2024-07-06 13:11:25 94

原创 缓存穿透、缓存雪崩(仅供自己参考,勿看)

1.缓存空对象:在redis中保存null,设置短时间的过期时间(比如3-5)分钟,在有人恶意的用很多线程攻击的时候,可以在一定程度上缓解这个问题。如果新增一个新的id,id是前面在缓存和数据库都没有的id,而在解决缓存穿透的时候,在redis中设置了这个id为null,所以在(3-5分钟之内)会造成数据的短期的不一致。为了解决这个问题,在新增的时候,直接在redis中新增或者更新这个id的值。缓存穿透:表面理解,redis中没有,穿透redis,数据库没有,没有写回redis中。

2024-06-23 18:24:24 198

原创 SortedSet常用命令 (仅供自己参考)

2024-05-31 15:53:26 113

原创 缓存(仅供自己参考,勿看)

因为缓存速度读写速度高,所有在先选择操作数据库后删除缓存发生的概率低。对于主动更新策略1,对于如何选择线衫后操作,还是先操作后删的对比。并且需要满足一定的条件:在操作数据库的时候,缓存刚好过期了。

2024-05-29 20:14:29 107

原创 RedisTemplate 于StringRedisTemplate(仅供自己参考)

如果不是在springboot的环境下,需要导入包。在StringRedisTemplate的例子。重写 RedisTemplate的bean。

2024-05-12 10:43:18 189 1

原创 redis set基本命令(仅供自己参考)

2024-05-08 15:10:02 80 1

原创 redis list常用命令(仅供自己参考)

blpop 在一定时间呢取值,如果在一定时间内没取到,返回空(nil)如果在一定的时间内取到,会返回取到值的时间。

2024-05-07 19:45:22 103 1

原创 redis hash类型指令(仅供自己参考)

2024-05-07 19:23:58 69 1

原创 Redis 一些通用命令(仅供自己参考)

TTL(ttl)用来查看一个键值对的生命周期 -1代表永存。-2代表已经删除,不存在。

2024-05-05 21:18:42 174

原创 Redis String 类型的一些命令(仅供自己参考)

incr 和 incrby :incr 是自增,++操作,而incrby 是指定步长(步长是指一次加的值,值可以为负数),所以incrby也可以实现自减 -- 操作,也可以通过decr来实现自减;不是integer类型的会报错。set: 不存在则添加,存在则修改,get通过key来获得redis中的数据。mset 和mget 设置多个键值对 和通过key获取多个value。incrbyfloat 用来给float类型的数据增加或者减小,

2024-05-05 21:10:54 167

原创 SpringBoot文件的上传和下载(仅供自己参考)

common-fileupload组件下载:http://commons.apache.org/proper/commons-fileupload/文件上传是指从本地将文件上传到服务器,服务器进行保存,就像我们发朋友圈时的时候用的图片,这些图片就会上传到腾讯微信的服务器上。common-io组件下载:http://commons.apache.org/proper/commons-io/根据自己需求下载对应版本。这个一定需要Post来接收,使用uuid是防止重名,而后一次的覆盖前一次的文件。

2024-04-27 11:06:34 172

原创 java自定义类加载器(ClassLoader)(初学者自用)

自定义类加载器是通过继承ClassLoader类重写其中的findClass方法。其余是我们加载某个类中的对象,然后调用里面的方法得到的。1、来到你的.java文件目录下面。目录中出现.class文件代表成功。第一个是读取的二进制的完整的路径。第三个是我们自定义类加载器的父类。第二个是我们自定义的类加载器。输入你的java文件,如下图。怎么获得.class文件。2、输入cmd,回车。

2024-04-15 09:19:21 403 1

原创 java 反射机制(仅供自己参考,慎用)

1、java反射机制是java动态加载类对象。可以获取一个类的几乎全部的信息,包括所有的方法,属性(private方法不一定,据情况而视)。4、通过反射生成对象的两种方法(获得原来类的对象,通过原来的类得到class文件,在通过class的对象获取相应的类的对象)2、用途:一般在框架中用的比较多,还有像jdbc加载数据库驱动 例:Class.forName(driver);3、创建Class 类对象;7、反射创建数组对象。

2024-04-08 21:01:20 182

原创 SpringBoot 继承shiro框架(自学,仅供自己参考)

首先是过滤器,过滤器是Servlet容器中的一个功能(Filter),所以在创建Servlet对象时也会被创建init()初始化方法。在点击登录之后,首先会到登录界面,在登录界面中会请求login登录,这时才会跳转到认证和授权类。

2024-04-08 11:08:58 125

原创 SpringBoot实现QQ邮箱登录(仅供自己参考,初学者)

【代码】SpringBoot实现QQ邮箱登录(仅供自己参考,初学者)

2024-04-05 11:00:34 123 1

原创 SpringBoot实现分页

代码:

2024-04-02 20:25:42 145 1

原创 SpingBoot代码生成器(基于mybatis或者mybatisPlus)(初学者,仅供自己参考)

【代码】SpingBoot代码生成器(基于mybatis或者mybatisPlus)(初学者,仅供自己参考)

2024-04-02 20:23:03 68 1

原创 SpringBoot实现跨域(其中一种方法,以后补充)(仅供自己参考,初学者)

allowedMethods("GET","POST","DELETE","PUT","OPTION") //允许请求的方法。//允许所有的请求头。.allowCredentials(false) //允许请求发送身份凭证。.allowedOrigins("*") //允许所有的请求来源通过。registry.addMapping("/**") //接受所有跨域请求路径。

2024-04-02 20:19:20 320 1

原创 SpringBoot实现过滤器(Filter)(仅供自己参考,初学者)

1、是通过注解方法@WebFilter("/login") //拦截登录路径,如果将该类加入到bean容器中时,会使得所有的路径都会被拦截。2、通过在springboot的configuration中配置不同的FilterRegistrationBean实例,来注册自定义过滤器。//注册自定义过滤器。

2024-04-02 20:11:36 311

原创 SpringBoot拦截器(仅供自己参考)

preHandle:在请求到达处理器之前执行,可以用于权限验证、数据校验等操作。如果返回true,则继续执行后续操作;如果返回false,则中断请求处理。1、完成拦截器需要实现HandlerInterceptor接口,实现其中的三个方法。postHandle:在处理器处理请求之后执行,可以用于日志记录、缓存处理等操作。afterCompletion:在视图渲染之后执行,可以用于资源清理等操作。将拦截器加入到这个配置里面,加入到之后才能实现拦截器的作用。

2024-04-02 19:35:50 239

原创 Java泛型

泛型通配符的目的是解决代码冗余,写一个方法,可以提供给多个类型所使用。就像可以传入String ,Integet,Double等等,都可以使用一个方法了。相当于是所有类型的一个父类型,是一个实参。Log.d("泛型测试","key value is " + obj.getKey());1、泛型类(靠自己的理解所写,找完整的定义去这里。4、泛型通配符--?

2024-03-12 10:03:40 322 1

原创 如何确定是post请求还是get请求还是其他请求

GET 请求应该是幂等的,即多次相同的 GET 请求返回的结果应该是一致的。RESTful API 设计准则:如果你在开发 RESTful API,可以遵循一些常见的设计原则,比如使用GET获取资源,使用POST创建资源等。安全性:敏感数据或需要进行身份验证的请求通常使用POST方法,因为POST请求可以通过请求体发送数据,而不像GET请求将数据暴露在URL中。根据接口设计和数据大小,选择适当的方法。PUT方法:用于更新资源。PUT 请求应该是幂等的,即多次相同的 PUT 请求会产生相同的结果。

2023-12-29 11:37:47 655 1

空空如也

空空如也

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

TA关注的人

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