lrucache

myBatis源码解析-缓存篇(2)

浪尽此生 提交于 2020-08-15 04:02:37
上一章分析了mybatis的源码的日志模块,像我们经常说的mybatis一级缓存,二级缓存,缓存究竟在底层是怎样实现的。此次开始分析缓存模块 1. 源码位置,mybatis源码包位于org.apache.ibatis.cache下,如图 2. 先从org.apache.ibatis.cache下的cache接口开始 // 缓存接口 public interface Cache { // 获取缓存ID String getId(); // 放入缓存 void putObject(Object key, Object value); // 获取缓存 Object getObject(Object key); // 移除某一缓存 Object removeObject(Object key); // 清除缓存 void clear(); // 获取缓存大小 int getSize(); // 获取锁 ReadWriteLock getReadWriteLock(); } mybatis提供了自定义的缓存接口,功能通俗易懂,没什么好解释的。有接口,必然有实现,看一下缓存接口的基本实现类PerpetualCache,所在路径为org.apache.ibatis.cache.impl下。 public class PerpetualCache implements Cache { //

leetcode面试题 16.25. LRU缓存

▼魔方 西西 提交于 2020-08-11 23:14:41
设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。 它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 示例: LRUCache cache = new LRUCache( 2 /* 缓存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 该操作会使得密钥 2 作废 cache.get(2); // 返回 -1 (未找到) cache.put(4, 4); // 该操作会使得密钥 1 作废 cache.get(1); // 返回 -1 (未找到) cache.get(3); // 返回 3 cache.get(4); // 返回 4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com

Redis 的过期策略都有哪些?

我怕爱的太早我们不能终老 提交于 2020-08-11 10:28:39
面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 redis 的数据就一定会存在,后面导致系统各种 bug,谁来负责? 常见的有两个问题: 往 redis 写入的数据怎么没了? 可能有同学会遇到,在生产环境的 redis 经常会丢掉一些数据,写进去了,过一会儿可能就没了。我的天,同学,你问这个问题就说明 redis 你就没用对啊。redis 是缓存,你给当存储了是吧? 啥叫缓存?用内存当缓存。内存是无限的吗,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个 G 的内存,但是可以有几个 T 的硬盘空间。redis 主要是基于内存来进行高性能、高并发的读写操作的。 那既然内存是有限的,比如 redis 就只能用 10G,你要是往里面写了 20G 的数据,会咋办?当然会干掉 10G 的数据,然后就保留 10G 的数据了。那干掉哪些数据?保留哪些数据?当然是干掉不常用的数据,保留常用的数据了。 数据明明过期了,怎么还占用着内存? 这是由 redis 的过期策略来决定。 面试题剖析 redis 过期策略 redis 过期策略是: 定期删除+惰性删除 。 所谓 定期删除 ,指的是 redis 默认是每隔 100ms

LRU算法 java实现

空扰寡人 提交于 2020-08-10 17:50:11
LRU算法介绍 LRU算法全称Least Recently Used,也就是检查最近最少使用的数据的算法。这个算法通常使用在内存淘汰策略中,用于将不常用的数据转移出内存,将空间腾给最近更常用的“热点数据”。 在Redis、Guava等工具中也有非常广泛的应用,甚至是最核心的思想之一。如果今后需要自己设计系统,即使不自己实现这个算法,LRU的思想也仍然是很重要的。 算法很简单,只需要将所有数据按使用时间排序,在需要筛选出LRU数据时,取排名靠后的即可。 算法实现 Redis中的LRU Redis中的数据量通常很庞大,如果每次对全量数据进行排序,势必将对服务吞吐量造成影响。因此,Redis在LRU淘汰部分key时,使用的是采样并计算近似LRU的,因此淘汰的是局部LRU数据。 Redis内存淘汰策略 maxmemory-policy 配置可选参数: noeviction :不淘汰,内存超限后写命令会返回错误(如OOM, del命令除外) allkeys-lru :所有key的LRU机制 在所有key中按照最近最少使用LRU原则剔除key,释放空间 volatile-lru :易失key的LRU 仅以设置过期时间key范围内的LRU(如均为设置过期时间,则不会淘汰) allkeys-random :所有key随机淘汰 一视同仁,随机 volatile-random :易失Key的随机

接地气的面试记录:记一次Android面试心得

家住魔仙堡 提交于 2020-08-10 04:47:44
最近看到很多人都在找工作, 而且很多人都感觉今年找工作比去年难很多, 竞争力也增加不少, 因此激发我整理这份资料, 希望能帮到正在找或者准备找工作的童鞋们. 首先我们能否获得一个面试机会, 那肯定是从简历开始, 简历需要做好功夫, 一份好的简历才足够吸引企业得到面试机会, 接着就是面试了, 面试前必须要先做好准备, 多看一下前辈们总结面试题, 有哪一方面不足的地方赶紧补充一下, 还有要了解一下你即将面试那家公司. 一、简历 网上有很多对程序员简历的一些指导,这里就不重述,大家可以搜下网上其他大神的总结,结合自身情况修改下。我有几点建议: 1.尽量不要花哨,程序员和设计师或者产品运营还不一样,我们的简历成功与否决定权还是在技术面试官那,而他们 看重的是你的项目经验内容和技术等描述。 2. 技能描述这块尽量只写你懂得而且理解深刻的, 可以适当加入一些新技术或流行框架,不过这块需要理解,没来得及看源码的可以看看大神们对它的总结,网上一大堆。 3. 项目经验这块尽量加入关键词, 比如使用了什么技术、用到哪些设计模式、优化数据对比、扩展总结之类的。而非一味地介绍这个项目内容(那是产品经理的描述),比如性能优化这块,分为UI性能优化、内存优化、数据库优化、网络优化、耗电优化等等。可以从 1).如何发现问题 2).怎么解决问题 3).解决效果对比,这几个方面去描述。举个简单例子——UI优化

数据结构与算法-00-数据结构分类

不羁岁月 提交于 2020-08-07 00:27:37
一维 基础: 数组、链表; 高级: 栈、队列、双端队列、集合、映射; 二维 基础: 树、图; 高级: 二叉搜索树(Red-Black Tree, AVL)、堆、并查集DisjointSet、字典树Trie; 特殊 位运算Bitwise:布隆过滤器BloomFilter; LRU Cache。 来源: oschina 链接: https://my.oschina.net/mojiewhy/blog/4335519

Android Bitmap图片优化分析

大憨熊 提交于 2020-07-27 23:07:23
图片移动开发中占据中举足轻重的地位, 一个好的应用不仅能够给用户提供”实用“的功能,早期的android 页面Ui简单,但随着Android系统不断的升级发展, 界面越来越丰富,用户对界面要求越来越高,UI小姐姐们不经需要设计出精致的界面元素,其中不乏一些好看的图片,但是随着手机性能提升(分辨率,cpu主频,内存等),图片质量也越来越大,拍个照动不动就3M,4M,8M, 大家都知道,android 应用创建进程时候,会分配一个固定的内存大小,准确的说话是 google原生OS的默认值是16M,但是各个厂家的系统会对这个值进行修改,如果我们应用直接将这些大图直接加载到内存中,很快内存就会耗尽,最终出现OOM异常,所以图片的处理对于一个稳定,具备丰富界面的应用来说非常重要,今天我们就来聊一聊Bitmap,在开发过程中就把”图片“给优化一番,保证我们项目在线上稳定,流畅运行。 Bitmap Bitmap图像处理的最重要类之一。用它可以获取图像文件信息,进行图像颜色变换、剪切、旋转、缩放等操作,并可以指定格式保存图像文件 如图,bitmap在sdk中算是元老级的人物了,从api1中就已经有了,可见其重要性。 继承关系就不解释了,实现了Parcelable 具备在内存中传递的特性。 bitmap中有两个重要的内部类 CompressFormat 以及 Config 下面分别介绍一下这两个类

第30天: Python collections 模块

扶醉桌前 提交于 2020-07-27 08:18:39
by 豆豆 1.简介 collections 是 python 的内置模块,提供了很多方便且高性能的关于集合的操作,掌握这些知识有助于提高代码的性能和可读性。 2.常用功能 2.1 namedtuple 功能详解 namedtuple() 返回一个新的元组子类,且规定了元组的元素的个数,同时除了使用下标获取元素之外,还可以通过属性直接获取。 from collections import namedtuple User = namedtuple("User",["name", "age", "weight"]) user = User("admin", "20", "60") name, age, weight = user print(user[0]) print(name, age, weight) print(user.name, user.age, user.weight) # 输出结果如下 admin admin 20 60 admin 20 60 由以上代码可以看出,namedtuple() 相当于直接定义了一个新的类,但是这个类跟传统的定义 class 的方式又有着巨大的区别。该方式会比直接定义 class 的方式省很多空间,其次其返回值是一个 tuple,支持 tuple 的各种操场。 同时,namedtuple() 还自带两个非常好用的方法。 #

手撸LRU算法和LRU在Redis中的配置详解

强颜欢笑 提交于 2020-07-25 14:27:17
1、概念 LRU是Least Recently Used的缩写,即最近最少使用。百度百科中说:LRU是一种常用的 页面置换算法 ,选择最近最久未使用的页面予以淘汰。铁子们说:LRU是一种缓存淘汰算法,其核心思想是,如果数据最近被访问过,那么将来被访问的几率也更高。 2、实现原理分析 灵机一动,我瞬间想到了一种实现方法,为每一个缓存对象设置一个计数器,每次缓存命中则给计数器加1,随着新缓存的数量一直增加,一旦内存耗尽就需要淘汰旧缓存,但是淘汰缓存要遍历所有的计数器,并将计数器值最小的缓存对象丢弃。 显然,上述实现LRU的思路弊端很明显,如果缓存的数量少,问题不大, 但是缓存数量达到十万或者百万量级,如果需要淘汰缓存对象,则需要遍历所有计算器,想一想就非常可怕,其性能与资源消耗是巨大的,效率也就非常的慢了。 如果用数组做缓存对象存储,在数组中移动对象的话,需要进行整体copy,性能也是不佳。就在此时,电闪雷鸣,风雨交加,外面突然下起了雨,我站在窗前,发现雨点打在地上呈现出了链表两个字,顿时豁然开朗,土地平旷,屋舍俨然。 考虑到链表中进行节点的移动,只需要改变指针的指向,效率是很高的,但是获取元素的效率不高,故考虑HashMap和链表结合的方式,类似于LinkedHashMap的实现。 3、手写LRU简单实现 定义一个缓存节点 /** * 缓存节点 */ public class

【JDK】JDK源码分析-LinkedHashMap

▼魔方 西西 提交于 2020-05-08 07:10:55
概述 前文「 JDK源码分析-HashMap(1) 」分析了 HashMap 主要方法的实现原理(其他问题以后分析),本文分析下 LinkedHashMap。 先看一下 LinkedHashMap 的类继承结构图: 可以看到 LinkedHashMap 继承了 HashMap。 我们知道 HashMap 是无序的,即迭代器的顺序与插入顺序没什么关系。而 LinkedHashMap 在 HashMap 的基础上增加了顺序:分别为「插入顺序」和「访问顺序」。即遍历 LinkedHashMap 时,可以保持与插入顺序一致的顺序;或者与访问顺序一致的顺序。 LinkedHashMap 内部如何实现这两种顺序的呢?它是通过一个双链表来维持的。因此可以将 LinkedHashMap 理解为「双链表 + 散列表」,或者“有序的散列表”。 代码分析 节点类 Entry LinkedHashMap 内部有一个嵌套类 Entry,它继承自 HashMap 中的 Node 类,如下: static class Entry<K,V> extends HashMap.Node<K,V> { Entry <K,V> before, after; Entry( int hash, K key, V value, Node<K,V> next) { super (hash, key, value, next);