V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
blackcurrant

golang 中有什么好用的 cache 方案?

  •  1
     
  •   blackcurrant · Mar 5, 2020 · 6122 views
    This topic created in 2248 days ago, the information mentioned may be changed or developed.
    本来准备直接用 map 做 cache,但 map 不支持 concurrent,并且我还希望能满足下面两点:
    - 支持设置 cache 的最大数量
    - 支持设置 cache 的最大内存使用量

    有什么推荐吗?
    17 replies    2020-03-06 15:38:51 +08:00
    scys
        1
    scys  
       Mar 5, 2020   ❤️ 1
    自己写,两个需求都简单。map 加个锁就行
    Vegetable
        2
    Vegetable  
       Mar 5, 2020   ❤️ 1
    sync.Map
    Vegetable
        3
    Vegetable  
       Mar 5, 2020
    guonaihong
        4
    guonaihong  
       Mar 5, 2020   ❤️ 2
    https://github.com/allegro/bigcache
    应该可以满足你。
    blackcurrant
        5
    blackcurrant  
    OP
       Mar 5, 2020
    当达到最大数量或内存时,要能自动删除近期最少使用(LRU)的值。
    有现成的库吗?自己写好像有点麻烦。
    ysmood
        6
    ysmood  
       Mar 5, 2020   ❤️ 1
    不知道这个能否满足你的要求 https://github.com/ysmood/umi
    sunny352787
        7
    sunny352787  
       Mar 5, 2020   ❤️ 1
    手撸一个 redis ?
    scys
        8
    scys  
       Mar 5, 2020
    @guonaihong 收了,感谢先,近来可能用上
    scys
        9
    scys  
       Mar 5, 2020
    @blackcurrant 做个计算器,然后用 sync.Map ,没入一个对象,重新计算下内存大小。
    感觉都是简单的事情,就是包装个 Add/Dell 方法
    fordoo
        10
    fordoo  
       Mar 5, 2020   ❤️ 1
    Muninn
        11
    Muninn  
       Mar 5, 2020   ❤️ 1
    小打小闹用 sync.Map

    想分布式就麻烦了 自己根据需求挑吧
    https://libs.garden/go/search?q=cache&sort=popular
    zjj19950716
        12
    zjj19950716  
       Mar 5, 2020 via iPhone   ❤️ 1
    groupcache
    littlewing
        13
    littlewing  
       Mar 5, 2020   ❤️ 1
    不考虑用 redis 的原因是啥?
    23571113
        14
    23571113  
       Mar 6, 2020 via Android
    LRUCache 很简单,可以做到查找更新都是 log(N)复杂度。
    23571113
        15
    23571113  
       Mar 6, 2020 via Android
    但是 go 这种"modern"语言居然不支持泛型,所以 cache 也用起来难受。
    imnaive
        16
    imnaive  
       Mar 6, 2020
    建议用读写锁操作含类型的 map,用 sync.map 会丢失类型,每次都要检查类型很麻烦
    zichen
        17
    zichen  
       Mar 6, 2020
    本地的话 map 加锁或者 sync.map ,分布式用 redis,有原子操作需求上 lua 脚本。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2411 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 11:44 · PVG 19:44 · LAX 04:44 · JFK 07:44
    ♥ Do have faith in what you're doing.