lrucache

Redis内存淘汰策略

时光毁灭记忆、已成空白 提交于 2021-02-09 09:53:00
一、逻辑图 二、淘汰策略 // noeviction 当内存不足时,新写入操作会报错。 // allkeys-random 当内存不足时,在键空间中,随机移除某个key。 // allkeys-lru 当内存不足时,在键空间中,移除最近最少使用的key。 // volatile-lru 当内存不足时,在设置了过期时间的键空间中,移除最近最少使用的key // volatile-random 当内存不足时,在设置了过期时间的键空间中,移除随机某个key // volatile-ttl 当内存不足时,在设置了过期时间的键空间中,有更早过期时间的key优先移除 三、考点剖析 1、如何设置淘汰策略? //Redis.conf maxmemory-policy allkeys-lru 2、LRU算法的简单实现 import java.util.LinkedHashMap; import java.util.Map; public class LruCache<K, V> extends LinkedHashMap<K, V> { private final int maxCapacity; private final float DEFAULT_LOAD_FACTOR = 0.75f; public LruCache(int maxCapacity) { super(maxCapacity,

超详细的Glide源码解析

我与影子孤独终老i 提交于 2021-02-04 19:13:13
1. 简单使用 Glide .with ( this ) .load ( url ) .placeholder ( R .mipmap .ic_launcher ) .error ( R .mipmap .ic_launcher ) .centerCrop () .skipMemoryCache ( true ) .diskCacheStrategy ( DiskCacheStrategy .RESULT ) .priority ( Priority .HIGH ) .into ( mIvMn ); 2. with方法 参数类型:Activity,Context,Fragment,ApplicationContext(本质上也是Context) 类型决定生命周期 2.1 with方法 with方法 public static RequestManager with ( Context context ) { RequestManagerRetriever retriever = RequestManagerRetriever. get (); return retriever. get (context); } public static RequestManager with ( Activity activity ) { RequestManagerRetriever

干货|漫画算法:LRU从实现到应用层层剖析(第一讲)

天涯浪子 提交于 2021-02-02 06:15:35
今天为大家分享很出名的LRU算法,第一讲共包括4节。 LRU概述 LRU使用 LRU实现 Redis近LRU概述 第一部分:LRU概述 LRU是Least Recently Used的缩写,译为最近最少使用。它的理论基础为“ 最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然不会被使用 ”由于该思想非常契合业务场景 ,并且可以解决很多实际开发中的问题,所以我们经常通过LRU的思想来作缓存,一般也将其称为LRU缓存机制。因为恰好leetcode上有这道题,所以我干脆把题目贴这里。但是对于LRU而言,希望大家不要局限于本题(大家不用担心学不会,我希望能做一个全网最简单的版本,希望可以坚持看下去!)下面,我们一起学习一下。 题目: 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作:获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作? 示例: LRUCache

图片加载框架Glide

强颜欢笑 提交于 2021-01-13 11:45:18
为什么要用Glide 链式调用,兼容系统控件imageView,使用非常简单。不必像Fresco那样得用SimpleDrawableView Glide . with ( this ) . load ( data . teacher_image ) . placeholder ( R . drawable . recommend_teacher_icon ) . error ( R . drawable . recommend_teacher_icon ) . apply ( RequestOptions . circleCropTransform ( ) ) . diskCacheStrategy ( DiskCacheStrategy . ALL ) . into ( ivTIcon ) 可以感知activity和fragment的生命周期做图片加载的控制。 实现原理:通过 Glide.with(this)函数,传入当前的context对象。进行相应的判断转化,拿到当前fragmentManager。然后RequestManagerRetriever创建出来一个没有布局的fragment,并且把RequestManager和ActivityFragmentLifecycle相关联,实现生命周期的监控和图片网络请求的处理,防止内存泄露。

redis的过期策略都有哪些?

不打扰是莪最后的温柔 提交于 2020-11-19 04:49:21
1、面试题 redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2、面试官心里分析 1)老师啊,我往redis里写的数据怎么没了? 之前有同学问过我,说我们生产环境的redis怎么经常会丢掉一些数据?写进去了,过一会儿可能就没了。我的天,同学,你问这个问题就说明redis你就没用对啊。redis是缓存,你给当存储了是吧? 啥叫缓存?用内存当缓存。内存是无限的吗,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个G的内存,但是可以有几个T的硬盘空间。redis主要是基于内存来进行高性能、高并发的读写操作的。 那既然内存是有限的,比如redis就只能用10个G,你要是往里面写了20个G的数据,会咋办?当然会干掉10个G的数据,然后就保留10个G的数据了。那干掉哪些数据?保留哪些数据?当然是干掉不常用的数据,保留常用的数据了。 所以说,这是缓存的一个最基本的概念,数据是会过期的,要么是你自己设置个过期时间,要么是redis自己给干掉。 2)老师,我的数据明明都过期了,怎么还占用着内存啊? 还有一种就是如果你设置好了一个过期时间,你知道redis是怎么给你弄成过期的吗?什么时候删除掉?如果你不知道,之前有个学员就问了,为啥好多数据明明应该过期了,结果发现redis内存占用还是很高?那是因为你不知道redis是怎么删除那些过期key的。

Redis的键过期策略及内存淘汰策略简介

眉间皱痕 提交于 2020-11-08 22:06:18
Redis Redis 是高性能的基于内存的 NoSQL 数据库。因为内存是比较宝贵的资源,无法无限制使用,所以 Redis 提供了: 键过期策略 来防止内存饱和。 内存淘汰策略 来使得内存饱和之后继续对外提供服务。 内存过期策略 expire命令 Redis 提供了 expire 命令来给一个键(key)设置过期时间: redis> SET foo "bar" "OK" redis> EXPIRE foo 10 (integer) 1 redis> TTL foo (integer) 10 类似 setex 命令,也可以对目标键设置过期时间,但它其实相当于 set 和 expire 两个命令的原子操作。 expire 只能作用于 Redis 中的键,所以无法对 list 或者 set 中的元素设置过期时间。对某个键调用删除(delete)或者重写(override)的命令如 del , set , getset 之后,会清除键上的过期时间;调用 persist 命令也会清除键上的过期时间;而修改键内容的操作如 incr , hset ,则不会对键的过期时间产生影响。 键的过期原理 Redis 键有两种过期方式:被动方式(passive way)和主动方式(active way)。 被动删除 当某个设置了过期时间的键被访问时,如果发现它已经过期, Redis

MyBatis】MyBatis一级缓存和二级缓存

时光毁灭记忆、已成空白 提交于 2020-10-29 04:33:13
MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。 也就是在同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中; 第二次以后是直接去缓存中取。 当执行SQL查询中间发生了增删改的操作,MyBatis会把SqlSession的缓存清空。 一级缓存的范围有SESSION和STATEMENT两种,默认是SESSION,如果不想使用一级缓存,可以把一级缓存的范围指定为STATEMENT,这样每次执行完一个Mapper中的语句后都会将一级缓存清除。 如果需要更改一级缓存的范围,可以在Mybatis的配置文件中,在下通过localCacheScope指定。 <setting name= "localCacheScope" value= "STATEMENT" /> 建议不需要修改 需要注意的是 当Mybatis整合Spring后,直接通过Spring注入Mapper的形式,如果不是在同一个事务中每个Mapper的每次查询操作都对应一个全新的SqlSession实例,这个时候就不会有一级缓存的命中,但是在同一个事务中时共用的是同一个SqlSession。 如有需要可以启用二级缓存。 二级缓存

手写mybatis框架-增加缓存&事务功能

∥☆過路亽.° 提交于 2020-10-16 08:43:01
增加代码详解 缓存 com.simple.ibatis.cache 缓存接口-Cache public interface Cache { /**放入缓存*/ void putCache(String key,Object val); /**获取缓存*/ Object getCache(String key); /**清空缓存*/ void cleanCache(); /**获取缓存健数量*/ int getSize(); /**移除key的缓存*/ void removeCache(String key); } 自定义框架缓存接口,提供基本的增删改查功能。 缓存基本实现类-SimpleCache public class SimpleCache implements Cache{ // 内部使用HashMap作为缓存实现 private static Map<String,Object> map = new HashMap<>(); // 调用map.put()方法实现存缓存功能 @Override public void putCache(String key, Object val) { map.put(key,val); } // 调用map.get()方法实现取缓存功能 @Override public Object getCache(String key) {

金九银十要来了?不要慌,这些Android BAT高级面试题刷一刷

て烟熏妆下的殇ゞ 提交于 2020-10-02 14:22:36
已经九月中旬了,差不多很多程序员都准备在这个时候跳槽或者找工作了。。。 如果想变得优秀那就去看那些优秀的人在学什么,做什么,想尽一切办法和他们交流;多出去看看这个世界,然后把自己逼到往死里学。 这篇攻略是我从事开发工作七八年来,去面试,以及面试别人的经验总结。其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式,希望对大家之后找工作有帮助! 一、性能优化 App稳定性优化 你们做了哪些稳定性方面的优化? 性能稳定性是怎么做的 业务稳定性如何保障? 如果发生了异常情况,怎么快速止损? App启动速度优化 启动优化是怎么做的? 是怎么异步的,异步遇到问题没有? 启动优化有哪些容易忽略的注意点? 版本迭代导致的启动变慢有好的解决方式吗? 开放问题:如果提高启动速度,设计一个延迟加载框架或者sdk的方法和注意的问题 App内存优化 你们内存优化项目的过程是怎么做的? 你做了内存优化最大的感受是什么? 如何检测所有不合理的地方? App绘制优化 你在做布局优化的过程中用到了哪些工具? 布局为什么会导致卡顿,你又是如何优化的? 做完布局优化有哪些成果产出? 你是怎么做卡顿优化的? 你是怎么样自动化的获取卡顿信息? 卡顿的一整套解决方案是怎么做的? TextView setText耗时的原因,对TextView绘制层源码的理解? 开放问题

一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!

瘦欲@ 提交于 2020-08-19 17:43:22
Python函数定义、匿名函数、嵌套函数、闭包、装饰器 目录 Python函数定义、匿名函数、嵌套函数、闭包、装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 3. 闭包 3.1 特点 3.2 实例 4. 装饰器 4.1 形式和作用 4.2 装饰器函数写法 4.3 装饰器用法实例 5. 匿名函数 5.1 格式 5.2 使用原则 5.3 使用方式 6. python函数式编程 6.1 概念 6.2函数式编程的优缺点 6.3 map()、filter() 和 reduce()函数 函数核心理解 函数也是对象,可以把函数赋予变量 可以把函数当作参数,传入另一个函数中 可以在函数里定义函数,函数嵌套 函数的返回值也可以是函数对象,闭包 1. 函数定义 def name(param1, param2, ..., paramN): statements return/yield value # optional def是可执行语句,函数直到被调用前,都是不存在的,当程序调用函数时,def语句才会创建一个新的函数对象,并赋予其名字 主程序调用函数时,必须保证这个函数此前已经定义过,不然会报错 在函数内部调用其他函数时,函数间哪个申明在前、哪个在后无所谓,只要保证调用时,所需的函数都已经声明定义 python不用考虑输入的数据类型