LruCache的代码实现,以及分析
发布日期:2021-10-10 05:31:19
浏览次数:50
分类:技术文章
本文共 1735 字,大约阅读时间需要 5 分钟。
LruCache的代码实现以及分析
文章目录
简介
作为存储数据、获取数据的服务,LruCache被大量的广泛使用。例如,我们在redis、mongodb种存储海量的数据,应用服务通过api通过网络进行存取,但是由于二八原则,我们大多数情况下,获取的都是相同的一批数据,所以这个时候可以在服务内存创建LruCache将数据进行缓存。
原理
- 当数据请求到来的时候,首先访问内存的cache,如果内存中没有,则通过网络远程访问存储。
- 获取数据后,将数据写入到缓存中,同时在list中更新位置到队列的同步;
- 如果cache中找到的话,返回用户数据,然后同时更新数据在list中的位置。
源代码
#include#include #include using namespace std;class LRUCache{ public: struct CacheEntry { public: int key; int value; CacheEntry(int k, int v) :key(k), value(v) {} }; LRUCache(int capacity) { m_capacity = capacity; } int get(int key) { if (m_map.find(key) == m_map.end()) return -1; MoveToHead(key); return m_map[key]->value; } void put(int key, int value) { if (m_map.find(key) == m_map.end()){ CacheEntry newItem(key, value); if (m_LRU_cache.size() >= m_capacity) { //remove from tail m_map.erase(m_LRU_cache.back().key); m_LRU_cache.pop_back(); } // insert in head. m_LRU_cache.push_front(newItem); m_map[key] = m_LRU_cache.begin(); return; } m_map[key]->value = value; MoveToHead(key); } private: unordered_map
::iterator> m_map; list m_LRU_cache; int m_capacity; void MoveToHead(int key) { //Move key from current location to head auto updateEntry = *m_map[key]; m_LRU_cache.erase(m_map[key]); m_LRU_cache.push_front(updateEntry); m_map[key] = m_LRU_cache.begin(); } };int main(int argc, char ** argb){ LRUCache* obj = new LRUCache(2); obj->put(1,1); obj->get(1); return 0;}
优化点
- cache基于lru,如果每条数据在远程存储已经修改,但是在cache中由于反复使用,所以一直无法更新;解决办法:给cache设置个超时时间;
- 同步锁:在多线程的情况下,锁的冲突会很大,这个时候需要考虑使用多个锁来降低锁的冲突。
总结
本文介绍了一个非常简单的lru的实现,有兴趣的读者可以自己扩展。
转载地址:https://blog.csdn.net/qq_22054285/article/details/86673393 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年03月08日 08时47分16秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java算法应用_看得见的算法(java源码)-7个经典应用诠释算法精髓
2019-04-21
java的min函数_java 包含min函数的栈
2019-04-21
jquery java jsonp_JSONP原理及JQUERY JSONP的使用
2019-04-21
html生成jsessionid,H5 APP 使用 JSESSIONID 保持会话登录
2019-04-21
大数据可视化陈为智慧树_知到智慧树大数据可视化网课答案
2019-04-21
前端背景图放置_web前端入门到实战:css 中的背景图片小技巧和存在的坑
2019-04-21
java option作用_java – 类Option [T]的意义是什么?
2019-04-21
php 整形 字符串排序,php-通过特定的字符串值进行排序
2019-04-21
lotus php,LotusPhp框架目录_PHP教程
2019-04-21
java倒计时自动关闭弹窗,打开页面弹出窗口子窗口定时自动关闭
2019-04-21
mysql 常见存储过程,MYSQL存储过程
2019-04-21
php+jq+添加css,jquery如何添加css样式?
2019-04-21
arduino如何调用mysql,【 实测可用 】Arduino 直接访问 mysql
2019-04-21
php数据库结构对比 微擎,禾匠数据库对比–微擎通用各类数据库结构对比教程...
2019-04-21
mitproxy php,orion-c
2019-04-21
oracle负载均衡方案,Oracle负载均衡配置代码
2019-04-21