lrucache

Golang groupcache LRU 缓存简介与用法

你说的曾经没有我的故事 提交于 2020-05-07 15:06:06
1.LRU LRU(Least Recently Used,最近最久未使用算法)是一种常见的缓存淘汰算法,当缓存满时,淘汰最近最久未使用的元素,在很多分布式缓存系统(如 Redis , Memcached)中都有广泛使用。其基本思想是如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当缓存满时,最久未被访问的数据最先被淘汰。具体做法是将最近使用的元素存放到靠近缓存顶部的位置,当一个新条目被访问时,LRU 将它放置到缓存的顶部。当缓存满时,较早之前访问的条目将从缓存底部被移除。 2.groupcache LRU Cache 简介 在 Go 中,如果想使用 LRU 缓存,可以使用 Google Golang 团队官方出品的开源库 groupcache ,开源地址见 Github.groupcache 。LRU 缓存通过 groupcache/lru/lru.go实现,它主要是封装了一系列 LRU 缓存操作的相关的接口。主要有: //创建一个 LRU Cache func New (maxEntries int ) *Cache //向 Cache 中插入一个 KV func (c *Cache ) Add (key Key , value interface { } ) //从 Cache 中获取一个 key 对应的 value func (c

6 手写Java LinkedHashMap 核心源码

六月ゝ 毕业季﹏ 提交于 2020-05-05 00:49:31
概述 LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(Least Recently Used)算法,即最近最少使用算法,核心思想就是当缓存满时,会优先淘汰那些近期最少使用的缓存对象 LruCache的缓存算法 LruCache采用的缓存算法为LRU(Least Recently Used),最近最少使用算法。核心思想是当缓存满时,会首先把那些近期最少使用的缓存对象淘汰掉 LruCache的实现 LruCache底层就是用LinkedHashMap来实现的。提供 get 和 put 方法来完成对象的添加和获取 LinkedHashMap与HashMap的区别 相同点: 1. 都是key,value进行添加和获取 2. 底层都是使用数组来存放数据 不同点: 1. HashMap是无序的,LinkedHashMap是有序的(插入顺序和访问顺序) 2. LinkedHashMap内存的节点存放在数据中,但是节点内部有两个指针,来完成双向链表的操作,来保证节点插入顺序或者访问顺序 LinkedHashMap的使用 LinkedHashMap插入顺序的演示代码 public static void main(String[] args) { //默认记录的就是插入顺序 Map<String, String

Using Redis as an LRU cache (将redis用作LRU缓存)

橙三吉。 提交于 2020-03-09 18:02:34
When Redis is used as a cache, often it is handy to let it automatically evict old data as you add new data. This behavior is very well known in the community of developers, since it is the default behavior of the popular memcached system. LRU is actually only one of the supported eviction methods. This page covers the more general topic of the Redis maxmemory directive that is used in order to limit the memory usage to a fixed amount, and it also covers in depth the LRU algorithm used by Redis, that is actually an approximation of the exact LRU. Starting with Redis version 4.0, a new LFU

题目:LRU 缓存机制

给你一囗甜甜゛ 提交于 2020-03-08 20:06:45
题目: LRU 缓存机制 设计和实现一个 LRU(最近最少使用)缓存数据结构,使它应该支持一下操作:get 和 put。 get(key) - 如果 key 存在于缓存中,则获取 key 的 value(总是正数),否则返回 -1。 put(key,value) - 如果 key 不存在,请设置或插入 value。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。 出题人:文景/阿里云 CDN 资深技术专家 参考答案: python版本的: def visit_key(self, key): if key in self.keys: self.keys.remove(key) self.keys.append(key) def elim_key(self): key = self.keys[0] self.keys = self.keys[1:] del self.cache[key] def get(self, key): """ :type key: int :rtype: int """ if not key in self.cache: return -1 self.visit_key(key) return self.cache[key] def put(self, key, value): """ :type key: int :type value:

picasso 之 LruCache

元气小坏坏 提交于 2020-03-06 18:30:19
Lru是一种页面置换算法,当进程访问的页面不在内存,而且内存已无空闲空间时,系统必须从内存中调出一页送到磁盘的对换区。 调出的这一页到底是哪页呢?Lru就是其中一种算法,称为“最近最久未使用算法”。 从构造方法开始, /** Create a cache using an appropriate portion of the available RAM as the maximum size. */ public LruCache(Context context) { this(Utils.calculateMemoryCacheSize(context)); } /** Create a cache with a given maximum size in bytes. */ public LruCache(int maxSize) { if (maxSize <= 0) { throw new IllegalArgumentException("Max size must be positive."); } this.maxSize = maxSize; this.map = new LinkedHashMap<String, Bitmap>(0, 0.75f, true); } 初始化了允许最大缓存大小,和LinkedHashMap 最重要的应该是get,set方法:

07.Android之多媒体问题

扶醉桌前 提交于 2020-03-01 21:14:47
目录介绍 7.0.0.1 加载bitmap图片的时候需要注意什么?为何bitmap容易造成OOM?如何计算Bitmap占用内存? 7.0.0.2 如何理解recycle释放内存问题?图片加载到内存其实有两部分数据,这是为何? 7.0.0.3 如何在不压缩图片的情况下加载高清大图?加载图的机制是什么,为何不会内存泄漏? 7.0.0.7 LRU算法的原理?核心思想是什么?如果缓存满了的话,什么方法来管理移除最近最少使用的item和添加新的item? 好消息 博客笔记大汇总【15年10月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计500篇[近100万字],将会陆续发表到网上,转载请注明出处,谢谢! 链接地址: https://github.com/yangchong211/YCBlogs 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!所有的笔记将会更新到GitHub上,同时保持更新,欢迎同行提出或者push不同的看法或者笔记! 7.0.0.1 加载bitmap图片的时候需要注意什么?为何bitmap容易造成OOM

Glide之LruCache

↘锁芯ラ 提交于 2020-02-26 23:32:07
Glide中的LruCache和Android中的LruCache不太一样,属于简化版本,不过思想是一样的。都是利用了LinkedHashMap accessOrder 等于true时会对内容按照访问的先后顺序排序,会把最近访问的元素放到双链表的尾部这样一个特性实现的。 Glide中LruResourceCache继承了LruCache实现了MemoryCache接口,这个内存缓存池的大小是MemorySizeCalculator计算出来的,就是和屏幕一样大的两张图,RGBA存储占用的字节数 Java集合详解5:深入理解LinkedHashMap和LRU缓存 来源: CSDN 作者: Zhongyi_Li 链接: https://blog.csdn.net/lizhongyisailang/article/details/104523820

被裁的第50天,我终于拿到心仪公司Offer

杀马特。学长 韩版系。学妹 提交于 2020-02-26 17:01:24
今天分享的是之前分享文章中被裁的小C,可以看这篇文《寒冬之下,被cai的那些人到底去哪了?》,最近他已经找到心仪公司今日头条Offer,并且即将入职,在应我要求下,他写了篇总结文如下。下文中的"我",不是鱼哥,是特指小C。 这两个月听的最多的两个词就是 寒冬 和 裁员 ,作为被裁大军中的一员,经历焦虑到担心,再到自信,最后到喜悦。焦虑的是那段被裁日子,不太好过,每天不敢下楼,就在房间里复习。也不敢告诉家里人。担心的是自己找不到工作,成为失业人员。自信是拿了几家二、三线厂offer后,越来越自信。喜悦是同时也拿到自己梦寐以求的公司绿灯通道。今天主要分享下技术面试过程中需要注意的点。 更新简历 在鱼哥指导下,我把简历中亮点项目的一些细节着重介绍了下,以及做的一些成绩用数据量化,简历最好不要写太多页,一般2-3页就够,捡重点写,写牛逼的地方和自己亲自参与的,最好不要写牛逼的项目,但是你却不熟悉的,这很打脸,让人怀疑你的真实性。这点很感谢鱼哥指导。 投递简历 投递简历基本都是找人内推,拉钩,boss上回复意愿貌似很低,有些公司不像是真正招人,内推好处就是可以后续方便跟踪反馈,开始没有着急出去面试,而是准备了半个月有余,把过去从Java,Android,设计模式,算法与数据结构,基本都过了一遍,弱项是算法与数据结构,这里主要去刷了些题目,在LeetCode上。 复习内容 在 Java复习 中

Android 高效加载大图片

╄→尐↘猪︶ㄣ 提交于 2020-02-16 21:29:30
我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。 我们可以通过下面的代码看出每个应用程序最高可用内存是多少。 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); 因此在展示高分辨率图片的时候,最好先将图片进行压缩。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。下面我们就来看一看,如何对一张大图片进行适当的压缩,让它能够以最佳大小显示的同时,还能防止OOM的出现。 BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法

Android-加载图片避免OOM

删除回忆录丶 提交于 2020-02-16 21:28:50
http://blog.csdn.net/guolin_blog/article/details/9316683 高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少。 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); Log.d("TAG", "Max memory is " + maxMemory + "KB"); 因此在展示高分辨率图片的时候,最好先将图片进行 压缩 。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。下面我们就来看一看,如何对一张大图片进行适当的压缩,让它能够以最佳大小显示的同时,还能防止OOM的出现。 大体思路如下: 1.压缩图片 获取图片的长度