开篇介绍
大家好,我是Java最全面试题库的提裤姐,今天这篇是分布式技术的第二篇,主要介绍分布式redis;在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
Redis集群最大节点个数是多少?
16384个
Redis集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个点都会有N-1个复制品
Redis和 Redisson有什么关系?
Redisson是一个高级的分布式协调redis客服端,能帮助用户在分布式环境中轻松实现一些java的对象(Bloom filter,BitSet,set, SetMultimap, ScoredSortedSet,SortedSet, Map,ConcurrentMap, List, List Multimap, Queue, BlockingQueue, Deque, Blocking Deque, Semaphore, Lock, ReadWriteLock, Atomi cLong, CountDownLa, Publish/ Subscribe, HyperLogLog)
MySQL里有2000w数据, redis中只存20w的数据,如何保证 redis中的数据都是热点数据?
redis内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略。
Redis集群方案应该怎么做?都有哪些方案?
1.codis.
目前用的最多的集群方案,基本和 twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash节点。
2.redis cluster3.0
自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。
3.在业务代码层实现
起几个毫无关联的 redis实例,在代码层对key进行hash计算,然后去对应的 redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控等等。
Redis集群方案什么情况下会导致整个集群不可用?
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会因为缺少5501-11000这个范围的槽而不可用。
假如 Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使用keys指令可以扫出指定模式的key列表。
对方接着追问如果这个 redis正在给线上的业务提供服务,那使用keys指令会有什么问题?这个时候你要回答 redis关键的一个特性redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
主从数据库不一致如何解决场景描述?
对于主从库,读写分离,如果主从库更新同步有时差,就会导致主从库数据的不一致
1、忽略这个数据不一致,在数据一致性要求不高的业务下,未必需要时时一致性
2、强制读主库,使用一个高可用的主库,数据库读写都在主库,添加一个缓存,提升数据读取的性能。
3、选择性读主库,添加一个缓存,用来记录必须读主库的数据,将哪个库,哪个表,哪个主键,作为缓存的key,设置缓存失效的时间为主从库同步的时间,如果缓存当中有这个数据,直接读取主库;如果缓存当中没有这个主键,就到对应的从库中读取。
缓存与数据库不一致怎么办?
假设采用的主存分离,读写分离的数据库,如果一个线程A先删除缓存数据,然后将数据写入到主库当中,这个时候,主库和从库同步没有完成,线程B从缓存当中读取数据失败,从从库当中读取到旧数据,然后更新至缓存,这个时候,缓存当中的就是旧的数据。
发生上述不一致的原因在于,主从库数据不一致问题,加入了缓存之后,主从不一致的时间被拉长了;
处理:在从库有数据更新之后,将缓存当中的数据也同时进行更新,即当从库发生了数据更新之后,向缓存发出删除,淘汰这段时间写入的旧数据。