Kode想去设计一个缓存

/***
*
* @Author: Kode
* @Date: 2018年7月5日22:29:13
*/

什么是缓存?

专门用一块物理内存来存储一些数据,这就是缓存

缓存的作用

解决传输速度的问题。CPU的计算速度和IO传输的速度不是一个量级上的,工程师们为了把这个差距减小,利用二八原理和局部访问性原理,提出缓存这个概念,就是在CPU和内存之间加一块专用的物理器件。

缓存的设计

提起设计缓存,应该从使用缓存会引起什么问题入手,然后根据这些问题想出一个好的解决方案。

我觉得缓存本质问题就是你存的内容被访问的频率很低。怎么解决这个问题呢? 也就是怎么设计一个好的缓存结构呢?

在设计缓存结构之前,得先普及一些专业名词,毕竟我们是专业的嘛!

命中

当客户发起一个请求(我们说他想要查看一个产品信息),我们的应用接受这个请求,并且如果是在第一次检查缓存的时候,需要去数据库读取产品信息。如果在缓存中,一个条目通过一个标记被找到了,这个条目就会被使用、我们就叫它缓存命中。 如果没有命中的话,那肯定就是缓存没命中。

Cache miss

  1. 如果还有缓存的空间,那么,没有命中的对象会被存储到缓存中来
  2. (缓存算法)如果缓存满了,而又没有命中缓存,那么就会按照某一种策略,把缓存中的旧对象踢出,而把新的对象加入缓存池。而这些策略统称为替代策略,这些策略会决定到底应该提出哪些对象。

存储成本

当没有命中时,我们会从数据库取出数据,然后放入缓存。而把这个数据放入缓存所需要的时间和空间,就是存储成本。

失效

当存在缓存中的数据需要更新时,就意味着缓存中的这个数据失效了。

替代策略

Least Frequently Used(LFU)

Least Recently User(LRU)

First in First out(FIFO)

Random Cache

算法各种各样,但基本上都是在出现的频率这方面下功夫。下面讲一下具体的实现结构(数据结构)

在Java中应该先定义一个缓存对象,这个对象应该有被命中数量的属性。

public class CacheElement
 {
     private Object objectValue;
     private Object objectKey;
     private int index;
     private int hitCount; // getters and setters
 }

后面就是用什么类型的集合去存储了。可以选用的是:

HashMap Array LinkedHashMap 等等。

后面有时间在研究研究这些。以上内容有自己见解,也有参考、

参考资料:缓存、缓存算法和缓存框架简介

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值