Skip to content

Commit 76ccc15

Browse files
authored
Merge pull request #317 from dotnetcore/dev
v1.4.0
2 parents b2f49c9 + 9474dce commit 76ccc15

File tree

52 files changed

+1516
-176
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1516
-176
lines changed

build/releasenotes.props

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
<Project>
22
<PropertyGroup>
33
<EasyCachingCorePackageNotes>
4-
1. Allow to cache null value.
5-
2. Ready for 1.x version.
4+
1. Support distributed lock.
65
</EasyCachingCorePackageNotes>
76
<EasyCachingMemcachedPackageNotes>
8-
1. Upgrading dependencies.
7+
1. Support distributed lock.
98
</EasyCachingMemcachedPackageNotes>
109
<EasyCachingRedisPackageNotes>
11-
1. Support SyncTimeout and AsyncTimeout (#282).
10+
1. Support distributed lock.
1211
</EasyCachingRedisPackageNotes>
1312
<EasyCachingSQLitePackageNotes>
1413
1. Upgrading dependencies.
@@ -38,7 +37,7 @@
3837
1. Upgrading dependencies.
3938
</EasyCachingProtobufPackageNotes>
4039
<EasyCachingCSRedisPackageNotes>
41-
1. Upgrading dependencies.
40+
1. Support distributed lock.
4241
</EasyCachingCSRedisPackageNotes>
4342
<EasyCachingCSRedisBusPackageNotes>
4443
1. Upgrading dependencies.
@@ -50,13 +49,13 @@
5049
1. Upgrading dependencies.
5150
</EasyCachingRabbitBusPackageNotes>
5251
<EasyCachingDiskPackageNotes>
53-
1. fixed disk provider tryset after expired (#280).
52+
1. Upgrading dependencies.
5453
</EasyCachingDiskPackageNotes>
5554
<EasyCachingLiteDBPackageNotes>
5655
1. Upgrading dependencies.
5756
</EasyCachingLiteDBPackageNotes>
5857
<EasyCachingSTJsonPackageNotes>
59-
1. Init.
58+
1. Upgrading dependencies.
6059
</EasyCachingSTJsonPackageNotes>
6160
</PropertyGroup>
6261
</Project>

build/version.props

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
<Project>
22
<PropertyGroup>
3-
<EasyCachingCorePackageVersion>1.3.0</EasyCachingCorePackageVersion>
4-
<EasyCachingMemcachedPackageVersion>1.3.0</EasyCachingMemcachedPackageVersion>
5-
<EasyCachingRedisPackageVersion>1.3.0</EasyCachingRedisPackageVersion>
6-
<EasyCachingSQLitePackageVersion>1.3.0</EasyCachingSQLitePackageVersion>
7-
<EasyCachingInMemoryPackageVersion>1.3.0</EasyCachingInMemoryPackageVersion>
8-
<EasyCachingHybridPackageVersion>1.3.0</EasyCachingHybridPackageVersion>
9-
<EasyCachingAspectCorePackageVersion>1.3.0</EasyCachingAspectCorePackageVersion>
10-
<EasyCachingCastlePackageVersion>1.3.0</EasyCachingCastlePackageVersion>
11-
<EasyCachingResponseCachingPackageVersion>1.3.0</EasyCachingResponseCachingPackageVersion>
12-
<EasyCachingJsonPackageVersion>1.3.0</EasyCachingJsonPackageVersion>
13-
<EasyCachingMessagePackPackageVersion>1.3.0</EasyCachingMessagePackPackageVersion>
14-
<EasyCachingProtobufPackageVersion>1.3.0</EasyCachingProtobufPackageVersion>
15-
<EasyCachingCSRedisPackageVersion>1.3.0</EasyCachingCSRedisPackageVersion>
16-
<EasyCachingRedisBusPackageVersion>1.3.0</EasyCachingRedisBusPackageVersion>
17-
<EasyCachingCSRedisBusPackageVersion>1.3.0</EasyCachingCSRedisBusPackageVersion>
18-
<EasyCachingRabbitBusPackageVersion>1.3.0</EasyCachingRabbitBusPackageVersion>
19-
<EasyCachingDiskPackageVersion>1.3.0</EasyCachingDiskPackageVersion>
20-
<EasyCachingMsExtPackageVersion>1.3.0</EasyCachingMsExtPackageVersion>
21-
<EasyCachingLiteDBPackageVersion>1.3.0</EasyCachingLiteDBPackageVersion>
22-
<EasyCachingSTJsonPackageVersion>1.3.0</EasyCachingSTJsonPackageVersion>
3+
<EasyCachingCorePackageVersion>1.4.0</EasyCachingCorePackageVersion>
4+
<EasyCachingMemcachedPackageVersion>1.4.0</EasyCachingMemcachedPackageVersion>
5+
<EasyCachingRedisPackageVersion>1.4.0</EasyCachingRedisPackageVersion>
6+
<EasyCachingSQLitePackageVersion>1.4.0</EasyCachingSQLitePackageVersion>
7+
<EasyCachingInMemoryPackageVersion>1.4.0</EasyCachingInMemoryPackageVersion>
8+
<EasyCachingHybridPackageVersion>1.4.0</EasyCachingHybridPackageVersion>
9+
<EasyCachingAspectCorePackageVersion>1.4.0</EasyCachingAspectCorePackageVersion>
10+
<EasyCachingCastlePackageVersion>1.4.0</EasyCachingCastlePackageVersion>
11+
<EasyCachingResponseCachingPackageVersion>1.4.0</EasyCachingResponseCachingPackageVersion>
12+
<EasyCachingJsonPackageVersion>1.4.0</EasyCachingJsonPackageVersion>
13+
<EasyCachingMessagePackPackageVersion>1.4.0</EasyCachingMessagePackPackageVersion>
14+
<EasyCachingProtobufPackageVersion>1.4.0</EasyCachingProtobufPackageVersion>
15+
<EasyCachingCSRedisPackageVersion>1.4.0</EasyCachingCSRedisPackageVersion>
16+
<EasyCachingRedisBusPackageVersion>1.4.0</EasyCachingRedisBusPackageVersion>
17+
<EasyCachingCSRedisBusPackageVersion>1.4.0</EasyCachingCSRedisBusPackageVersion>
18+
<EasyCachingRabbitBusPackageVersion>1.4.0</EasyCachingRabbitBusPackageVersion>
19+
<EasyCachingDiskPackageVersion>1.4.0</EasyCachingDiskPackageVersion>
20+
<EasyCachingMsExtPackageVersion>1.4.0</EasyCachingMsExtPackageVersion>
21+
<EasyCachingLiteDBPackageVersion>1.4.0</EasyCachingLiteDBPackageVersion>
22+
<EasyCachingSTJsonPackageVersion>1.4.0</EasyCachingSTJsonPackageVersion>
2323
</PropertyGroup>
2424
</Project>

src/EasyCaching.CSRedis/Configurations/EasyCachingOptionsExtensions.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
namespace Microsoft.Extensions.DependencyInjection
1+
using EasyCaching.CSRedis.DistributedLock;
2+
3+
namespace Microsoft.Extensions.DependencyInjection
24
{
3-
using System;
45
using EasyCaching.Core;
56
using EasyCaching.Core.Configurations;
7+
using EasyCaching.Core.DistributedLock;
68
using EasyCaching.CSRedis;
79
using Microsoft.Extensions.Configuration;
10+
using System;
811

912
/// <summary>
1013
/// EasyCaching options extensions.
@@ -61,5 +64,16 @@ void configure(RedisOptions x)
6164
options.RegisterExtension(new RedisOptionsExtension(name, configure));
6265
return options;
6366
}
67+
68+
/// <summary>
69+
/// Uses the CSRedis lock.
70+
/// </summary>
71+
/// <param name="options">Options.</param>
72+
public static EasyCachingOptions UseCSRedisLock(this EasyCachingOptions options)
73+
{
74+
options.UseDistributedLock<CSRedisLockFactory>();
75+
76+
return options;
77+
}
6478
}
6579
}

src/EasyCaching.CSRedis/Configurations/RedisOptionsExtension.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
{
33
using EasyCaching.Core;
44
using EasyCaching.Core.Configurations;
5+
using EasyCaching.Core.DistributedLock;
56
using EasyCaching.Core.Serialization;
7+
using EasyCaching.CSRedis.DistributedLock;
68
using Microsoft.Extensions.DependencyInjection;
79
using Microsoft.Extensions.DependencyInjection.Extensions;
810
using Microsoft.Extensions.Logging;
@@ -86,8 +88,9 @@ public void AddServices(IServiceCollection services)
8688
var serializers = x.GetServices<IEasyCachingSerializer>();
8789
var optionsMon = x.GetRequiredService<IOptionsMonitor<RedisOptions>>();
8890
var options = optionsMon.Get(_name);
91+
var dlf = x.GetService<CSRedisLockFactory>();
8992
var factory = x.GetService<ILoggerFactory>();
90-
return new DefaultCSRedisCachingProvider(_name, clients, serializers, options, factory);
93+
return new DefaultCSRedisCachingProvider(_name, clients, serializers, options, dlf, factory);
9194
};
9295

9396
services.AddSingleton<IEasyCachingProvider, DefaultCSRedisCachingProvider>(createFactory);

src/EasyCaching.CSRedis/DefaultCSRedisCachingProvider.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
namespace EasyCaching.CSRedis
22
{
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Linq;
63
using EasyCaching.Core;
4+
using EasyCaching.Core.DistributedLock;
75
using EasyCaching.Core.Serialization;
6+
using EasyCaching.CSRedis.DistributedLock;
87
using global::CSRedis;
98
using Microsoft.Extensions.Logging;
9+
using System;
10+
using System.Collections.Generic;
11+
using System.Linq;
1012

1113
public partial class DefaultCSRedisCachingProvider : EasyCachingAbstractProvider
1214
{
@@ -53,12 +55,33 @@ public partial class DefaultCSRedisCachingProvider : EasyCachingAbstractProvider
5355
/// <param name="serializers">Serializers.</param>
5456
/// <param name="options">Options.</param>
5557
/// <param name="loggerFactory">Logger factory.</param>
58+
public DefaultCSRedisCachingProvider(
59+
string name,
60+
IEnumerable<EasyCachingCSRedisClient> clients,
61+
IEnumerable<IEasyCachingSerializer> serializers,
62+
RedisOptions options,
63+
ILoggerFactory loggerFactory = null)
64+
: this(name, clients, serializers, options, null, loggerFactory)
65+
{
66+
}
67+
68+
/// <summary>
69+
/// Initializes a new instance of the <see cref="T:EasyCaching.CSRedis.DefaultCSRedisCachingProvider"/> class.
70+
/// </summary>
71+
/// <param name="name">Name.</param>
72+
/// <param name="clients">Clients.</param>
73+
/// <param name="serializers">Serializers.</param>
74+
/// <param name="options">Options.</param>
75+
/// <param name="factory">Distributed lock factory</param>
76+
/// <param name="loggerFactory">Logger factory.</param>
5677
public DefaultCSRedisCachingProvider(
5778
string name,
5879
IEnumerable<EasyCachingCSRedisClient> clients,
5980
IEnumerable<IEasyCachingSerializer> serializers,
6081
RedisOptions options,
82+
CSRedisLockFactory factory = null,
6183
ILoggerFactory loggerFactory = null)
84+
: base(factory, options)
6285
{
6386
this._name = name;
6487
this._options = options;
@@ -401,7 +424,7 @@ public override void BaseSet<T>(string cacheKey, T cacheValue, TimeSpan expirati
401424
/// <typeparam name="T">The 1st type parameter.</typeparam>
402425
public override void BaseSetAll<T>(IDictionary<string, T> values, TimeSpan expiration)
403426
{
404-
//whether to use pipe based on redis mode
427+
//whether to use pipe based on redis mode
405428
if (MaxRdSecond > 0)
406429
{
407430
var addSec = new Random().Next(1, MaxRdSecond);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using EasyCaching.Core.DistributedLock;
2+
using Microsoft.Extensions.Logging;
3+
using Microsoft.Extensions.Options;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
7+
namespace EasyCaching.CSRedis.DistributedLock
8+
{
9+
public class CSRedisLockFactory : DistributedLockFactory
10+
{
11+
private readonly IEnumerable<EasyCachingCSRedisClient> _clients;
12+
13+
public CSRedisLockFactory(IEnumerable<EasyCachingCSRedisClient> clients,
14+
IOptionsMonitor<RedisOptions> optionsMonitor,
15+
ILoggerFactory loggerFactory = null)
16+
: base(name => DistributedLockOptions.FromProviderOptions(optionsMonitor.Get(name)), loggerFactory) =>
17+
_clients = clients;
18+
19+
protected override IDistributedLockProvider GetLockProvider(string name) =>
20+
new CSRedisLockProvider(name, _clients.Single(x => x.Name.Equals(name)));
21+
}
22+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using CSRedis;
2+
using EasyCaching.Core.DistributedLock;
3+
using System;
4+
using System.Threading.Tasks;
5+
6+
namespace EasyCaching.CSRedis.DistributedLock
7+
{
8+
public class CSRedisLockProvider : IDistributedLockProvider
9+
{
10+
private readonly string _name;
11+
private readonly EasyCachingCSRedisClient _database;
12+
13+
public CSRedisLockProvider(string name, EasyCachingCSRedisClient database)
14+
{
15+
_name = name;
16+
_database = database;
17+
}
18+
19+
public Task<bool> SetAsync(string key, byte[] value, int ttlMs) =>
20+
_database.SetAsync($"{_name}/{key}", value, TimeSpan.FromMilliseconds(ttlMs));
21+
22+
public bool Add(string key, byte[] value, int ttlMs) =>
23+
_database.Set($"{_name}/{key}", value, TimeSpan.FromMilliseconds(ttlMs), RedisExistence.Nx);
24+
25+
public Task<bool> AddAsync(string key, byte[] value, int ttlMs) =>
26+
_database.SetAsync($"{_name}/{key}", value, TimeSpan.FromMilliseconds(ttlMs), RedisExistence.Nx);
27+
28+
public bool Delete(string key, byte[] value) =>
29+
(long)_database.Eval(@"if redis.call('GET', KEYS[1]) == ARGV[1] then
30+
return redis.call('DEL', KEYS[1]);
31+
end
32+
return -1;", $"{_name}/{key}", value) >= 0;
33+
34+
public async Task<bool> DeleteAsync(string key, byte[] value) =>
35+
(long)await _database.EvalAsync(@"if redis.call('GET', KEYS[1]) == ARGV[1] then
36+
return redis.call('DEL', KEYS[1]);
37+
end
38+
return -1;", $"{_name}/{key}", value) >= 0;
39+
40+
public bool CanRetry(Exception ex) => ex is RedisClientException;
41+
}
42+
}

0 commit comments

Comments
 (0)