摘要: 为什么需要消息队列? 当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。消息被发送到队列中,“ 消息队列 ”是在消息的传输过程中保存消息的容器 。 使用消息队列有什么好处? 提高系统响应速度 使用了消息队列,生产者一方,把消息往队列里一扔,就 阅读全文
posted @ 2023-03-16 22:43 残城碎梦 阅读(35) 评论(0) 推荐(0) 编辑
摘要: Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较、排序。 Comparable接口 Comparable是一个内比较器,实现Comparable接口的类可以和自己比较(但是未必是自己),是依赖compareTo方法的实现进行比较。com 阅读全文
posted @ 2023-03-16 22:16 残城碎梦 阅读(47) 评论(0) 推荐(0) 编辑
摘要: JDK1.7中的HashMap 在HashMap的扩容函数transfer函数中,在对table进行扩容到newTable后,需要将原来数据转移到newTable中,使用的是头插法,也就是链表的顺序会翻转,可能会造成数据丢失,形成环形链表,造成死循环。 JDK1.8中HashMap 在jdk1.8中 阅读全文
posted @ 2023-03-16 21:52 残城碎梦 阅读(14) 评论(0) 推荐(0) 编辑
摘要: ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。 ArrayList是基于数组实现的,支持通过索引访问元素;LinkeList使用了链表的结构,不需要维护容量的大小,不支持随机元 阅读全文
posted @ 2023-03-16 20:55 残城碎梦 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样。 HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时,系统将调用Str 阅读全文
posted @ 2023-03-16 20:42 残城碎梦 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它 阅读全文
posted @ 2023-03-16 18:02 残城碎梦 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 单点登录在现在的系统架构中广泛存在,它将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。 共享Session 共享Session是实现单点登录最直接、最简单的方式。将用户认证信息保存于Session 阅读全文
posted @ 2023-03-16 15:22 残城碎梦 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 使用分布式的好处 很多时候,我们为了更好的承载更多请求,或者稳定的为更多的用户提供服务,那么我们一般会把服务部署多份。以保证服务的高可用,高并发。 但是一项事务有它的好处也有它的坏处,比如分布式服务就要解决幂等性的问题。 幂等性问题 幂等性定义 一次和多次请求某一个资源对于资源本身应该具有同样的结果 阅读全文
posted @ 2023-03-16 13:58 残城碎梦 阅读(34) 评论(0) 推荐(0) 编辑
摘要: 相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。这里key是多个。 注意:多个KEY,同时失效,同时请求,同时访问DB 解决方案: 失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。 阅读全文
posted @ 2023-03-16 13:47 残城碎梦 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 连续写数据库和缓存,但是操作期间,出现并发了,数据不一致了。 通常,更新缓存和数据库有以下几种顺序: 先更新数据库,再更新缓存。 先删缓存,再更新数据库。 先更新数据库,再删除缓存。 先更新数据库,再更新缓存 两个请求同时更新数据,若不使用分布式锁,将无法控制最后缓存的值是什么,即存在并发写的的问题 阅读全文
posted @ 2023-03-16 13:43 残城碎梦 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 缓存穿透是指查询一个一定不存在的数据,从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。 在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 解决方案: 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的b 阅读全文
posted @ 2023-03-16 12:06 残城碎梦 阅读(21) 评论(0) 推荐(0) 编辑
摘要: equals() 的作用是用来判断两个对象是否相等。 hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中: 同一个对象(没有 阅读全文
posted @ 2023-03-16 12:00 残城碎梦 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 分布式锁常见的三种实现方式: 数据库乐观锁; 基于Redis的分布式锁; 基于ZooKeeper的分布式锁。 Redis要实现分布式锁,以下条件应该得到满足: 互斥性:在任意时刻,只有一个客户端能持有锁。 不能死锁:客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 容错性:只要 阅读全文
posted @ 2023-03-16 11:52 残城碎梦 阅读(15) 评论(0) 推荐(0) 编辑
摘要: 这是生产系统中常见的问题。 我们以前做过一个 mysql binlog 同步的系统,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂 阅读全文
posted @ 2023-03-16 08:56 残城碎梦 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 需要一个全局唯一的id来支持。 基于数据库的实现方案 数据库自增 id 每次从一个数据库中拿到自增id,再往对应的分库分表里去写入。 缺点就是单库生成自增 id,要是高并发的话,就会有瓶颈的;又或者专门开一个服务出来,这个服务每次就拿到当前 id 最大值,然后自己递增几个 id,一次性返回一批 id 阅读全文
posted @ 2023-03-16 08:49 残城碎梦 阅读(18) 评论(0) 推荐(0) 编辑
摘要: TreeMap<K,V>的Key值是要求实现java.lang.Comparable,默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。 HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序; 阅读全文
posted @ 2023-03-16 08:42 残城碎梦 阅读(8) 评论(0) 推荐(0) 编辑
摘要: Spring最基础的能力是IOC(依赖注入)、AOP(面向切面编程),ioc改善了模块之间的耦合问题。 依赖注入的方式:set方法,构造方法,成员变量+@Autowired;Bean的管理是IOC的主要功能。 bean的生命周期完全由spring容器管理,从属性设置到各种依赖关系的注入,简化了开发人 阅读全文
posted @ 2023-03-16 08:34 残城碎梦 阅读(17) 评论(0) 推荐(0) 编辑
摘要: Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。Spring使你能够编写更干净、更可管理、并且更易于测试的代码。 Spring MVC是Spring的一个模块,一个web框架。通过DispatcherServlet, ModelAndView 和 ViewResolver 阅读全文
posted @ 2023-03-16 08:30 残城碎梦 阅读(56) 评论(0) 推荐(0) 编辑