RedisCacheAccess.cs 1.0 KB

1234567891011121314151617181920212223242526272829303132333435
  1. using StackExchange.Redis;
  2. using System;
  3. using System.Linq;
  4. using VCommon.Diagnostics;
  5. namespace VCommon.Caching.Internals
  6. {
  7. internal class RedisCacheAccess : CacheAccess
  8. {
  9. private readonly ConnectionMultiplexer _conn;
  10. internal RedisCacheAccess(string server) => _conn = ConnectionMultiplexer.Connect(server);
  11. // --- database ---
  12. private IDatabase GetDatabase(int db) => _conn.GetDatabase(db);
  13. public void CacheOp(int db, Action<IDatabase> action)
  14. {
  15. using (new TimeoutWarnLog(nameof(CacheAccess))) action(GetDatabase(db));
  16. }
  17. public T CacheOp<T>(int db, Func<IDatabase, T> action)
  18. {
  19. using (new TimeoutWarnLog(nameof(CacheAccess))) return action(GetDatabase(db));
  20. }
  21. public RedisKey[] SearchKeys(int db, string pattern)
  22. {
  23. return _conn.GetEndPoints()
  24. .SelectMany(p => _conn.GetServer(p).Keys(db, pattern, int.MaxValue))
  25. .ToArray();
  26. }
  27. }
  28. }