This repository has been archived on 2022-04-14. You can view files and clone it, but cannot push or open issues or pull requests.
manual-zh-CN/chapter-11
2020-03-24 10:12:56 +08:00
..
cache_design.png resolved #2 2015-03-03 22:43:32 +08:00
README.md 修正缓存文档 2020-03-24 10:12:56 +08:00

缓存

xorm 内置了一致性缓存支持,不过默认并没有开启。要开启缓存,需要在 engine 创建完后进行配置。缓存相关的 内容存放在 xorm.io/xorm/caches 这个包中:

启用一个全局的内存缓存

cacher := caches.NewLRUCacher(caches.NewMemoryStore(), 1000)
engine.SetDefaultCacher(cacher)

上述代码采用了LRU算法的一个缓存缓存方式是存放到内存中缓存struct的记录数为1000条缓存针对的范围是所有具有主键的表没有主键的表中的数据将不会被缓存。 如果只想针对部分表,则:

cacher := caches.NewLRUCacher(caches.NewMemoryStore(), 1000)
engine.MapCacher(&user, cacher)

如果要禁用某个表的缓存,则:

engine.MapCacher(&user, nil)

设置完之后,其它代码基本上就不需要改动了,缓存系统已经在后台运行。

当前实现了内存存储的CacheStore接口MemoryStore如果需要采用其它设备存储可以实现CacheStore接口。

不过需要特别注意不适用缓存或者需要手动编码的地方:

  1. 当使用了Distinct,Having,GroupBy方法将不会使用缓存

  2. Get或者Find时使用了Cols,Omit方法,则在开启缓存后此方法无效,系统仍旧会取出这个表中的所有字段。

  3. 在使用Exec方法执行了方法之后可能会导致缓存与数据库不一致的地方。因此如果启用缓存尽量避免使用Exec。如果必须使用则需要在使用了Exec之后调用ClearCache手动做缓存清除的工作。比如

engine.Exec("update user set name = ? where id = ?", "xlw", 1)
engine.ClearCache(new(User))

缓存的实现原理如下图所示:

cache design