美文网首页iOS
如何设计一个内存缓存库

如何设计一个内存缓存库

作者: 踏云小子 | 来源:发表于2017-08-16 16:27 被阅读18次

双向链表 + LRU淘汰算法 + 线程安全

双向链表的设计

用OC来设计双向链表(不是循环链表)

单个节点


image.png

整个链表


image.png
备注:
  • ->是啥:如果我们手动开辟一个结构体,再给他的元素设置值,需要加上这个,举个栗子:
//使用系统的方法创建结构体,直接用'.'就可以
CGPoint p = CGPointMake(42,42);
NSLog(@"%f", p.x);
//手动创建一个结构体,获取他的元素需要用'->'
CGPoint *p = malloc(1*sizeof(CGPoint));
p->x = 2.0;
NSLog(@"%f", p->x);
free(p);

退一万步说,结构体p是一個不完整的地址,里面的x、y就是地址偏移量,p->x其实拿到的是偏移量的地址,也就是指向x的指针

LRU

1.算法思想

Least Recently Used 近期最少使用算法, 常应用于缓存中的数据淘汰, 其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高“。

2.插入数据
  • 新数据在链表中存在(一般称为命中),则把该节点移到链表头部
  • 新数据在链表中不存在,则新建一个节点,放到链表头部
  • 若缓存满了,则把链表最后一个节点删除
3.读取数据
  • 数据在链表中存在,则把该节点移到链表头部
  • 数据在链表中不存在,返回-1

附录:

  • Core Foundation对象,简称CF,可不是穿越火线哦,这个嘛,需要自己创建,自己释放,比如CFMutableDictionaryRef,创建方法是CFDictionaryCreateMutable,释放方法是CFRelease
  • CF和OC对象转化
    OC->CF:加__bridge,举例如下:
id p;
void * key;
key = (__bridge const void *)p

CF->OC:加__bridge_transfer,举例如下:

id obj = (__bridge_transfer id)p;

相关文章

  • iOS 设计模式面试题(如何设计一个图片缓存框架?)

    如何设计一个图片缓存框架? 可以模仿 SDWebImage 来实现。 构成 Manager 内存缓存 磁盘缓存 网...

  • 如何设计一个内存缓存库

    双向链表 + LRU淘汰算法 + 线程安全 双向链表的设计 用OC来设计双向链表(不是循环链表) 单个节点 整个链...

  • 缓存

    内存缓存 数据库缓存 文件系统缓存 本地内存缓存 没有利用缓存机制之前,所耗费的时间 1. 数据库缓存 配置中间件...

  • SDWebImage源码之SDImageCache

    SDImageCache是SDWebImage库的图片缓存类,其提供了内存和磁盘缓存两种机制,并且设计了一些策略对...

  • 图片缓存框架

    如何设计一个图片缓存框架? 方案:首先一个manager 管理者 : 内存管理 磁盘管理 网络codeManage...

  • Android笔记—2018.08.15

    1、假设让你设计一个图片加载器,你会如何设计? 大致流程如下: 1、检查内存缓存,如有,则返回。 2、后台线程开始...

  • Redis上手及Redis在PHP中使用

    什么是Redis Redis是一个内存高速缓存数据库,可持久化。 缓存: 数据缓存 页面缓存 默认: 端口:637...

  • page cache页面缓存

    为什么设计缓存? 如何设计缓存? 页面缓存都缓存什么?

  • MySQL优化系列14-优化MySQL内存

    备注:测试数据库版本为MySQL 8.0 一. MySQL如何使用内存 MySQL分配缓冲区和缓存来提高数据库操作...

  • Redis

    Redis是一个内存结构的NoSQL数据库 内存结构:作为数据库缓存使用,以减轻数据库的压力 支持持久化:可以作为...

网友评论

    本文标题:如何设计一个内存缓存库

    本文链接:https://www.haomeiwen.com/subject/lnevrxtx.html