cache 订阅
Caché,是 一种后关系型数据库。能并发访问同一数据的数据库技术。 展开全文
Caché,是 一种后关系型数据库。能并发访问同一数据的数据库技术。
信息
定    义
一种后关系型数据库
作    用
对事务数据的实时查询
针对对象
为专业开发者而设计
中文名
Caché
Caché简介
什么是 Caché?。它独一无二地提供了三种整合的、能并发访问同一数据的数据库技术:成熟的对象访问方式,高性能的 SQL 访问方式以及丰富的多维访问。在对象数据、关系型数据以及多维数据视图之间不需要映射,这样就大大节省了开发和运行时间。
收起全文
精华内容
参与话题
问答
  • cache

    千次阅读 2018-11-01 17:39:40
    CPU,内存和cache之间的关系 和 cache的操作 https://blog.csdn.net/vanbreaker/article/details/7470830 cache和内存的关联方式(associativity) https://blog.csdn.net/vanbreaker/article/details/7475093 ...

    CPU,内存和cache之间的关系  和 cache的操作

    https://blog.csdn.net/vanbreaker/article/details/7470830

    cache和内存的关联方式(associativity)

    https://blog.csdn.net/vanbreaker/article/details/7475093

    cache的写策略和多处理器支持

    https://blog.csdn.net/vanbreaker/article/details/7477853#comments

    cache读写机制

    https://blog.csdn.net/tc_xjyxhd/article/details/50603007

    首先是Write-through和Write-back的区别:(这部分参考:http://witmax.cn/cache-writing-policies.html)

    Write-through(直写模式、写透模式):数据更新时,同时写入Cache和下一级存储。不存在dirty问题。

    优点:简单可靠,不涉及cahce一致性问题;缺点:速度慢(因为同时写下一级存储(比如DDR))。

    Write-back(回写模式):数据更新时,只写Cache;当数据被替换出来时,才将该被修改的Cache数据写到下一级存储。涉及dirty这个概念。

    优点:速度快;下一级存储没有副本,若出现意外情况数据将丢失。

    顺便,dirty:是指cache某个位置数据被更新了,但是还没更新其对应的下一级存储位置(即cache不一致);相反

       clean:cache数据与下一级存储位置数据一致

    而allocate是针对cache miss时的处理方式,下面是我的理解:

    No-allocate:不论读、写操作,cache miss时,直接写下一级存储(如DDR)

    Read-allocate:读操作,cache miss时,在cache中分配一个空间,从下一级存储读取该数据到cache分配的这个空间,最后读取该值。注意:对于Write-back模式,如果分配的这个位置原数据是dirty的,需要将该数据先写回下一级存储。

    Write-allocate:写操作,cache miss时,在cache中分配一个空间,将数据先写入该位置,根据Write-back还是Write-through决定是否再写入下一级存储。注意:对于Write-back模式,如果分配的这个位置原数据是dirty的,需要将该数据先写回下一级存储。


    下面为参考网址给出的2个示例图,第一个是Write-through Read-allocate,第二个是Write-back Read and Write-allocate

    A Write-Through cache with No-Write Allocation

    简单总结一下该部分:Write-through和Write-back为写入cache的模式,区别是在写cache时是否还同时写下一级memory;allocate那堆只在cache miss时生效,负责分配cache空间给读和写中转用;另外,dirty只发生在Write-back模式,需要额外进行一步回写。
     

    Cache基础知识归纳总结

    https://blog.csdn.net/u010959074/article/details/52051606

    1、缓存行
    a) 缓存行:CPU不再是按字节访问内存,而是以64字节为单位的块(chunk)拿取,称为一个缓存行(cache line)。
    b) 当程序运行的时间主要与内存访问的次数相关时,Cache的影响很重要。
    c) 内存被分割成主存块(chunk)
    d) 数据对齐。
    2、L1和L2缓存
    a) L1数据缓存,一个32KB的L1指令缓存,还有一个4MB大小L2数据缓存。L1缓存是处理器独享的,L2缓存是成对处理器共享的。
    b) L1 速度 > L2 速度
    c) 计算机的计算数据需要从磁盘调度到内存,然后再调度到L2 Cache,再到L1 Cache,最后进CPU寄存器进行计算。
    3、指令级别的并发
    a) 指令级别的并发性:部分指令具有并发性,U/V两条流水线。
    4、缓存的关联性
     
    a) 缓存关联性
    b) 直接映射:每个内存块只能映射到一个特定的缓存槽
    c) N路组关联(N-way set associative cache):每个内存块能够被映射到N路特定缓存槽中的任意一路。
    d) 完全关联(Fully associative cache):每个内存块能够被映射到任意一个缓存槽。操作效果上相当于一个散列表。
    5、缓存行的为共享
    a) 缓存行的为共享:当一个处理器改变了属于它自己缓存中的一个值,其它处理器就再也无法使用它自己原来的值,因为其对应的内存位置将被刷新(invalidate)到所有缓存。而且由于缓存操作是以缓存行而不是字节为粒度,所有缓存中整个缓存行将被刷新!
    b) volatile关键字
    当变量被某个线程A修改值之后,其它线程比如B若读取此变量的话,立刻可以看到原来线程A修改后的值
    注:普通变量与volatile变量的区别是volatile的特殊规则保证了新值能立即同步到主内存,以及每次使用前可以立即从内存刷新,即一个线程修改了某个变量的值,其它线程读取的话肯定能看到新的值;
    6、硬件复杂性
    a) 有些处理器上,L1缓存能够并发处理两路访问,如果访问是来自不同的存储体(?),而对同一存储体的访问只能串行处理。而且处理器聪明的优化策略也会使你感到惊讶,比如在伪共享的例子中,以前在一些没有微调的机器上运行表现并不良好,但我家里的机器能够对最简单的例子进行优化来减少缓存刷新。


    a) 程序的运行存在时间和空间上的局部性
    前者是指只要内存中的值被换入缓存,今后一段时间内会被多次引用,后者是指该内存附近的值也被换入缓存。如果在编程中特别注意运用局部性原理,就会获得性能上的回报。
    比如C语言中应该尽量减少静态变量的引用,这是因为静态变量存储在全局数据段,在一个被反复调用的函数体内,引用该变量需要对缓存多次换入换出,而如果是分配在堆栈上的局部变量,函数每次调用CPU只要从缓存中就能找到它了,因为堆栈的重复利用率高。
    再比如循环体内的代码要尽量精简,因为代码(就是指令?)是放在指令缓存里的,而指令缓存都是一级缓存,只有几K字节大小,如果对某段代码需要多次读取,而这段代码又跨越一个L1缓存大小,那么缓存优势将荡然无存。
    b)关于CPU的流水线(pipeline)并发性简单说说,
    Intel Pentium处理器有两条流水线U和V,每条流水线可各自独立地读写缓存,所以可以在一个时钟周期内同时执行两条指令。但这两条流水线不是对等的,U流水线可以处理所有指令集,V流水线只能处理简单指令。
    CPU指令通常被分为四类,第一类是常用的简单指令,像mov, nop, push, pop, add, sub, and, or, xor, inc, dec, cmp, lea,可以在任意一条流水线执行,只要相互之间不存在依赖性,完全可以做到指令并发。
    第二类指令需要同别的流水线配合,像一些进位和移位操作,这类指令如果在U流水线中,那么别的指令可以在V流水线并发运行,如果在V流水线中,那么U流水线是暂停的。
    第三类指令是一些跳转指令,如cmp,call以及条件分支,它们同第二类相反,当工作在V流水线时才能通U流水线协作,否则只能独占CPU。
    第四类指令是其它复杂的指令,一般不常用,因为它们都只能独占CPU。
    如果是汇编级别编程,要达到指令级别并发,必须要注重指令之间的配对。尽量使用第一类指令,避免第四类,还要在顺序上减少上下文依赖。

    a) 缓存行的开始点?数据对齐?
    主存块(chunk),如果是8字节对齐则,起始地址为8的倍数。
    http://www.cnblogs.com/bakari/archive/2012/08/27/2658956.html
    Cache line alignment (cache对齐)
    数据跨越两个cache line,就意味着两次load或者两次store。如果数据结构是cache line对齐的,  就有可能减少一次读写。数据结构的首地址cache line对齐,意味着可能有内存浪费(特别是  数组这样连续分配的数据结构),所以需要在空间和时间两方面权衡。
    对于普通代码,内存边界对齐也是有好处的,可以降低高速缓存(Cache)和内存交换数据的次数。主要问题是在于Cache本身是分成很多Cache-Line,每条Cache-Line具有一定的长度,比如一般来说L1 Cache每条Cache Line长度在32个字节或64个字节;而L2的会更大,比如64个字节或128个字节。用户每次访问地址空间中一个变量,如果不在Cache当中,那么就需要从内存中先将数据调入Cache中.
    比如现在有个变量 int x;占用4个字节,它的起始地址是0x1234567F;那么它占用的内存范围就在0x1234567F-0x12345682之间。如果现在Cache Line长度为32个字节,那么每次内存同Cache进行数据交换时,都必须取起始地址时32(0x20)倍数的内存位置开始的一段长度为32的内存同Cache Line进行交换.   比如0x1234567F落在范围0x12345660~0x1234567F上,但是0x12345680~0x12345682落在范围 0x12345680~0x1234569F上,也就是说,为了将4个字节的整数变量0x1234567F~0x12345682装入Cache,我们必 须调入两条Cache Line的数据。但是如果int x的起始地址按4的倍数对齐,比如是 0x1234567C~0x1234567F,那么必然会落在一条Cache Line上,所以每次访问变量x就最多只需要装入一条Cache Line的数据了。比如现在一般的malloc()函数,返回的内存地址会已经是8字节对齐的,这个就是为了能够让大部分程序有更好的性能。

    b)多级缓存,级数设置?
    1级速度要求最高的速度,2级次之,3级最次,3个级数就够了,95%调用缓存,再多成本高。


    c)L1与L2的合作?
    http://coolshell.cn/articles/3236.html
    计算机的计算数据需要从磁盘调度到内存,然后再调度到L2 Cache,再到L1 Cache,最后进CPU寄存器进行计算。
    d) CPU的流水线?
    http://blog.jobbole.com/40844/
    I486拥有五级流水线。分别是:取指(Fetch),译码(D1, main decode),转址(D2, translate),执行(EX, execute),写回(WB)。某个指令可以在流水线的任何一级。
     
    但是这样的流水线有一个明显的缺陷。对于下面的指令代码,它们的功能是将两个变量的内
    容进行交换。
    1
    2
    3

    XOR a, b
    XOR b, a
    XOR a, b
    从8086直到386处理器都没有流水线。处理器一次只能执行一条指令。再这样的架构下,上面的代码执行并不会存在问题。
    但是i486处理器是首个拥有流水线的x86处理器,它执行上面的代码会发生什么呢?当你一下去观察很多指令在流水线中运行,你会觉得混乱,所以你需要回头参考上面的图。
    第一步是第一条指令进入取指阶段;然后在第二步第一条指令进入译码阶段,同时第二条指令进入取指阶段;第三步第一条指令进入转址阶段,第二条指令进入译码阶段,第三条指令进入取指阶段。但是在第四步会出现问题,第一条指令会进入执行阶段,而其他指令却不能继续向前移动。第二条xor指令需要第一条xor指令计算的结果a,但是直到第一条指令执行完成才会写回。所以流水线的其他指令就会在当前流水级等待直到第一条指令的执行和写回阶段完成。第二条指令会等待第一条指令完成才能进入流水线下一级,同样第三条指令也要等待第二条指令完成。
    这个现象被称为流水线阻塞或者流水线气泡。


    e) 本机中的缓存大小
    L1d cache:             12*32K  独享
    L1i cache:              12*32K独享
    L2 cache:              12*256K独享
    L3 cache:              30720K  一个物理cpu中所有内核共享
    NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46
    NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47
    f )  L1、L2缓存行大小。
    英特尔酷睿i7,酷睿, Atom和NetBurst, Core Solo和Pentium M处理器的L1,L2或L3缓存的高速缓存行是64个字节宽。


    g)写命中:
    http://blog.csdn.net/opensure/article/details/46669337
    当处理器将操作数写回到一个内存缓存的区域时,它首先会检查这个缓存的内存地址是否在缓存行中,如果不存在一个有效的缓存行,则处理器将这个操作数写回到缓存,而不是写回到内存,这个操作被称为写命中。

    ----------------------------------------------------------------------------

    术语 英文单词 描述
    共享变量 在多个线程之间能够被共享的变量被称为共享变量。共享变量包括所有的实例变量,静态变量和数组元素。他们都被存放在堆内存中,Volatile只作用于共享 变量。
    内存屏障 Memory Barriers 是一组处理器指令,用于实现对内存操作的顺序限制。
    备注: In the Java Memory Model a volatile field has a store barrier inserted after a write to it and a load barrier inserted before a read of it.
    缓冲行 Cache line 缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期。
    原子操作 Atomic operations 不可中断的一个或一系列操作。
    缓存行填充 cache line fill 当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个缓存行到适当的缓存(L1,L2,L3的或所有)
    缓存命中 cache hit 如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的地址时,处理器从缓存中读取操作数,而不是从内存。
    写命中 write hit 当处理器将操作数写回到一个内存缓存的区域时,它首先会检查这个缓存的内存地址是否在缓存行中,如果不存在一个有效的缓存行,则处理器将这个操 作数写回到缓存,而不是写回到内存,这个操作被称为写命中。
    写缺失 write misses the cache 一个有效的缓存行被写入到不存在的内存区域。
     

    展开全文
  • Cache

    千次阅读 2016-09-01 23:14:04
    Cache失效的原因 强制性失效 (Compulsory miss): 当第一次访问一个块时,该块不在 Cache中, 需从下一级存储中调入 Cache, 这就是强制性失效。这种失效也称为冷启动失效,或首次访问失效。(增加块大小,预取) 容量...
    1. Cache失效的原因
      1. 强制性失效 (Compulsory miss): 当第一次访问一个块时,该块不在 Cache中, 需从下一级存储中调入 Cache, 这就是强制性失效。这种失效也称为冷启动失效,或首次访问失效。(增加块大小,预取)
      2. 容量失效 (Capacity miss): 如果程序执行时所需的块不能全部调入 Cache 中, 则当某些块被替换后, 若又重新被访问, 就会发生失效。这种失效称为容量失效。(增加容量) 抖动现象。
      3. 冲突失效 (Conflict miss): 在组相联或直接映像 Cache 中, 若太多的块映像到同一组(块)中,则会出现该组中某个块被别的块替换、然后又被重新访问的情况。这就是发生了冲突失效。这种失效也称为碰撞失效 (collision) 或干扰失效 (interference)。(提高相联度)
    2. Cache性能的衡量标准
      1. 缺失率:访问Cache失效次数/访问内存总次数
        Miss Rate = Misses / Memory accesses
      2. 每条指令缺失次数:
        Misses/Instruction = Miss Rate * Memory accesses / Instruction
      3. 平均内存访问时间:
        Average memory access time = Hit time + Miss rate × Miss penalty
        hit time:cache 命中所需要的访问时间
        Miss penalty:失效开销,cache未命中,从内存取出相应块并替换cache中某块的时间之和
        注:平均内存访问时间虽然叫缺失率性能更好,但是它仍然是一种间接的方法,不能够直接代替执行时间。推测处理及可能执行其他指令在cache失效期间,能够弥补一部分损失。多线程的使用也能够容忍失效,避免处理机闲置。
    3. cache的基本优化方案
      1. 采用更大的块将低缺失率。
      2. 采用更大的cache降低缺失率。
      3. 搞关联性降低缺失率。
      4. 多级缓存降低缺失损失。
        average memory access time:
        Hit timeL1 + Miss rateL1 × (Hit timeL2 + Miss rateL2 × Miss penaltyL2)
      5. 给读缺失更高的优先级来降低缺失损失。
        在带有写缓冲的环境下适合使用这种优化方式。写缓冲有它的危害,写缓冲会保存更新的值,当一个读操作发送缺失时,由于缓冲和内存出现不一致情况下,读-写会产生危害。一种解决方案是在发生读缺失的情况下检查缓冲内容,如果没有和内存内容冲突,并且内存系统时可用的,那么先发送读操作,然后在写,降低缺失损失。这种方案没有额外的功率消耗。
      6. 在索引cache期间避免地址转换降低命中时间。
    展开全文
  • IntegerCache

    万次阅读 2020-09-11 12:09:32
    Integer CacheIntegerCache源码Integer 使用Cache源码瞎搞 IntegerCache源码 java.lang.Integer.IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; ... } ...

    IntegerCache源码


    java.lang.Integer.IntegerCache {
            static final int low = -128;
            static final int high;
            static final Integer cache[];
            ...
    }
    
    • Cache会缓存 [low, high-low] 范围内的整数
    • high默认127 范围 [127, Integer.MAX_VALUE - (-low) -1] , 可由 java.lang.Integer.IntegerCache.high 设置

    Integer 使用Cache源码


    public final class Integer extends Number implements Comparable<Integer> {
    	...
    	private final int value;
    	...
    	public static Integer valueOf(int i) {
    		if (i >= IntegerCache.low && i <= IntegerCache.high)
    			return IntegerCache.cache[i + (-IntegerCache.low)];
    		return new Integer(i);
    	}
    	...
    }
    
    • 可以看出非new的Integer如果值在[low, high]内, 则复用同一个对象
    • 注意java.lang.Integer#value为final

    瞎搞


    实现一段任何数字与Integer a = 2相乘为0的功能

    /**
     * Integer常量池
     */
    @Log4j2
    public class ModifyInteger {
    
        static {
            try {
                modify();
            } catch (NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
        private static void modify() throws NoSuchFieldException, IllegalAccessException {
            // 1. 获取 IntegerCache 类
            Class<?> IntegerCache = Integer.class.getDeclaredClasses()[0];
    
            // 2. 获取 value 字段
            Field integerCacheValue = IntegerCache.getDeclaredField("cache");
            Field integerCacheLow = IntegerCache.getDeclaredField("low");
    
            // 3. 获取缓存数组
            integerCacheValue.setAccessible(true);
            Integer[] sourceCache = (Integer[]) integerCacheValue.get(Integer.class);
    
            // 4. 获取缓存最小值
            integerCacheLow.setAccessible(true);
            int low = integerCacheLow.getInt(Integer.class);
    
            // 5. 将缓存中的 2 修改为 0 (偷梁换柱)
            sourceCache[(low < 0 ? -low : low) + 2] = 0;
        }
    
        public static void check(Integer n) {
            Random random = new Random(System.currentTimeMillis());
            for (int idx = 0; idx < 10; idx++) {
            	// 14:48:53.775 [main] INFO org.example.codeTest.ModifyInteger - random * 2 = 0
                log.info("random * 2 = {}", random.nextInt(100) * n);
            }
        }
        
        public static void main(String[] args) {
            check(2);
        }
    }
    
    展开全文
  • 浅谈http中的Cache-Control

    万次阅读 多人点赞 2018-09-23 14:58:13
    前言 ... 第一部分General是概要,包含请求地址,请求方式,状态码,服务器地址以及Referrer 策略。 第二部分是应答头部,是服务器返回的。...在http中,控制缓存开关的字段有两个:Pragma 和 Cache-Contro...

    前言

    我们用http访问时,会先发送一个请求,之后服务器返回一个应答,在Chrome的开发者工具(按F12或右击选择检查)中展现了整个过程:

    第一部分General是概要,包含请求地址,请求方式,状态码,服务器地址以及Referrer 策略。
    第二部分是应答头部,是服务器返回的。
    第三部分是请求头部,是客户端发送的。

    这次我们从两个角度来看看http的缓存:缓存控制缓存校验
    缓存控制:控制缓存的开关,用于标识请求或访问中是否开启了缓存,使用了哪种缓存方式。
    缓存校验:如何校验缓存,比如怎么定义缓存的有效期,怎么确保缓存是最新的。

    缓存控制

    在http中,控制缓存开关的字段有两个:Pragma 和 Cache-Control。

    Pragma

    Pragma有两个字段Pragma和Expires。Pragma的值为no-cache时,表示禁用缓存,Expires的值是一个GMT时间,表示该缓存的有效时间。
    Pragma是旧产物,已经逐步抛弃,有些网站为了向下兼容还保留了这两个字段。如果一个报文中同时出现Pragma和Cache-Control时,以Pragma为准。同时出现Cache-Control和Expires时,以Cache-Control为准。即优先级从高到低是 Pragma -> Cache-Control -> Expires

    Cache-Control

    在介绍之前,先啰嗦两个容易忽视的地方:

    1. 符合缓存策略时,服务器不会发送新的资源,但不是说客户端和服务器就没有会话了,客户端还是会发请求到服务器的。
    2. Cache-Control除了在响应中使用,在请求中也可以使用。我们用开发者工具来模拟下请求时带上Cache-Control:勾选Disable cache,刷新页面,可以看到Request Headers中有个字段Cache-Control: no-cache。

      同时在Response Headers中也能到Cache-Control字段,它的值是must-revalidate,这是服务端设置的。

    Cache-Control字段

    在请求中使用Cache-Control 时,它可选的值有:

    在响应中使用Cache-Control 时,它可选的值有:
    在这里插入图片描述
    no-store优先级最高
    在Cache-Control 中,这些值可以自由组合,多个值如果冲突时,也是有优先级的,而no-store优先级最高。我们可以测试下:在nginx中做如下配置:

    server {
        listen 88;
        root /opt/ms;
        index index.php index.html index.htm index.nginx-debian.html;
        
        location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
            add_header Cache-Control no-store;
            add_header Cache-Control max-age=3600;
            add_header Cache-Control public;
            add_header Cache-Control only-if-cached;
            add_header Cache-Control no-cache;
            add_header Cache-Control must-revalidate;
        }
    }
    

    在/opt/ms下增加个文件type.css,内容如下:

    a{
        color: #000000;
    }
    a:focus,a:hover {
        text-decoration: none;
        color: #708090;
    }
    

    配置好之后,reload下nginx,在浏览器访问地址http://127.0.0.1:88/type.css,可以看到响应头部包含nginx配置中的字段:

    重复刷新访问,会发现每次的状态码都是200,原因是no-store的优先级最高,本地不保存,每次都需要服务器发送资源。

    public和private的选择
    如果你用了CDN,你需要关注下这个值。CDN厂商一般会要求cache-control的值为public,提升缓存命中率。如果你的缓存命中率很低,而访问量很大的话,可以看下是不是设置了private,no-cache这类的值。如果定义了max-age,可以不用再定义public,它们的意义是一样的。

    哪里设置Cache-Control

    以LNMP的环境为例,一次响应经历的过程是:php-cgi解析代码并执行,将结果返回给nginx,如果nginx前面有反向代理,则会经过一次反向代理服务器,所以cache-control可能会在nginx,php-cgi,php代码,反向代理服务器这些地方地方设置。在php.ini中,有个参数是session.cache_limiter,需要注意下。在nginx中有个很常见的配置:

    location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ { 
                expires      30d;
    	}
    

    这个指令等同于cache-control: max-age=2592000,同时你会在响应头部看到一个etag字段,这是由于nginx默认开启,如果要关闭可以增加个配置etag off。这个etag就是我们接下要看的缓存校验字段。

    缓存校验

    在缓存中,我们需要一个机制来验证缓存是否有效。比如服务器的资源更新了,客户端需要及时刷新缓存;又或者客户端的资源过了有效期,但服务器上的资源还是旧的,此时并不需要重新发送。缓存校验就是用来解决这些问题的,在http 1.1 中,我们主要关注下Last-Modified 和 etag 这两个字段。

    Last-Modified

    服务端在返回资源时,会将该资源的最后更改时间通过Last-Modified字段返回给客户端。客户端下次请求时通过If-Modified-Since或者If-Unmodified-Since带上Last-Modified,服务端检查该时间是否与服务器的最后修改时间一致:如果一致,则返回304状态码,不返回资源;如果不一致则返回200和修改后的资源,并带上新的时间。

    If-Modified-Since和If-Unmodified-Since的区别是:
    If-Modified-Since:告诉服务器如果时间一致,返回状态码304
    If-Unmodified-Since:告诉服务器如果时间不一致,返回状态码412

    etag

    单纯的以修改时间来判断还是有缺陷,比如文件的最后修改时间变了,但内容没变。对于这样的情况,我们可以使用etag来处理。
    etag的方式是这样:服务器通过某个算法对资源进行计算,取得一串值(类似于文件的md5值),之后将该值通过etag返回给客户端,客户端下次请求时通过If-None-Match或If-Match带上该值,服务器对该值进行对比校验:如果一致则不要返回资源。
    If-None-Match和If-Match的区别是:
    If-None-Match:告诉服务器如果一致,返回状态码304,不一致则返回资源
    If-Match:告诉服务器如果不一致,返回状态码412

    总结

    1. 缓存开关是: pragma, cache-control。
    2. 缓存校验有:Expires,Last-Modified,etag。
    3. 从状态码的角度来看,它们的关系如下图:
    4. cache-control的各个值关系如下图

    参考资料

    HTTP缓存控制小结
    HTTP 缓存

    展开全文
  • cache结构与工作原理

    万次阅读 多人点赞 2017-11-23 14:44:55
    在经历N次的阅读之后,终于明白了cache的结构和工作原理。 首先,要想理解cache,先理解内存。内存的简单表示如下图,内存里面的内容的查找是根据地址来进行的,也就是说内存包含两点①地址②内存的内容(存的数据...
  • jetcache官网教程

    万次阅读 多人点赞 2018-05-09 22:58:57
    jetcache简介JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于...
  • 手动清理centos7 buff/cache 占用过高

    万次阅读 2020-12-01 17:53:52
    手动清理centos7 buff/cache 占用过高 命令 ##手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已...
  • Cache Invalidate与Cache Flush

    千次阅读 2019-06-29 17:33:44
    1. Cache Invalidate 该操作主要为解除内存与Cache的绑定关系。例如操作DMA进行数据搬移时,如果目标内存配置为可Cache,那么后续通过CPU读取该内存数据时候,若Cache命中,则可能读取到的数据不是DMA搬移后的数据...
  • Django缓存Cache详解

    万次阅读 多人点赞 2018-07-30 12:48:17
    缓存(Cache)对于创建一个高性能的网站和提升用户体验来说是非常重要的,然而对我们这种只用得起拼多多的码农而言最重要的是学会如何使用缓存。今天我们就来看看缓存Cache应用场景及工作原理吧,并详细介绍如何在...
  • Cache entry deserialization failed, entry ignored 解决

    万次阅读 热门讨论 2018-06-04 10:49:32
    打开anaconda prompt之后,安装pip install –upgrade –...Cache entry deserialization failed, entry ignored的错误 怎么解决呢?很简单, 就是用管理员权限打开anaconda prompt之后再安装就没问题了。...
  • Guava cache

    千次阅读 2019-03-17 08:42:43
    Guava cache,一个小巧的本地缓存使用详解
  • Cache —— Cache和主存的映射方式

    千次阅读 多人点赞 2019-07-26 22:16:16
    地址映射:地址映射是一种规则,它指明了把主存地址空间映射到Cache地址空间所用的规则,即把存放在主存中的程序按照某种规则装入Cache。由于Cache的块数比主存块数少得多,因此需要加入 主存字块标记 和 字块内地址...
  • Caffeine Cache

    千次阅读 2019-06-26 17:25:58
    在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。 说起Guava Cache,很多人...
  • django cache

    千次阅读 2019-05-12 22:02:20
    django cache 缓存 1.缓存可以解决代码大量的重复请求,减少访问者对数据库的压力 官网:https://docs.djangoproject.com/zh-hans/2.2/topics/cache/ 2缓存的工作原理: given a URL, try finding that page in the ...
  • pip清理cache以及安装模块时跳过cache

    千次阅读 2020-07-08 21:19:31
    用pip安装python模块的时候,重复安装某一模块会经常出现“Using cache”,这样很容易装错版本。于是在stackoverflow找到大概两种方法。 1. 直接跳过cache:(tqdm是栗子) pip install -U tqdm 2. 清理pip cache ...
  • i-cache和d-cache区别: 从两个方面来回答:  一方面是cache的行为。Icache大多都是顺序取指,碰到分支指令也会跳转,而Dcache访问的模式变化比较大.也就是前者所说的pattern的问题.指令只有读和refill没有写,而...
  • RESULT CACHE

    千次阅读 2015-12-18 10:46:17
    RESULT CACHE是11g的新特性。 RESULT CACHE MODE MANUAL: When set to MANUAL (the default), query results are not stored in the result cache. If cached results are required for individual qu
  • Gitlab Cache 原理

    千次阅读 2019-09-26 14:05:06
    Gitlab cache 机制可以大大加快 CI/CD Job 的执行速度。基础知识可以参看 Gitlab Cache。下面直接总结在 Kubernetes 环境中的三种 Cache 的解决方案。 第一种,Distributed runners caching,gitlab runner job执行...
  • Cache地址映射

    千次阅读 2018-09-01 15:17:35
    理解Cache地址映射之前补充一些基础知识,Cache的地址映射和MMU(内存管理单元)和TLB Cache(转译查找缓存)中的映射是有区别的。Cache、TLB Cache、MMU在CPU中结构如图1所示,图1展现的是Cortex A9 Processor内部...
  • SpringCache完整案例介绍

    万次阅读 多人点赞 2019-11-28 12:51:29
      Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager 接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发;Cache接口为缓存的组件规范定义,...

空空如也

1 2 3 4 5 ... 20
收藏数 255,844
精华内容 102,337
关键字:

cache