IM/backend/IM_API/Services/RedisCacheService.cs
nanxun 58bc8b4b5a 前端:
1、优化消息排序逻辑
2、新增加载历史消息
3、修复已知问题
后端:
1、优化消息排序逻辑
2、增加用户信息缓存机制
3、修改日期类型为DateTimeOffset改善时区信息丢失问题
3、修复了已知问题
数据库:
1、新增SequenceId字段用于消息排序
2、新增ClientMsgId字段用于客户端消息回执
2026-02-07 22:37:56 +08:00

63 lines
2.2 KiB
C#

using IM_API.Interface.Services;
using IM_API.Models;
using IM_API.Tools;
using Microsoft.Extensions.Caching.Distributed;
using System.Text.Json;
namespace IM_API.Services
{
public class RedisCacheService:ICacheService
{
private readonly IDistributedCache _cache;
public RedisCacheService(IDistributedCache cache)
{
_cache = cache;
}
public async Task<T?> GetAsync<T>(string key)
{
var valueBytes= await _cache.GetAsync(key);
if (valueBytes is null || valueBytes.Length == 0) return default;
return JsonSerializer.Deserialize<T>(valueBytes);
}
public async Task<User?> GetUserCacheAsync(string username)
{
var usernameKey = RedisKeys.GetUserinfoKeyByUsername(username);
var userid = await GetAsync<string>(usernameKey);
if (userid is null) return default;
var key = RedisKeys.GetUserinfoKey(userid);
return await GetAsync<User>(key);
}
public async Task RemoveAsync(string key) => await _cache.RemoveAsync(key);
public async Task RemoveUserCacheAsync(string username)
{
var usernameKey = RedisKeys.GetUserinfoKeyByUsername(username);
var userid = await GetAsync<string>(usernameKey);
if (userid is null) return;
var key = RedisKeys.GetUserinfoKey(userid);
await RemoveAsync(key);
}
public async Task SetAsync<T>(string key, T value, TimeSpan? expiration = null)
{
var options = new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = expiration ?? TimeSpan.FromHours(1)
};
var valueBytes = JsonSerializer.SerializeToUtf8Bytes(value);
await _cache.SetAsync(key, valueBytes, options);
}
public async Task SetUserCacheAsync(User user)
{
var idKey = RedisKeys.GetUserinfoKey(user.Id.ToString());
await SetAsync(idKey, user);
var usernameKey = RedisKeys.GetUserinfoKeyByUsername(user.Username);
await SetAsync(usernameKey, user.Id.ToString());
}
}
}