双删何以重生Redis传奇复兴之路(双删redis)
双删何以重生:Redis传奇复兴之路
Redis是一种著名的开源键值(key-value)存储系统,用于实现灵活、高性能、可扩展的解决方案。作为一种可能意义上重大的NoSQL数据存储技术,它具有优秀的性能和强大的支持功能,因而被广泛地应用于互联网、社交媒体、金融、物联网等领域。Redis开发背后的故事十分让人动容。
有一段时间,Redis曾面临着一场双重挑战。从2011年开始,由于英特尔领先的先进的处理器技术,存储性能急剧下降。由于处理器性能大部分集中在内存上,因此传统的Redis实现无法跟上这种技术更新。另一方面,为了应对现代复杂应用的需求,运算逻辑也发生了变化,使得传统Redis存储面临新的挑战。
但是,让人惊奇的是,Redis在面对双重挑战的情况下,仍然实现了传奇式的复兴,取得了重大的成就。从底层原理上看,根据发明者Salvatore Sanfilippo的想法,Redis在底层时双重删除策略,即删除过期的键值储存单元,同时通过减少空间压缩,来提高性能。以下是大概的实现代码:
/*
* Clear expired entries from the master DB */
void expireRemoveExpiredKeys(cronEntry *ce) { list *expired;
listIter li; listNode *ln;
robj *key; long long timelimit, now;
timelimit = ce->last_run - server.maxmemory_samples; expired = listCreate();
if (expired == NULL) return;
now = currentTime(); if (timelimit > now) timelimit = now;
rdbSeizeReadLockOnMaster(); // Scan keys deleting the ones expired, and that are comprised in the vpickle.
dictIterator *di = dictGetSafeIterator(server.db[0].dict); dictEntry *de;
while((de = dictNext(di)) != NULL) { key = dictGetKey(de);
if (server.maxmemory_samples && key->lru > timelimit) listAddNodeTl(expired,key);
} dictReleaseIterator(di);
rdbReleaseReadLockOnMaster();
listRewind(expired,&li); while((ln = listNext(&li)) != NULL)
freeKey(ln->value); listRelease(expired);
}
这段代码的目的是清除master数据库中的过期键。它首先检索出在指定时间框架内到期的键,然后从master数据库中删除它们。
此外,Redis还改进了数据结构,优化了底层代码,增强了它的可扩展性和高性能。今天,Redis仍然在行业中占据领先地位,并且广受欢迎。
双重删除作为Redis开发的一个核心,为实现它令人兴奋的传奇复兴道路奠定了基础。Redis是一个巨大的成功故事,它的价值将继续流传,让许多人赞叹它的伟大。