开头
在找工作的过程中,对于 Redis 技术知识的掌握已经成为必须的技能。美团面试常常就会被问到Redis相关知识,而这次我就差点倒在了美团3面,面试官连问我以下几个Redis的问题,然后就卡壳了…
-
redis了解吗?你说说怎么用redis实现分布式锁?
-
Redis常用数据结构及底层数据结构实现
-
如何解决 Redis 的并发竞争 Key 问题
-
如何保证缓存与数据库双写时的数据一致性?
剩下的不太记得了…为此面试完回来针Redis专门做了一个面试问题大总结
DLedgerCommitlog 继承自 Commitlog。让我们一一来看一下它的核心属性。
- DLedgerServer dLedgerServer
基于 raft 协议实现的集群内的一个节点,用 DLedgerServer 实例表示。
- DLedgerConfig dLedgerConfig
DLedger 的配置信息。
- DLedgerMmapFileStore dLedgerFileStore
DLedger 基于文件映射的存储实现。
- MmapFileList dLedgerFileList
DLedger 所管理的存储文件集合,对比 RocketMQ 中的 MappedFileQueue。
- int id
节点ID,0 表示主节点,非0表示从节点
- MessageSerializer messageSerializer
消息序列器。
- long beginTimeInDledgerLock = 0
用于记录 消息追加的时耗(日志追加所持有锁时间)。
- long dividedCommitlogOffset = -1
记录的旧 commitlog 文件中的最大偏移量,如果访问的偏移量大于它,则访问 dledger 管理的文件。
- boolean isInrecoveringOldCommitlog = false
是否正在恢复旧的 commitlog 文件。
接下来我们将详细介绍 DLedgerCommitlog 各个核心方法及其实现要点。
[](()3.2 构造方法
public DLedgerCommitLog(final DefaultMessageStore defaultMessageStore) {
super(defaultMessageStore); // @1
dLedgerConfig = new DLedgerConfig();
dLedgerConfig.setEnableDiskForceClean(defaultMessageStore.getMessageStoreConfig().isCleanFileForciblyEnable());
dLedgerConfig.setStoreType(DLedgerConfig.FILE);
dLedgerConfig.setSelfId(defaultMessageStore.getMessageStoreConfig().getdLegerSelfId());
dLedgerConfig.setGroup(defaultMessageStore.getMessageStoreConfig().getdLegerGroup());
dLedgerConfig.setPeers(defaultMessageStore.getMessageStoreConfig().getdLegerPeers());
dLedgerConfig.setStoreBaseDir(defaultMessageStore.getMess