-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRedisExtensions.cs
More file actions
76 lines (69 loc) · 2.82 KB
/
Copy pathRedisExtensions.cs
File metadata and controls
76 lines (69 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.Extensions.Caching.Distributed;
namespace ssbot;
/// <summary>
/// redis扩展
/// </summary>
public static class RedisExtension
{
/// <summary>
/// 大小写敏感 允许中文的序列化设置
/// </summary>
public static readonly JsonSerializerOptions JsonSerializerOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
};
static RedisExtension()
{
JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
}
/// <summary>
/// 获取指定key的缓存,找不到则返回null
/// </summary>
/// <param name="cache">分布式缓存</param>
/// <param name="key">缓存key</param>
/// <param name="token">取消令牌</param>
/// <typeparam name="T">数据类型</typeparam>
/// <returns></returns>
public static async Task<T?> GetAsync<T>(this IDistributedCache cache, string key, CancellationToken token = default)
{
var s = await cache.GetStringAsync(key, token);
return s is null ? default : JsonSerializer.Deserialize<T>(s, JsonSerializerOptions);
}
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="cache">分布式缓存</param>
/// <param name="key">缓存key</param>
/// <param name="data">缓存数据</param>
/// <param name="expire">过期时间</param>
/// <param name="token">取消令牌</param>
/// <typeparam name="T">数据类型</typeparam>
/// <returns></returns>
public static Task SetAsync<T>(this IDistributedCache cache, string key, T data,
TimeSpan? expire = null, CancellationToken token = default) => cache.SetStringAsync(key,
JsonSerializer.Serialize(data, JsonSerializerOptions),
expire is null ? new () : new () { SlidingExpiration = expire }, token);
/// <summary>
/// 获取指定key的缓存,如果没有则进行设置
/// </summary>
/// <param name="cache">分布式缓存</param>
/// <param name="key">缓存key</param>
/// <param name="addAction">获得要设置的数据的委托</param>
/// <param name="expire">过期时间</param>
/// <param name="token">取消令牌</param>
/// <typeparam name="T">数据类型</typeparam>
/// <returns></returns>
public static async Task<T> GetOrAddAsync<T>(this IDistributedCache cache, string key, Func<T> addAction,
TimeSpan? expire = null, CancellationToken token = default)
{
var r = await cache.GetAsync<T>(key, token);
if (r is not null) return r;
r = addAction();
await cache.SetAsync(key, r, expire, token);
return r;
}
}