### 緩存
xorm內置了一致性緩存支持,不過默認并沒有開啟。要開啟緩存,需要在engine創建完后進行配置,如:啟用一個全局的內存緩存
~~~
cacher := xorm.NewLRUCacher(xorm.NewMemoryStore(), 1000)
engine.SetDefaultCacher(cacher)
~~~
上述代碼采用了LRU算法的一個緩存,緩存方式是存放到內存中,緩存struct的記錄數為1000條,緩存針對的范圍是所有具有主鍵的表,沒有主鍵的表中的數據將不會被緩存。如果只想針對部分表,則:
~~~
cacher := xorm.NewLRUCacher(xorm.NewMemoryStore(), 1000)
engine.MapCacher(&user, cacher)
~~~
如果要禁用某個表的緩存,則:
~~~
engine.MapCacher(&user, nil)
~~~
設置完之后,其它代碼基本上就不需要改動了,緩存系統已經在后臺運行。
當前實現了內存存儲的CacheStore接口MemoryStore,如果需要采用其它設備存儲,可以實現CacheStore接口。
不過需要特別注意不適用緩存或者需要手動編碼的地方:
1.
當使用了`Distinct`,`Having`,`GroupBy`方法將不會使用緩存
1.
在`Get`或者`Find`時使用了`Cols`,`Omit`方法,則在開啟緩存后此方法無效,系統仍舊會取出這個表中的所有字段。
1.
在使用Exec方法執行了方法之后,可能會導致緩存與數據庫不一致的地方。因此如果啟用緩存,盡量避免使用Exec。如果必須使用,則需要在使用了Exec之后調用ClearCache手動做緩存清除的工作。比如:
~~~
engine.Exec("update user set name = ? where id = ?", "xlw", 1)
engine.ClearCache(new(User))
~~~
緩存的實現原理如下圖所示:
