****
什么是可伸缩性? 当硬件性能提升,如cpu提升、内存提升、IO性能提升时,应用程序的处理能力是否会跟随硬件有相应的增加。 如何对可伸缩性进行优化的基准 开发中需要针对具体需求进行定制,如何以以测试为基准进行优化。 多线程的可伸缩性的限制 在所有的并发程度中都会有一部分的串行化的任务,如I/O阻塞、对阻塞队列进行读取和写入等 JVM对锁的优化 锁消除,基于逃逸分析可以把没有逃逸出栈的对象中的锁消除。 锁粗化,将......
CAP C:Consistency,强一致性,在分布式系统中的所有数据备份,在同一时刻是否同样的值。 A:Available,可用性,在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。 P:Partition,分区容忍性,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。 CAP理论是理想状态下的,不考虑网络时延,不考......
线程在相互等待 死锁 获取锁顺序导致死锁 可以通过 System.identityHashCode() 方法获取锁对象的hash,然后通过hash值进行判断,保证每次获取锁的顺序都是一致的,避免因获取锁顺序导致死锁 开放调用 在获取了锁的方法中调用一个需要获取另一个锁的方法,可能会导致死锁,可以通过降低锁的粒度,使得方法调用同步代码块不包含需要获取锁的方法调用。保证开放调用。 定时锁 获取锁时设置超......
Redis如何过期删除过期key-value? 惰性删除+定时删除 惰性删除:只在查询一个过期的key时执行删除操作 定时删除:每隔一段时间(默认是100ms)随机抽取一些设置了过期时间的key,检查是否过期。 Redis如何在内存即将满的时候做淘汰数据? noeviction:内存不足时拒绝写操作 allkeys-lru:当内存不足时,在键空间中,移除最新最少使用的key allkeys-random:......
什么是Redis并发竞争? 在一个服务集群同时对redis的某个key进行更新、删除时,可能会出现竞争,导致旧数据覆盖新数据存入Redis缓存中 怎么解决 在写少读多的情况下:通过分布式锁,确保同一时间只有一个服务实例在操作redis的某个数据,并且通过时间戳判断数据新旧,旧数据不能覆盖新数据 在写多读多的情况下:可以通过Redis的Lua脚本实现原子操作快速根据时间戳更新或者丢弃,但是会降低Redis的吞吐......
什么是缓存击穿? 热点数据过期后的短时间内,大量请求访问,在查询DB写入缓存的过程中,大量DB请求涌入,导致DB慢查询或者崩溃。 如何解决? 分布式互斥锁,通过分布式锁对查询进行线程数限制,并设置超时时间,超时报错。 手动过期:通过key-value格式存储数据,value为过期时间,某个线程读取到数据过期后,通过异步线程进行缓存的重新构建,避免击穿 ...
什么是缓存穿透? 非正常用户大量请求缓存中不存在的数据,导致业务逻辑去数据库查找,导致数据库崩溃。 缓存穿透解决方法 基于数据规则进行判断非法请求。 每次在数据库查询不到就写一个空值到缓存中 布隆过滤器 布隆过滤器如何更新? 尽量避免物理删除,做逻辑删除 开发定时任务,每隔几个小时,自动创建一个新的布隆过滤器数组,替换老的 ...
什么是缓存雪崩? 系统在高负载的情况下,缓存实例发生大面积宕机,导致大量请求无法通过缓存返回,直接请求数据库,导致数据库崩溃。 缓存雪崩的解决方法? 事前:使得缓存高可用 事中:使用ehcache缓存部分数据,通过hystrix做限流&降级,避免mysql崩溃 本地缓存的实时性怎么保证? 引入消息队列,数据更新时通过订阅消息队列进行本地缓存同步更新 设置一个比较短的过期时间,定期从DB重新拉取 事后......
缓存与数据库双写数据一致性问题 本质上来说,双写一致性问题是因为更新数据库和更新缓存不是原子操作,如果要做到强一致性,只能加分布式锁。不然就是做取舍问题。 缓存是用在:不经常变动,但是又经常查询,而且发生脏读不敏感的场景下使用 缓存+数据库读写模式: cache aside pattern 读的时候,先读缓存,缓存没有的话就读数据库,读到的数据库的值再存入缓存。 数据更新的时候,更新数据库,删除缓存。 ......
JVM HotSpot对象创建 创建方式 new关键字 clone():需要实现Cloneable接口 反序列化:需要实现Serializable 接口 反射 Class.newInstance()方法 Class.getConstructors()方法 Unsafe(sun.misc.Unsafe):不需要调用其构造函数、初始化代码、JVM安全检查等 allocateInstance......