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 _logger; public RedisDistributedIdGenerator( IRedisConnectionManager connectionManager, IOptions options, ILogger 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)); } } }