导航:首页 > 源码编译 > cacheable源码解析

cacheable源码解析

发布时间:2023-04-28 10:06:38

‘壹’ 为什么@Cacheable只能作用于public方法源码这样设计有什么道理吗

一般注解的解析都是通过反射来完成的,在颤并反射的时候如果方法是private修饰的话,冲慎那么就得暴力反射,设置取消权限检查,这样可能会带来很多问题,所以,散洞敬一般都是public修饰,这样反射的时候好调用

如有疑问请追问,满意请采纳,谢谢

‘贰’ CACHEABLE在计算机里是什么意思

分类: 电脑衫拿/网络 >> 反病毒
解析:

CACHE在岩旁计算机里是高速缓存的意思,ABLE在英语里就是起作用的意思,所以合起来就是使高速缓存起作用的意思,这个单词或枣搭在BIOS(CMOS)设置中经常可以看到

‘叁’ Druid连接池源码解析(8)DruidPooledStatement

本来以为pool包收尾了,扫了一下发现还有statement,这块比较简单,是对JDBC的Statement进行了一些封装,实现了与连接池对应的功能,看下类图:

DruidPooledStatement 中最重要的就是execute开头的一系列方法了,是执行SQL的本体,都是对JDBC的Statement的增强,主要多做了以下:

DruidPooledPreparedStatement实现了JDBC的PreparedStatement,是执行预编译的SQL用,跟Connection相同,引入了PreparedStatementHolder这样一个Holder类,同样定义了一些统计属性,其中有个属性pooling,是否池化,引出了PreparedStatementPool,里面用LinkedHashMap实现了LRU,一个cache类用来缓存预编译过的statement;
cache的key定义了一个类,PreparedStatementKey,重写了hashcode和equals方法,很有意思地参考了String的hashcode,用了31这个质数作进制来计算hash,且不仅仅是sql语句相同,需要其他属性都相同才算相同,贴一下源码:

CallableStatement是用来执行函数或者存储过程的,在当下的大环境笑银下,用得真的很少就略过了吧。

druid在JDBC的statement基础上,封装了一些类来扩展自己的属性和功能,一般在工程环境下,基本就用AOP或者装饰器模式来实腔辩现(感觉这个Holder有点像装饰器,又有点像单例的Holder)的,写框架的时候,这种方式还碰圆宴是很值得借鉴的,很内聚、高效,也没有额外的引用
cache的使用很巧妙,但是在刷文章的时候看到过一个问题,虽然在后续版本中修复了,但还是分享一下:
探究Druid连接池“违反协议”异常
这个问题抛的是SQL异常,问题却出在缓存上,对与缓的状态和刷新策略,有了新的认识

‘肆’ Android:深入剖析图片加载库Glide缓存功能(源码分析)

Glide 需要缓存的 图片资源 分为两类:

Glide 的缓存机制使得 Glide 具备非常好的图片缓存效果,从而使得具备较高的图片加载效率。

下面,我将根据 Glide 缓存流程中的每个步骤 进行源码分析。

至此, Glide 的图片缓存 Key 生成完毕。

至此,创建好了缓存对象 LruResourceCache

即:

源码分析如下:

若上述两个方法都没获取到缓存图片时(即内存缓存里没有该图片的缓存),就开启新线程加载图片。

若无法从 内存缓存 里 获得缓存的图片, Glide 就会采用第2级缓存:磁盘缓存 去获取缓存图片

写入 内存缓存分为:写入 弱引用缓存 & LruCache 算法的缓存

写入 LruCache 算法 内存缓存的原理:包含图片资源 resource 的 EngineResource 对象的一个引用机制:

所以:

至此,实现了:

至此, Glide 的图片缓存流程解析完毕。

Android图片加载的那些事:为什么你的Glide 缓存没有起作用?

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度

‘伍’ springboot @Cacheable 基本使用

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

@Cacheable :
        对方法结果进行缓存(主要用于GET方法)
        cacheNames/value:指定缓存主键(Cache)的名字
        key:缓存数据使用key,支持spEl语法
        keyGenerator:key的生成器。与key属性冲突,自定义 keyGenerator 必须实现
        org.springframework.cache.interceptor.KeyGenerator,default使用默认的参数值生成器     
        cacheManager:指定缓存管理器,或者cacheResolver指定获取解析器cacheResolver:与    
        CacheManager冲突condition:指定条件满足才缓存,与unless相反。可以使用spEL语法
        unless:否定缓存,当满足条件时,结果不被缓存。可以获取到结果(#result)进行判断。支持spEL语法
        sync:是否异步模式。在该模式下unless不被支持。default=false
@CachePut:先调用方法,在对结果进行缓存。(主要用于PUT方法),需要注意key的设置@CacheEvict:默认先调用方法,在删除缓存(主要用于DELETE方法)allEntries: 删除缓存组件中(cacheNames/value指定)所有的值beforeInvocation:在方法执行之前删除值,default=false@Caching:组合注解。针对复杂情况@CacheConfig:加载类上,用于设置缓存的共有属纤好兆性  

几个属性:

cacheNames/values:指定缓存组件的名字,将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存

key:缓存数据使用毁租的key;袜稿可以用它来指定。默认是使用方法参数的值 

        可以用spEL表达式来表示;#id-如(getEmp[1]); 参数id的值:  #a0  #p0  #root.args[0]

keyGenerator:key的生成器;可以自己指定key的生成器的组件id

                      key/keyGenerator:二选一使用(自己配置类)

cacheManager:指定使用哪个缓存管理器;或者cacheResolver指定获取解析器

condition:指定符合条件的情况下才缓存; 如:condition = "#a0>1"  即第一个参数值大于1时才进行缓存

unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到的结果进行判断

            如: unless = “#a0”:如果第一个参数值是2,则结果不缓存                unless = “#result == null”  结果为null不缓存结合写法:

@Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#a0>1",unless =  "#a0==2")  意思为 放在的缓存名称为emp中,key的生成方式为配置的myKeyGenerator类,当第一个参数大于1时候缓存,当第一个参数等于2时不缓存

sync:是否使用异步模式(异步模式情况下unless不支持)

//@Cacheable(cacheNames = {"emp"},key = "#root.methodName+'['+#id+']'")

public Employee getEmp(Integer id){

        System.out.println("查询"+id+"号员工");

        Employee emp =  employeeMapper.getEmpById(id);

        return  emp;

    }

此时当id为1时,key的值为 getEmp[1]

@Configuration

public class MyCacheConfig {

    @Bean("myKeyGenerator")

    public KeyGenerator keyGenerator (){

      return  new KeyGenerator(){

            @Override

            public Object generate(Object o, Method method, Object... objects) {

                return method.getName()+"["+ Arrays.asList(objects).toString()+"]";

            }

        };

    };

}

这里返回的key的值为getEmp[[1]]

阅读全文

与cacheable源码解析相关的资料

热点内容
皓强工具解压步骤 浏览:690
部队抗洪抢险命令范文 浏览:888
欧姆龙plc编程软件使用教程 浏览:592
ai文件pdf 浏览:911
腾讯云服务器挂载混合云 浏览:758
智能小车用什么单片机 浏览:463
java怎么给窗口关闭 浏览:940
列举51单片机的寻址方式 浏览:706
剪辑app怎么写长篇文字 浏览:400
app专属流量过月租怎么不更新 浏览:654
王者程序员都有谁 浏览:76
给牛换脚掌解压 浏览:387
围棋有多少种算法 浏览:602
unity资源包在哪个文件夹 浏览:704
阿里云服务器远程链接不成功 浏览:482
文件系统pdf 浏览:767
原神安卓区服什么意思 浏览:38
贝壳app怎么线上发布 浏览:161
如何挑选安卓系统机顶盒 浏览:55
安卓快充使用有什么注意事项 浏览:911