说下常见的Redis数据结构吧
- 字符串(String):最基本的数据结构,可以存储字符串、整数或者浮点数。
- 哈希(Hash):类似于关联数组,可以存储多个键值对,适合存储对象的属性。
- 列表(List):双向链表结构,支持从两端进行元素的插入和删除,适合做队列或者栈。
- 集合(Set):无序且不重复的元素集合,支持集合间的交集、并集和差集等操作。
- 有序集合(Sorted Set):类似于集合,但每个元素都会关联一个分数,可以按照分数进行排序。
- 地理空间索引(Geospatial Index):用于存储地理位置信息的数据结构,支持附近位置的搜索等功能。
Redis的持久化了解吗
了解过的面试官,主要是AOF和RDB,AOF是一种存储命令的持久化方式,可以借助于rewriteaof命令进行重写压缩以提高性能,而RDB存储的是一个二进制文件,两者一般是配合使用的,避免数据丢失。
并且持久化也跟刷盘机制有关,如果是always就不会丢失数据,everysecond最多丢一秒,如果是none交给系统就可能丢的多了。
Redis的三剑客
- 缓存雪崩(Cache Avalanche):指在某个时间段内,大量缓存数据同时失效,导致大量请求直接访问数据库,造成数据库压力剧增,甚至引起数据库宕机。缓存雪崩通常是由于缓存数据设置了相同的过期时间,导致在同一时间大量缓存同时失效引起的。
解决方法:可以在设置缓存时,给缓存数据的过期时间增加一个随机值,避免大量缓存同时失效;另外,可以使用热点数据预加载、限流等方式来缓解缓存雪崩的影响。
- 缓存穿透(Cache Penetration):指恶意请求或者不存在的数据频繁访问缓存,由于缓存中不存在该数据,每次请求都会直接访问数据库,导致数据库压力增大。
解决方法:可以在缓存中对于不存在的数据设置一个空值,或者使用布隆过滤器等方式来过滤恶意请求,避免直接访问数据库。
- 缓存击穿(Cache Breakdown):指针对某一热点数据,由于缓存数据过期或者被删除,导致大量请求直接访问数据库,造成数据库压力增大。
解决方法:可以在缓存失效时,使用互斥锁或者分布式锁来避免大量请求同时访问数据库,同时可以提前异步加载热点数据到缓存中,避免缓存失效时直接访问数据库。
CAP和Base理论了解吗
Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致。
Availability (可用性):用户访问集群中的任意健康节点必须能得到响应,而不是超时或拒绝。
Partition(分区):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。
Tolerance(容错):在集群出现分区时,整个系统也要持续对外提供服务
系统间的网络不能100%保证健康,一定会有故障的时候,而服务又必须对外保证服务。因此Partition Tolerance不可避免。
如果此时要保证一致性,就必须等待网络恢复,完成数据同步后,整个集群才对外提供服务,服务处于阻塞状态,不可用。
如果此时要保证可用性,就不能等待网络恢复,那node01、node02与node03之间就会出现数据不一致。
也就是说,在P一定会出现的情况下,A和C之间只能实现一个
BASE理论是对CAP的一种解决思路,包含三个思想:
- Basically Available(基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
- Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。
- Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。
说下Seata的AT模式执行流程吧
Seata AT模式的执行流程:
- 分布式事务发起方发送全局事务开始请求(Begin)给Seata Server,Seata Server为该全局事务生成一个全局事务ID(XID)。
- 分布式事务发起方开始执行本地事务,并在本地事务执行前向Seata发起分支事务注册请求(Branch Register),包括全局事务ID(XID)、分支事务ID(Branch ID)、分支事务参与者(即本地事务的执行者)等信息。
- 分布式事务发起方执行本地事务,如果本地事务执行成功,则向Seata发起分支事务提交请求(Branch Report);如果本地事务执行失败,则向Seata发起分支事务回滚请求(Branch Report)。
- Seata Server接收到分支事务提交或回滚请求后,会根据请求的结果来决定是否进行全局事务的提交或回滚。
- 如果所有分支事务都提交成功,Seata会向所有参与者发送全局事务提交请求(Global Commit);如果有任何一个分支事务回滚,Seata会向所有参与者发送全局事务回滚请求(Global Rollback)。
- 参与者接收到全局事务提交或回滚请求后,根据请求的指令来执行本地事务的提交或回滚操作。