baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 华仔聊技术

  • 业务设计

  • 场景设计

  • 运维

  • 安全

  • 面试

  • mac相关工具推荐

  • 开发工具

  • 人工智能

  • 推荐

  • 阅读

  • 工具

  • 计划

  • 产品

  • 云原生

  • go

    • 基础
    • go项目
    • go channel
    • go list
    • go testing模块
    • go指针
    • go实现LRU
    • go数据结构的内存实现
    • go interfaces
    • go项目分包相关
    • 协程实现原理
    • 垃圾回收与写屏障
    • gin
    • go中flag的使用
    • go dig
    • linux环境快速搭建go
  • QVM

  • 软件设计师

  • 极客时间

  • 单元测试

  • 其他
  • go
xugaoyi
2023-08-14

go实现LRU

package lru

import (
	"container/list"
)

type Cache struct {
	maxBytes  int64
	nBytes    int64
	ll        *list.List
	cache     map[string]*list.Element
	onEvicted func(key string, value Value)
}

type entry struct {
	key   string
	value Value
}

type Value interface {
	Len() int
}

func New(maxBytes int64, onEvicted func(key string, value Value)) *Cache {
	cache := &Cache{
		maxBytes:  maxBytes,
		nBytes:    0,
		ll:        list.New(),
		cache:     make(map[string]*list.Element),
		onEvicted: onEvicted,
	}
	return cache
}

func (this *Cache) put(key string, value Value) {
	ele, ok := this.cache[key]
	if ok {
		this.ll.MoveToFront(ele)
		element := ele.Value.(*entry)
		this.nBytes += int64(value.Len()) - int64(element.value.Len())
		element.value = value
	} else {
		element := this.ll.PushFront(&entry{key, value})
		this.cache[key] = element
		this.nBytes += int64(len(key)) + int64(value.Len())
	}
	if this.maxBytes != 0 && this.maxBytes < this.nBytes {
		this.removeOldest()
	}
}

func (this *Cache) removeOldest() {
	ele := this.ll.Back()
	if ele != nil {
		this.ll.Remove(ele)
		element := ele.Value.(*entry)
		delete(this.cache, element.key)
		this.nBytes -= int64(len(element.key)) + int64(element.value.Len())
		if this.onEvicted != nil {
			this.onEvicted(element.key, element.value)
		}
	}
}

func (this *Cache) Get(key string) (value Value, ok bool) {
	element := this.cache[key]
	if element != nil {
		this.ll.MoveToFront(element)
		kv := element.Value.(*entry)
		return kv.value, true
	} else {
		return nil, false
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
编辑 (opens new window)
上次更新: 2024/02/22, 14:03:19
go指针
go数据结构的内存实现

← go指针 go数据结构的内存实现→

最近更新
01
spark基础
02-22
02
mysql读写分离和分库分表
02-22
03
数据库迁移
02-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式