成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MemoryCache 使用不當導致的一個 BUG

開發 前端
前幾天發現代碼里的一個 BUG,原因是 MemoryCache 使用不當,可以對于很多人來說可能都知道,但還是想分享記錄一下,避免以后寫出同樣的 BUG

[[423274]]

 Intro

前幾天發現代碼里的一個 BUG,原因是 MemoryCache 使用不當,可以對于很多人來說可能都知道,但還是想分享記錄一下,避免以后寫出同樣的 BUG

Sample

直接來看下面的示例吧

  1. await using var services = new ServiceCollection() 
  2.     .AddMemoryCache() 
  3.     .BuildServiceProvider(); 
  4.  
  5. Console.WriteLine("----- Bad -----"); 
  6. GetValidValues(5).Dump(); 
  7. GetValidValues(8).Dump(); 
  8.  
  9. List<int> GetValidValues(int threhold) 
  10.     var memoryCache = services.GetRequiredService<IMemoryCache>(); 
  11.     var values = memoryCache.GetOrCreate("test1", entry => 
  12.     { 
  13.         return Enumerable.Range(1, 10).ToList(); 
  14.     }); 
  15.     values.RemoveAll(x => x > threhold); 
  16.     return values

上面的 Dump 是一個擴展方法就是把 list 內的元素輸出出來,實現如下:

  1. public static void Dump(this List<intvalues
  2.     var value = string.Join(","values); 
  3.     Console.WriteLine(value); 

好了,來想一下上面的輸出結果會是什么吧,期望的結果應該是每次都輸出小于等于輸入的值,實際是什么樣的呢?實際輸出結果如下:

Fix

可以看到第二次輸出的結果和我們的期望不同,之所以會出現上面的問題是因為 MemoryCache 的對象是直接保存在內存中的對象,緩存不發生變化時每次都是返回同一個對象,如果發生修改后面再獲取的就是修改后的狀態了,所以正確的做法應該要返回一個新的對象而不是修改原來的對象,一個修改方法如下:

  1. List<int> GetValidValues(int threhold) 
  2.     var memoryCache = services.GetRequiredService<IMemoryCache>(); 
  3.     var values = memoryCache.GetOrCreate("test", entry => 
  4.     { 
  5.         return Enumerable.Range(1, 10).ToList(); 
  6.     }); 
  7.     return values.Where(v => v <= threhold).ToList(); 

修改后的輸出結果如下:

More

MemoryCache 背后實際是一個 ConcurrentDictionary,value 是一個帶著過期時間的對象 CacheEntry,

在不過期,沒有發生變化的時候每次返回都是同一個對象,作為緩存對象,應該進行只讀操作,不應該修改緩存的對象,如果需要修改則應創建新的對象,而非使用原來的對象。

References

https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.Extensions.Caching.Memory/src/MemoryCache.cs#L26

https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.Extensions.Caching.Memory/src/CacheEntry.cs

https://github.com/WeihanLi/SamplesInPractice/blob/master/MemoryCacheSample/Program.cs

 

責任編輯:武曉燕 來源: amazingdotnet
相關推薦

2020-10-22 07:09:19

TCP網絡協議

2019-10-10 15:40:17

redisbug數據庫

2021-05-20 10:02:50

系統Redis技巧

2024-06-28 10:01:04

2022-06-21 11:24:05

多線程運維

2021-06-10 06:59:34

Redis應用API

2024-09-05 08:07:55

2024-02-04 08:26:38

線程池參數內存

2009-12-17 14:53:52

VS2008程序

2022-10-25 18:00:00

Redis事務生產事故

2021-08-26 14:26:25

Java代碼集合

2010-01-06 10:56:47

華為交換機使用

2021-07-11 09:34:45

ArrayListLinkedList

2011-08-18 13:49:32

筆記本技巧

2020-02-06 11:30:08

代碼JavaScript&&

2020-11-16 12:35:25

線程池Java代碼

2025-02-13 07:00:00

Dubbo-goJava服務端

2009-09-14 17:08:02

WebFormView

2021-07-30 20:59:21

MySQL內存.參數

2021-10-08 07:50:57

軟件設計程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99av成人精品国语自产拍 | 亚洲精品一区二区三区蜜桃久 | 亚洲狠狠丁香婷婷综合久久久 | 中文字幕91 | 色黄视频在线 | 一区二区三区成人 | av福利网| 韩国久久 | 九九成人| 亚洲精品欧美一区二区三区 | 亚洲成网站 | 福利片在线看 | 国产精久久久 | 欧美精选一区二区 | 亚洲综合精品 | 中文字幕精品一区二区三区在线 | 欧美精品久久久 | 欧美一区免费 | 亚洲视频三区 | 国产蜜臀 | 视频在线观看一区二区 | 美女国产 | 性色av网站 | 一区二区三区在线免费 | 日日夜夜精品视频 | 一级欧美| 岛国一区 | 亚洲成色777777在线观看影院 | 天堂综合 | 亚洲啊v在线 | 在线视频一区二区 | 在线免费观看黄a | www.成人免费视频 | 国产精品99免费视频 | 国产精品一区二区三区在线 | 精品福利在线视频 | 日韩成人精品视频 | 国产精久久久久久久妇剪断 | 国产精品99久久久久久人 | 亚洲欧美日韩精品久久亚洲区 | 亚洲狠狠丁香婷婷综合久久久 |