LruCache的代码实现,以及分析
发布日期:2021-10-10 05:31:19 浏览次数:50 分类:技术文章

本文共 1735 字,大约阅读时间需要 5 分钟。

LruCache的代码实现以及分析

文章目录

简介

作为存储数据、获取数据的服务,LruCache被大量的广泛使用。例如,我们在redis、mongodb种存储海量的数据,应用服务通过api通过网络进行存取,但是由于二八原则,我们大多数情况下,获取的都是相同的一批数据,所以这个时候可以在服务内存创建LruCache将数据进行缓存。

原理

  1. 当数据请求到来的时候,首先访问内存的cache,如果内存中没有,则通过网络远程访问存储。
  2. 获取数据后,将数据写入到缓存中,同时在list中更新位置到队列的同步;
  3. 如果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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux下C/C++ 头文件以及库文件的搜索路径
下一篇:c/c++笔试题(包含语言、数据结构与算法、智力题)

发表评论

最新留言

很好
[***.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
wordpress账号无法登陆_苦闷两个月,wordpress后台不能登陆的问题终于解决了! 2019-04-21
java option作用_java – 类Option [T]的意义是什么? 2019-04-21
php 整形 字符串排序,php-通过特定的字符串值进行排序 2019-04-21
每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决... 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
matlab 函数 向量参数,Scipy integrate(quad,quadration,nquad)不能集成向量参数化函数?等效函数(MATLAB works)... 2019-04-21
arduino如何调用mysql,【 实测可用 】Arduino 直接访问 mysql 2019-04-21
php数据库结构对比 微擎,禾匠数据库对比–微擎通用各类数据库结构对比教程... 2019-04-21
mitproxy php,orion-c 2019-04-21
oracle外部表ora29913,从外部表中选择sqlplus错误:ORA-29913:执行ODCIEXTTABLEOPEN标注时出错... 2019-04-21
oracle负载均衡方案,Oracle负载均衡配置代码 2019-04-21