- 博客(15)
- 收藏
- 关注
原创 Java-多线程
电脑上会有很多单独运行的程序,每个程序有一个独立的进程,而经常之间是相互独立的,比如我们使用QQ、微信、电脑管家等等。所以我们可以说进程就是正在运行的软件,而单独运行这句话充分体现出了进程中的独立性与动态性,同时使用多个软件则是进程并发性的体现。进程想要执行任务就需要依赖线程,换句话说线程是进程的最小执行单,。一个进程可以有多个线程而且至少要有一个线程,比如我们使用电脑管家,其中可以包含杀毒、清理垃圾等功能,这个严格意义上是同一时刻发生的没有执行上的先后顺序,这也正是线程的随机性。
2023-09-25 19:40:40
70
1
原创 ElasticSearch
Elasticsearch是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。全文检索是指对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当查询时,根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
2023-09-17 21:52:09
76
1
原创 RabbitMQ
1、生产者开启confirm机制,保证消息正确到达交换机2、生产者开启return机制,保证消息正确到达队列3、交换机、队列、消息进行持久化4、消费者开启手动ack,或者自动ack + 重试耗尽的失败策略,定义错误交换机队列,后期通过人工进行干预。
2023-09-15 12:13:46
98
3
原创 Linux操作系统
权限说明(3位对一) 当前用户有写跟执行权利 用户所在组有读的权利 其他用户有读的权利。i,a,o 进入编辑模式(插入模式) *必须在查看模式前提下。用户权限分组 当前用户 (这个文件所属用户) 用户所在组 其他用户。ls【参数】【目录】 展示指定目录下的内容 (未指定目录,展示当前所有目录内容)
2023-09-04 21:29:04
60
1
原创 Redis缓存异常问题
缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响. 例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致. 这时候可以利用消息队列或者其它异步方式清理缓存中的空对象.加锁更新,⽐如请求查询A,发现缓存中没有,对A这个key加锁,同时去数据库查询数据,写⼊缓存,再返回给⽤户,这样后⾯的请求就可以从缓存中拿到数据了.多级缓存:设置多级缓存,第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同.恶意攻击,爬虫造成空命中。
2023-08-29 20:15:43
236
2
原创 Redis实现分布式锁
Redis分布式锁的加锁,使用SETNX给Key键设置一个UUID的值和过期时间,只有键不存在时才能设置成功,如果键已经存在就会设置失败,其他进程执行前会判断Redis中这个Key是否有值,如果发现这个Key有值了,就说明已有其他进程在执行,则我们让它睡眠一段时间,再让它重新重试获取锁.我们在加锁时,需要设置键的值必须唯一,因此可以生成一个UUID作为值,然后在删除该键前先判断该键对应的值是否是当前客户端之前设置的UUID,防止误删除.2、watch dog自动延期机制。
2023-08-27 22:00:49
63
1
原创 Redis集群的高可用
当启动一个从节点的时候,如果这是从节点初次连接到主节点,那么会触发一次全量复制.此时master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端新收到的所有写命令缓存在内存中.RDB文件生成完毕后,主节点会将这个RDB发送给从节点,从节点会先写入本地磁盘,然后再从本地磁盘加载到内存中,接着主节点会将这段时间内内记录的写命令也发送到从节点,从节点也会同步这些数据.为了防止主节点数据丢失,可以为每个主节点可以准备特点数目的备节点,主节点挂掉从节点可以升级为主节点(哨兵模式).
2023-08-25 20:47:11
59
1
原创 Redis过期删除策略
对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放.从而造成内存泄漏.另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误.设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key.如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放.
2023-08-24 21:31:26
71
1
原创 Redis的五种常见数据类型以及应用场景
有序集合(sortedset/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素。存储的形式:{key:[{field1:value1},{field2:value2}]}应用场景:因为它是无序,不重复的,我们通常会用它来存储一些需要求交集,并集,差集操作的数据。存储的形式:{key:[{score1,value1},{score2,value2}]}存储的形式:{key:[value1,value2]}存储的形式:{key:[value1,value2]}
2023-08-21 21:01:47
47
1
原创 Spring中IOC与AOP的基本介绍
AOP(Aspect-Oriented Programming),一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性.可用于权限认证、日志、事务处理等。
2023-08-20 14:33:50
115
2
原创 ThreadLocal的内存泄漏问题
例如,在Web应用程序中,如果将一个ThreadLocal实例放入了一个长寿命周期的容器中(如ServletContext),但在容器关闭时没有清理ThreadLocal实例,就会导致内存泄漏。另外,如果ThreadLocal中持有的对象是一个较大的对象,并且在使用完后没有手动释放,也可能导致内存泄漏。因为ThreadLocal中的对象只有在线程结束后才会被垃圾回收器回收,如果ThreadLocal没有被正确清理,对象就无法被释放,从而导致内存泄漏。避免持有过大的对象或过长时间的对象。
2023-08-19 00:34:12
3657
1
原创 集合的基本介绍
集合可以分为单列集合Collection和双列集合Map。而Collection又可以根据元素是否可以重复,分为List和Set。
2023-08-16 20:38:18
45
1
原创 多线程和锁
当某个线程查询数据的时候,会将该数据的版本号一起读取出来,之后在该线程需要更新该数据的时候,就将之前读取的版本号与当前版本号进行比较,如果一致,则执行操作,如果不一致,则放弃操作。给线程加锁,在执行线程任务之前,让线程们去竞争锁,只有竞争到锁的线程才可以对共享资源进行修改,其他没有竞争到该锁资源的线程进入锁阻塞的状态.只有当持有锁的线程释放了该锁,其他处于锁阻塞又会重新去竞争锁资源.一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。
2023-08-15 19:19:08
75
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人