♻️ 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

@ -1,37 +1,40 @@
using DysonNetwork.Sphere.Account;
using DysonNetwork.Sphere.Storage;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using NodaTime;
namespace DysonNetwork.Sphere.Chat;
public class ChatRoomService(AppDatabase db, IMemoryCache cache)
public class ChatRoomService(AppDatabase db, ICacheService cache)
{
private const string RoomMembersCacheKey = "ChatRoomMembers_{0}";
public const string ChatRoomGroupPrefix = "ChatRoom_";
private const string RoomMembersCacheKeyPrefix = "ChatRoomMembers_";
public async Task<List<ChatMember>> ListRoomMembers(Guid roomId)
{
var cacheKey = string.Format(RoomMembersCacheKey, roomId);
if (cache.TryGetValue(cacheKey, out List<ChatMember>? cachedMembers))
return cachedMembers!;
var cacheKey = RoomMembersCacheKeyPrefix + roomId;
var cachedMembers = await cache.GetAsync<List<ChatMember>>(cacheKey);
if (cachedMembers != null)
return cachedMembers;
var members = await db.ChatMembers
.Where(m => m.ChatRoomId == roomId)
.Where(m => m.JoinedAt != null)
.Where(m => m.LeaveAt == null)
.ToListAsync();
var cacheOptions = new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(5));
cache.Set(cacheKey, members, cacheOptions);
var chatRoomGroup = ChatRoomGroupPrefix + roomId;
await cache.SetWithGroupsAsync(cacheKey, members,
new[] { chatRoomGroup },
TimeSpan.FromMinutes(5));
return members;
}
public void PurgeRoomMembersCache(Guid roomId)
public async Task PurgeRoomMembersCache(Guid roomId)
{
var cacheKey = string.Format(RoomMembersCacheKey, roomId);
cache.Remove(cacheKey);
var chatRoomGroup = ChatRoomGroupPrefix + roomId;
await cache.RemoveGroupAsync(chatRoomGroup);
}
public async Task<List<ChatRoom>> SortChatRoomByLastMessage(List<ChatRoom> rooms)