| | |
| | | # Redis æå¡ä½¿ç¨æ¡ä¾ |
| | | |
| | | ## 1. ç¼åï¼ICacheServiceï¼ |
| | | ## 1. ç¼åï¼ICacheServiceï¼- åºç¡æä½ |
| | | |
| | | éè¿æé 彿°æ³¨å
¥ `ICacheService`ï¼HybridCacheService èªå¨å®ç° L1(å
å) + L2(Redis) åå±ç¼åã |
| | | |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 2. åå¸å¼éï¼IDistributedLockServiceï¼ |
| | | ## 2. ç¼åï¼ICacheServiceï¼- æ©å±å 餿¹æ³ |
| | | |
| | | ```csharp |
| | | public class CacheDeleteDemo |
| | | { |
| | | private readonly ICacheService _cache; |
| | | |
| | | // å é¤å¹¶è·åå¼ |
| | | public string? RemoveAndGet(string key) |
| | | { |
| | | return _cache.RemoveAndGet(key); // è¿å被å é¤çå¼ |
| | | } |
| | | |
| | | // æåç¼å 餿æå¹é
çkey |
| | | public int ClearUserCache() |
| | | { |
| | | return _cache.RemoveByPrefix("user:"); // å 餿æ user: å¼å¤´çkey |
| | | } |
| | | |
| | | // ææ¨¡å¼å é¤ï¼æ¯æéé
ç¬¦ï¼ |
| | | public int ClearSessionCache() |
| | | { |
| | | return _cache.RemoveByPattern("session:123:*"); // å é¤ session:123: å¼å¤´çæækey |
| | | } |
| | | |
| | | // æ¹éå é¤å¹¶è¿åæåæ°é |
| | | public int RemoveMultiple() |
| | | { |
| | | var keys = new[] { "key1", "key2", "key3" }; |
| | | return _cache.RemoveAll(keys); // è¿åå®é
å é¤çæ°é |
| | | } |
| | | |
| | | // æ¡ä»¶å é¤ |
| | | public int RemoveTempCache() |
| | | { |
| | | return _cache.RemoveWhere(key => key.Contains("temp")); // å é¤å
å«"temp"çkey |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 3. ç¼åï¼ICacheServiceï¼- æ·»å åä¿®æ¹æ©å±æ¹æ³ |
| | | |
| | | ```csharp |
| | | public class CacheAdvancedDemo |
| | | { |
| | | private readonly ICacheService _cache; |
| | | |
| | | // æ¹éæ·»å |
| | | public void AddMultiple() |
| | | { |
| | | var items = new Dictionary<string, string> |
| | | { |
| | | { "user:1", "å¼ ä¸" }, |
| | | { "user:2", "æå" }, |
| | | { "user:3", "çäº" } |
| | | }; |
| | | _cache.AddAll(items, 300); // æ¹éæ·»å ï¼300ç§è¿æ |
| | | } |
| | | |
| | | // æ¹éæ·»å 对象 |
| | | public void AddMultipleObjects() |
| | | { |
| | | var items = new Dictionary<string, object> |
| | | { |
| | | { "order:1", new { Id = 1, Amount = 100 } }, |
| | | { "order:2", new { Id = 2, Amount = 200 } } |
| | | }; |
| | | _cache.AddAllObjects(items, 600); |
| | | } |
| | | |
| | | // æ¿æ¢ï¼ä»
å卿¶æ¿æ¢ï¼ |
| | | public bool ReplaceExisting() |
| | | { |
| | | return _cache.Replace("user:1", "æ°ç¨æ·å"); // keyä¸åå¨è¿åfalse |
| | | } |
| | | |
| | | // è·åå¹¶å·æ°è¿ææ¶é´ |
| | | public string? GetAndRefresh(string key) |
| | | { |
| | | return _cache.GetAndRefresh(key, 1800); // è·åå¼å¹¶å»¶é¿30åé |
| | | } |
| | | |
| | | // å·æ°è¿ææ¶é´ |
| | | public bool RefreshExpire(string key) |
| | | { |
| | | return _cache.RefreshExpire(key, 3600); // å·æ°ä¸º1å°æ¶åè¿æ |
| | | } |
| | | |
| | | // 设置Nç§åè¿æ |
| | | public bool SetExpireIn(string key, int seconds) |
| | | { |
| | | return _cache.ExpireIn(key, seconds); |
| | | } |
| | | |
| | | // è®¾ç½®å¨æå®æ¶é´ç¹è¿æ |
| | | public bool SetExpireAt(string key, DateTime expireTime) |
| | | { |
| | | return _cache.ExpireAt(key, expireTime); |
| | | } |
| | | |
| | | // è·åå©ä½è¿ææ¶é´ |
| | | public long? GetTTL(string key) |
| | | { |
| | | return _cache.GetExpire(key); // è¿åå©ä½ç§æ°ï¼null表示永ä¸è¿æækeyä¸åå¨ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 4. ç¼åï¼ICacheServiceï¼- ååæä½æ¹æ³ |
| | | |
| | | ```csharp |
| | | public class AtomicOperationDemo |
| | | { |
| | | private readonly ICacheService _cache; |
| | | |
| | | // ååæ·»å ï¼ä»
ä¸å卿¶æ·»å ï¼- åå¸å¼éåºæ¯ |
| | | public bool AcquireLock(string lockKey, string lockValue) |
| | | { |
| | | return _cache.AddIfNotExists(lockKey, lockValue, 30); // 30ç§èªå¨è¿æ |
| | | } |
| | | |
| | | // è·åæ§å¼å¹¶è®¾ç½®æ°å¼ |
| | | public string? GetAndSet(string key, string newValue) |
| | | { |
| | | return _cache.GetAndSet(key, newValue); // è¿åæ§å¼ï¼è®¾ç½®æ°å¼ |
| | | } |
| | | |
| | | // èªå¢è®¡æ°å¨ |
| | | public long IncrementCounter(string key) |
| | | { |
| | | return _cache.Increment(key); // èªå¢1ï¼è¿åæ°å¼ |
| | | } |
| | | |
| | | // èªå¢æå®å¼ |
| | | public long IncrementBy(string key, long value) |
| | | { |
| | | return _cache.Increment(key, value); // èªå¢value |
| | | } |
| | | |
| | | // èªå计æ°å¨ |
| | | public long DecrementCounter(string key) |
| | | { |
| | | return _cache.Decrement(key); // èªå1 |
| | | } |
| | | |
| | | // 追å å
容 |
| | | public long AppendContent(string key, string content) |
| | | { |
| | | return _cache.Append(key, content); // è¿å追å åçå符串é¿åº¦ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 5. ç¼åï¼ICacheServiceï¼- ConcurrentDictionary飿 ¼æ¹æ³ |
| | | |
| | | ```csharp |
| | | public class ConcurrentStyleDemo |
| | | { |
| | | private readonly ICacheService _cache; |
| | | |
| | | // å°è¯æ·»å ï¼ä»
ä¸å卿¶æ·»å ï¼ |
| | | public bool TryAdd(string key, string value) |
| | | { |
| | | return _cache.TryAdd(key, value, 60); // keyåå¨è¿åfalse |
| | | } |
| | | |
| | | // å°è¯è·å |
| | | public bool TryGet(string key, out string? value) |
| | | { |
| | | return _cache.TryGetValue(key, out value); |
| | | } |
| | | |
| | | // å°è¯ç§»é¤å¹¶è¿åå¼ |
| | | public bool TryRemove(string key, out string? value) |
| | | { |
| | | return _cache.TryRemove(key, out value); |
| | | } |
| | | |
| | | // å°è¯æ´æ°ï¼ä»
å卿¶æ´æ°ï¼ |
| | | public bool TryUpdate(string key, string newValue) |
| | | { |
| | | return _cache.TryUpdate(key, newValue, 60); |
| | | } |
| | | |
| | | // 弿¹åæ¶æ´æ°ï¼é¿å
æ æåå
¥ï¼ |
| | | public bool TryUpdateIfChanged(string key, string newValue) |
| | | { |
| | | return _cache.TryUpdateIfChanged(key, newValue, 60); // å¼ç¸åè¿åfalse |
| | | } |
| | | |
| | | // è·åææ·»å |
| | | public string GetOrAdd(string key) |
| | | { |
| | | return _cache.GetOrAdd(key, "é»è®¤å¼", 60); |
| | | } |
| | | |
| | | // è·åææ·»å ï¼å·¥åæ¹æ³ï¼ |
| | | public T GetOrAdd<T>(string key, Func<string, T> factory) where T : class |
| | | { |
| | | return _cache.GetOrAdd(key, factory, 60); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 6. åå¸å¼éï¼IDistributedLockServiceï¼ |
| | | |
| | | ```csharp |
| | | public class OrderService |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 3. 计æ°å¨ï¼ICounterServiceï¼ |
| | | ## 7. 计æ°å¨ï¼ICounterServiceï¼ |
| | | |
| | | ```csharp |
| | | public class StatisticsService |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 4. åå¸/订é
ï¼IMessageQueueServiceï¼ |
| | | ## 8. åå¸/订é
ï¼IMessageQueueServiceï¼ |
| | | |
| | | ```csharp |
| | | public class NotificationService |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 5. éæµï¼IRateLimitingServiceï¼ |
| | | ## 9. éæµï¼IRateLimitingServiceï¼ |
| | | |
| | | ```csharp |
| | | public class ApiController |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 6. åå¸å¼IDçæå¨ï¼IDistributedIdGeneratorï¼ |
| | | ## 10. åå¸å¼IDçæå¨ï¼IDistributedIdGeneratorï¼ |
| | | |
| | | ```csharp |
| | | public class TaskService |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 7. æè¡æ¦ï¼ILeaderboardServiceï¼ |
| | | ## 11. æè¡æ¦ï¼ILeaderboardServiceï¼ |
| | | |
| | | ```csharp |
| | | public class LeaderboardDemo |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 8. 对象åå¨ï¼IObjectStorageServiceï¼ |
| | | ## 12. 对象åå¨ï¼IObjectStorageServiceï¼ |
| | | |
| | | ```csharp |
| | | public class DeviceService |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 9. é
ç½®ä¸å¿ï¼IConfigurationCenterServiceï¼ |
| | | ## 13. é
ç½®ä¸å¿ï¼IConfigurationCenterServiceï¼ |
| | | |
| | | ```csharp |
| | | public class ConfigDemo |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 10. çæ§ï¼IRedisMonitorServiceï¼ |
| | | ## 14. çæ§ï¼IRedisMonitorServiceï¼ |
| | | |
| | | ```csharp |
| | | public class MonitorDemo |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 11. Sessionåå¨ï¼ISessionStorageï¼ |
| | | ## 15. Sessionåå¨ï¼ISessionStorageï¼ |
| | | |
| | | ```csharp |
| | | public class SessionDemo |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 12. å¸éè¿æ»¤å¨ï¼IBloomFilterServiceï¼ |
| | | ## 16. å¸éè¿æ»¤å¨ï¼IBloomFilterServiceï¼ |
| | | |
| | | ```csharp |
| | | public class BloomFilterDemo |
| | |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 17. ç¼åèªå¨åæ¥ï¼CacheSyncBackgroundServiceï¼ |
| | | |
| | | Rediså°å
åç¼åçèªå¨åæ¥åå°æå¡ï¼è§£å³L1+L2æ··åç¼åä¸å¤é¨ä¿®æ¹Redisæ°æ®å¯¼è´å
åç¼åä¸ä¸è´çé®é¢ã |
| | | |
| | | ### é
置说æ |
| | | |
| | | å¨ `appsettings.json` ä¸é
ç½®ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "RedisConfig": { |
| | | "EnableL1Cache": true, // å¯ç¨L1å
åç¼å |
| | | "EnableAutoSync": true, // å¯ç¨èªå¨åæ¥ |
| | | "SyncIntervalSeconds": 30, // 忥é´éï¼30ç§ |
| | | "SyncBatchSize": 1000 // 忬¡æ¹éè·åkeyæ°éä¸é |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### å·¥ä½åç |
| | | |
| | | 1. **å¯å¨æ¶å
¨é忥**ï¼æå¡å¯å¨åç«å³æ§è¡ä¸æ¬¡å
¨é忥 |
| | | 2. **宿å¢é忥**ï¼æç
§é
ç½®çé´éï¼é»è®¤30ç§ï¼å®ææ§è¡åæ¥ |
| | | 3. **åå忥**ï¼ |
| | | - å°Redisä¸çæ°æ®æ´æ°å°å
åç¼å |
| | | - æ¸
çå
åç¼åä¸ä¸åå¨äºRedisçkey |
| | | 4. **æºè½TTL忥**ï¼åæ¥æ¶ä¼ä¿çRedisä¸è®¾ç½®çè¿ææ¶é´ |
| | | |
| | | ### 使ç¨åºæ¯ |
| | | |
| | | - **å¤ç³»ç»å
±äº«Redis**ï¼å½å¤ä¸ªWCSå®ä¾å
±äº«åä¸ä¸ªRedisï¼ä¸ä¸ªå®ä¾ä¿®æ¹æ°æ®åï¼å
¶ä»å®ä¾è½èªå¨åæ¥ |
| | | - **å¤é¨ä¿®æ¹Redis**ï¼éè¿Redis CLIæå
¶ä»å·¥å
·ä¿®æ¹æ°æ®åï¼åºç¨è½èªå¨è·åææ°å¼ |
| | | - **ç¼åä¸è´æ§ä¿é**ï¼é¿å
å¯ç¨L1ç¼ååï¼å
åç¼ååRedisæ°æ®ä¸ä¸è´çé®é¢ |
| | | |
| | | ### 注æäºé¡¹ |
| | | |
| | | - ä»
å¨ `EnableL1Cache = true` ä¸ `EnableAutoSync = true` æ¶è¿è¡ |
| | | - IMemoryCache䏿¯ææä¸¾ï¼å æ¤åªè½æ¸
çå·²è·è¸ªçkey |
| | | - 忥é´é建议设置为30-60ç§ï¼è¿çä¼å½±åæ§è½ |
| | | - 对äºè¦æ±å¼ºä¸è´æ§çåºæ¯ï¼å»ºè®®ç´æ¥ç¦ç¨L1ç¼åï¼`EnableL1Cache: false`ï¼ |
| | | ``` |