Skip to content

Commit 6a6784d

Browse files
committed
Enable MessagePackCompression.Lz4BlockArray for EFCoreSecondLevelCacheInterceptor.StackExchange.Redis, Close #296
1 parent 2c2df96 commit 6a6784d

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

src/EFCoreSecondLevelCacheInterceptor.StackExchange.Redis/EFMessagePackSerializer.cs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using MessagePack;
22
using MessagePack.Resolvers;
3+
using Microsoft.Extensions.Options;
34

45
namespace EFCoreSecondLevelCacheInterceptor;
56

@@ -16,14 +17,31 @@ public class EFMessagePackSerializer : IEFDataSerializer
1617
DynamicGenericResolver.Instance
1718
]);
1819

20+
private readonly bool _enableCompression;
21+
private MessagePackSerializerOptions? _messagePackSerializerOptions;
22+
23+
/// <summary>
24+
/// High-Level API of MessagePack for C#.
25+
/// </summary>
26+
public EFMessagePackSerializer(IOptions<EFCoreSecondLevelCacheSettings> cacheSettings)
27+
{
28+
var options = cacheSettings.Value.AdditionalData as EFRedisCacheConfigurationOptions ??
29+
throw new InvalidOperationException(
30+
message: "Please call the UseStackExchangeRedisCacheProvider() method.");
31+
32+
_enableCompression = options.EnableCompression;
33+
}
34+
35+
private MessagePackSerializerOptions MessagePackSerializerOptions
36+
=> _messagePackSerializerOptions ??= GetSerializerOptions();
37+
1938
/// <summary>
2039
/// Serializes a given value with the specified buffer writer.
2140
/// </summary>
2241
/// <param name="obj"></param>
2342
/// <typeparam name="T"></typeparam>
2443
/// <returns></returns>
25-
public byte[] Serialize<T>(T? obj)
26-
=> MessagePackSerializer.Serialize(obj, MessagePackSerializerOptions.Standard.WithResolver(CustomResolvers));
44+
public byte[] Serialize<T>(T? obj) => MessagePackSerializer.Serialize(obj, MessagePackSerializerOptions);
2745

2846
/// <summary>
2947
/// Deserializes a value of a given type from a sequence of bytes.
@@ -32,8 +50,11 @@ public byte[] Serialize<T>(T? obj)
3250
/// <typeparam name="T"></typeparam>
3351
/// <returns></returns>
3452
public T? Deserialize<T>(byte[]? data)
35-
=> data is null
36-
? default
37-
: MessagePackSerializer.Deserialize<T>(data,
38-
MessagePackSerializerOptions.Standard.WithResolver(CustomResolvers));
53+
=> data is null ? default : MessagePackSerializer.Deserialize<T>(data, MessagePackSerializerOptions);
54+
55+
private MessagePackSerializerOptions GetSerializerOptions()
56+
=> _enableCompression
57+
? MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray)
58+
.WithResolver(CustomResolvers)
59+
: MessagePackSerializerOptions.Standard.WithResolver(CustomResolvers);
3960
}

src/EFCoreSecondLevelCacheInterceptor.StackExchange.Redis/EFRedisCacheConfigurationOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,9 @@ public class EFRedisCacheConfigurationOptions
1616
/// Redis ConnectionString
1717
/// </summary>
1818
public string? RedisConnectionString { set; get; }
19+
20+
/// <summary>
21+
/// Enables MessagePackCompression.Lz4BlockArray
22+
/// </summary>
23+
public bool EnableCompression { set; get; }
1924
}

src/EFCoreSecondLevelCacheInterceptor.StackExchange.Redis/EFStackExchangeRedisCacheProviderOptions.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using Microsoft.Extensions.DependencyInjection.Extensions;
32
using StackExchange.Redis;
43

@@ -16,7 +15,8 @@ public static class EFStackExchangeRedisCacheProviderOptions
1615
public static EFCoreSecondLevelCacheOptions UseStackExchangeRedisCacheProvider(
1716
this EFCoreSecondLevelCacheOptions options,
1817
ConfigurationOptions configurationOptions,
19-
TimeSpan timeout)
18+
TimeSpan timeout,
19+
bool enableCompression = false)
2020
{
2121
if (options == null)
2222
{
@@ -25,7 +25,8 @@ public static EFCoreSecondLevelCacheOptions UseStackExchangeRedisCacheProvider(
2525

2626
SetOptions(options, timeout, new EFRedisCacheConfigurationOptions
2727
{
28-
ConfigurationOptions = configurationOptions
28+
ConfigurationOptions = configurationOptions,
29+
EnableCompression = enableCompression
2930
});
3031

3132
return options;
@@ -38,7 +39,8 @@ public static EFCoreSecondLevelCacheOptions UseStackExchangeRedisCacheProvider(
3839
public static EFCoreSecondLevelCacheOptions UseStackExchangeRedisCacheProvider(
3940
this EFCoreSecondLevelCacheOptions options,
4041
string redisConnectionString,
41-
TimeSpan timeout)
42+
TimeSpan timeout,
43+
bool enableCompression = false)
4244
{
4345
if (options == null)
4446
{
@@ -47,7 +49,8 @@ public static EFCoreSecondLevelCacheOptions UseStackExchangeRedisCacheProvider(
4749

4850
SetOptions(options, timeout, new EFRedisCacheConfigurationOptions
4951
{
50-
RedisConnectionString = redisConnectionString
52+
RedisConnectionString = redisConnectionString,
53+
EnableCompression = enableCompression
5154
});
5255

5356
return options;

0 commit comments

Comments
 (0)