using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Options;
|
using WIDESEAWCS_RedisService.Connection;
|
using WIDESEAWCS_RedisService.Options;
|
|
namespace WIDESEAWCS_RedisService.IdGenerator
|
{
|
public class RedisDistributedIdGenerator : IDistributedIdGenerator
|
{
|
private readonly IRedisConnectionManager _connectionManager;
|
private readonly RedisOptions _options;
|
private readonly ILogger<RedisDistributedIdGenerator> _logger;
|
|
public RedisDistributedIdGenerator(
|
IRedisConnectionManager connectionManager,
|
IOptions<RedisOptions> options,
|
ILogger<RedisDistributedIdGenerator> logger)
|
{
|
_connectionManager = connectionManager;
|
_options = options.Value;
|
_logger = logger;
|
}
|
|
private string BuildKey(string name) => $"{_options.KeyPrefix}id:{name}";
|
|
public long NextId(string sequenceName)
|
{
|
return _connectionManager.GetDatabase().StringIncrement(BuildKey(sequenceName));
|
}
|
|
public string NextIdWithDate(string sequenceName)
|
{
|
var datePrefix = DateTime.Now.ToString("yyyyMMdd");
|
var dailyKey = $"{BuildKey(sequenceName)}:{datePrefix}";
|
var db = _connectionManager.GetDatabase();
|
var seq = db.StringIncrement(dailyKey);
|
|
// 每日首次生成时设置过期时间(48小时,留余量)
|
if (seq == 1)
|
db.KeyExpire(dailyKey, TimeSpan.FromHours(48));
|
|
return $"{datePrefix}{seq:D6}";
|
}
|
|
public long GetCurrentId(string sequenceName)
|
{
|
var val = _connectionManager.GetDatabase().StringGet(BuildKey(sequenceName));
|
return val.IsNullOrEmpty ? 0 : (long)val;
|
}
|
|
public bool Reset(string sequenceName)
|
{
|
return _connectionManager.GetDatabase().KeyDelete(BuildKey(sequenceName));
|
}
|
}
|
}
|