基于LRU算法的缓存实现
林小应
1. 问题描述
业务系统中,可能会用到很多规格数据。如果每次都从数据库读取,开销是很大的。一次业务操作,可能会取几千次,甚至更多。如通信、银行、证券等系统的规则校验就是这样。
很多系统开始使用缓存机制,如memcached、redis。它们的性能都很好,但是都有一个序列化、反序列化的过程。一次反序列化开销可能是1ms。而对于规格数据,我们在应用程序中一般是不会修改的,所以我们不希望序列化、反序列化。
我们可以将这些规格数据存放在内存容器中,直接使用,速度非常快。但是不能全部放进来,那样可能会OutOfMemory。
so、我们希望在内存中存放最近最常用的一些规格数据。比如,存放最近最常用的1万条规格数据、并且一个小时不被使用的全部被剔除。
2. 期望
提高读取配置数据的速度,就像从内存读取一个常量一样。必须支持实时刷新,如果数据库里面的规格数据被修改了,可以在3s内反应到缓存,缓存做出对应的更新。
对于规格数据还支持分地区存放(如江苏的13个地市)、分模块存放(如产品、客户)。
3. 设计原理
我们以江苏省某系统为例、配置数据分为13个本地网(南京、镇江、扬州、常州、无锡、苏州……),简单说明一下具体思路。
给每个本地网建一个容器,这里是一个线程安全的HashMap。将最近访问到的配置数据包装成一个特殊对象(SVObject自检测对象)存入HashMap。
HashMap中存放的对象包含一个属性“最后访问时间”,客户端每次访问该对象都会更新一下“最后访问时间”。
启动一个监控线程,不断扫描13个本地网的HashMap容器,发现有最后访问时间距离当前超过一小时的,就将其剔除。
另外,客户端从HashMap取数据时,需要先检验一下当前的缓存版本是否和容器中的数据使用的缓存版本相同。如果不相同,说明缓存版本有更新,就将原来的HashMap容器清空。重新建一个HashMap容器,替代原来的(这一步是很讲究的)。
客户端从HashMap容器中取到对象,就返回,如果没有取到,就去数据库读取,然后将读到的数据包装成SVObject,存入HashMap容器(如果容量小于一万)、返回。
数据存在形式:
4.用法示例
Object obj = SVCacheUtil.getCache(key,areaCode,version,cacheGetter);
其中 version是当前缓存版本,cacheGetter是缓存客户端对象,是不是很简单。
qq:346420558
分享到:
相关推荐
在C语言中实现LRU算法,需要理解数据结构和算法的基础知识,以及如何在C语言中有效地管理内存。 首先,LRU算法的核心是数据结构的选择。通常使用双向链表来存储数据,因为双向链表允许我们快速地插入和删除元素,...
实验内容包括实现LRU算法的两种不同变体:计数器实现和栈实现。在计数器实现中,每个页面都有一个访问计数器,每当页面被访问时,计数器增加,淘汰时选择计数最小的页面。而在栈实现中,页面按访问顺序存储在栈中,...
在Java中实现LRU算法,通常会使用数据结构如HashMap或LinkedHashMap来存储页面及其访问信息。HashMap提供快速的查找操作,而LinkedHashMap则同时保持了插入顺序,这对于实现LRU至关重要,因为我们需要快速找到最近...
在数据库管理系统中,Buffer Pool(缓冲...以上内容涵盖了Buffer Pool中缓存页管理的核心概念,包括LRU算法在缓存淘汰中的应用。这些知识点对于理解和优化数据库性能至关重要,是数据库管理员和开发者必须掌握的技术。
### LRU算法C语言实现详解 #### 一、引言 LRU(Least Recently Used,最近最少使用)算法是一种常用的数据缓存淘汰策略,在计算机科学领域应用广泛,尤其是在操作系统、数据库管理和Web服务器缓存管理等方面。本文...
LRU算法的实现通常依赖于数据结构,如哈希表和双向链表。在C++中,我们可以使用`std::unordered_map`来存储页面及其访问时间,同时使用`std::list`来维护页面的顺序。以下是一个简单的C++实现概述: ```cpp #...
本篇文章将深入探讨LRU算法的基本原理,并通过一个具体的Node.js实现案例来展示如何利用LRU算法进行高效的缓存管理。 #### 二、LRU算法简介 LRU算法的核心思想是当缓存空间满时,优先淘汰那些最近最久未使用的数据...
通过以上介绍,我们可以看出LRU算法在Java中的实现主要依赖于HashMap和DoublyLinkedList这两个数据结构,它们结合在一起提供了高效且灵活的缓存管理能力。在实际应用中,LRU算法广泛应用于数据库的缓存系统、操作...
在实现LRU算法时,通常会用到数据结构如链表和哈希表。链表用于快速定位最近使用和最久未使用的页面,而哈希表用于快速查找页面。当一个页面被访问时,它会被移到链表的头部,表示最近被使用。如果链表已满,且有新...
LRU(Least Recently Used...总结一下,LRU算法是一种基于历史访问行为的缓存策略,它通过淘汰最近最少使用的数据来优化内存使用。在实际应用中,如数据库缓存、操作系统的页面替换策略等,LRU算法都展现出良好的性能。
当缓存满时,LRU算法会优先淘汰最近最少使用的数据。在这个Java实现的LRU缓存中,我们可能会看到以下几个关键知识点: 1. **数据结构的选择**: LRU缓存通常基于哈希表和双向链表实现。哈希表用于快速查找,而双向...
在操作系统、数据库管理系统和缓存系统等领域,LRU算法都有广泛的应用。在这个实验设计课程中,我们将探讨LRU算法的原理和实现。 首先,我们需要理解LRU算法的核心思想。假设有一个固定大小的缓存(或内存),当新...
在实际应用中,LRU 算法常用于缓存管理和数据库系统,以优化数据的访问效率。例如,当内存不足以存放所有数据时,LRU 可以帮助决定哪些数据应该被暂时移除,以便为更重要的数据腾出空间。由于 LRU 的高效性和直观性...
LRU(Least Recently Used)算法是一种常用的页面替换算法,用于管理有限的内存资源。...通过深入研究这个LRU算法的实现,你不仅可以掌握LRU算法的工作原理,还能了解到如何在实际项目中应用和优化这种缓存策略。
现在,实现LRU算法的主要逻辑在up_cache函数中,该函数将页面访问序列walk_sort和缓存数组cache作为输入参数。 void up_cache(Cache cache[], int walk_sort[]) { int i = 0; // i 为访问序列数组的下标 int x; ...
首先,我们需要创建一个基于LRU算法的缓存类。这个类通常继承自Android的`BaseCache`或者自定义一个Map结构,如`LinkedHashMap`,因为`LinkedHashMap`已经实现了LRU特性,它维护了一个双向链表,可以按照插入或访问...
在本篇文章中,我们将深入探讨一个基于C语言实现的LRU算法示例,该示例通过队列的形式来管理缓存中的页面,以确保能够有效地执行淘汰策略。 #### 关键知识点 ##### 1. 数据结构定义 在给定的代码片段中,作者使用...
LRU 算法的实现最常见的是使用一个链表保存缓存数据。详细算法实现如下: 1. 新数据插入到链表头部; 2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 3. 当链表满的时候,将链表尾部的数据丢弃。 3...
在众多缓存淘汰策略中,LRU算法因其较好的效果和较低的实现复杂度而受到青睐。 #### LRU算法的原理 LRU算法的基本思想是:当缓存空间不足时,优先淘汰那些最近最少被访问的数据项。这样做的理由是基于局部性原理...