♻️ Refactor cache system with redis

🐛 Add lock to check in prevent multiple at the same time
This commit is contained in:
2025-05-24 17:29:24 +08:00
parent d4da5d7afc
commit 460ce62452
16 changed files with 569 additions and 161 deletions

View File

@ -10,7 +10,7 @@ namespace DysonNetwork.Sphere.Connection.Handlers;
public class MessageReadHandler(
AppDatabase db,
IMemoryCache cache,
ICacheService cache,
ChatRoomService crs,
FlushBufferService buffer
)
@ -44,11 +44,9 @@ public class MessageReadHandler(
return;
}
ChatMember? sender;
var cacheKey = string.Format(ChatMemberCacheKey, currentUser.Id, request.ChatRoomId);
if (cache.TryGetValue(cacheKey, out ChatMember? cachedMember))
sender = cachedMember;
else
var sender = await cache.GetAsync<ChatMember?>(cacheKey);
if (sender is null)
{
sender = await db.ChatMembers
.Where(m => m.AccountId == currentUser.Id && m.ChatRoomId == request.ChatRoomId)
@ -56,9 +54,10 @@ public class MessageReadHandler(
if (sender != null)
{
var cacheOptions = new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(5));
cache.Set(cacheKey, sender, cacheOptions);
var chatRoomGroup = ChatRoomService.ChatRoomGroupPrefix + request.ChatRoomId;
await cache.SetWithGroupsAsync(cacheKey, sender,
[chatRoomGroup],
TimeSpan.FromMinutes(5));
}
}