在研究nhibernate提供的第二級緩存的可能性時,我測試了一些實現。目前的結果是非常意外的,我質疑我的期望是否錯誤。NHibernate SecondLevel緩存性能
- 方案(讀重)
在一個字符串屬性第4個* 20000簡單對象插入到數據庫中,然後四個線程由對象ID(session.Get<SimpleObj>(id)
)得到他們。每個線程只訪問它創建的ID。訪問模式是隨機的,並獲取1000個對象,然後重新創建會話。
while (true)
{
using (var session = sf.OpenSession())
using (var tx = session.BeginTransaction())
{
for (int i3 = 0; i3 < 1000; i3++)
{
long id = (long)ids[rnd.Next(19999)];
var t = session.Get<SimpleObject>(id);
var no = t.StringProperty;
}
Interlocked.Add(ref ops, 1000);
tx.Commit();
}
}
結果
- Redis的5000每秒
- 分佈式緩存8000讀出每秒讀取(EnyimMemcached)
- 沒有緩存15000每秒讀取(同機,TCP-IP)
- 無緩存每秒25000次讀取(相同機器,共享內存)
- SysCache2每秒200000次讀取
- HashtableCacheProvider 380000每使用
- NHibernate的4.0.0.4000和從https://msopentech.com/opentech-projects/redis/
- 分佈式緩存1.4.5_4_gaa7839e當前版本https://github.com/nhibernate/NHibernate-Caches
- Redis的服務器3.0.501從Couchbase第二
版本讀取(http://www.couchbase.com/)
這些提供程序與SysCache2實現之間的性能不同嗎?
更新1
正如弗雷德裏克指出,測試場景並沒有什麼太大的意義是兩種不同類型的高速緩存架構有兩種不同的使用情況進行了比較。第一類(5 & 6)不能水平縮放,而1和2可以。目前SQL-Server運行在同一臺機器上,因此使用共享內存作爲IPC-Mechanism,因此我禁用了所有IPC Connection的可能性,並將其配置爲使用TCP/IP連接到數據庫。因此,no-cache-scenario的性能下降了大約10000 op/s,從而將分佈式緩存提供商的速度提高到一個合理的距離。
通過對緩存提供者的比較,我想測試這些提供者是否可以用於按請求會話的設置來緩存參考數據,如國家,貨幣或資產負債表結構。由於性能最好的分佈式緩存仍然只有普通NHibernate版本的一半,所以我不確定這是否可行。
我已經更新我的答案,解決您的更新。請注意,這不是Stack Overflow的首選方式。通常,你應該提出一個新的問題,指出這個問題作爲參考。 –