Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Duy trì kết nối Redis đang mở bằng BookSleeve

Vì tôi không có câu trả lời nào hay, nên tôi đã đưa ra giải pháp này (BTW cảm ơn @Simon và @Alex vì câu trả lời của bạn!).

Tôi muốn chia sẻ nó với tất cả cộng đồng như một tài liệu tham khảo. Tất nhiên, mọi chỉnh sửa sẽ được đánh giá cao.

using System;
using System.Net.Sockets;
using BookSleeve;

namespace Redis
{
    public sealed class RedisConnectionGateway
    {
        private const string RedisConnectionFailed = "Redis connection failed.";
        private RedisConnection _connection;
        private static volatile RedisConnectionGateway _instance;

        private static object syncLock = new object();
        private static object syncConnectionLock = new object();

        public static RedisConnectionGateway Current
        {
            get
            {
                if (_instance == null)
                {
                    lock (syncLock)
                    {
                        if (_instance == null)
                        {
                            _instance = new RedisConnectionGateway();
                        }
                    }
                }

                return _instance;
            }
        }

        private RedisConnectionGateway()
        {
            _connection = getNewConnection();
        }

        private static RedisConnection getNewConnection()
        {
            return new RedisConnection("127.0.0.1" /* change with config value of course */, syncTimeout: 5000, ioTimeout: 5000);
        }

        public RedisConnection GetConnection()
        {
            lock (syncConnectionLock)
            {
                if (_connection == null)
                    _connection = getNewConnection();

                if (_connection.State == RedisConnectionBase.ConnectionState.Opening)
                    return _connection;

                if (_connection.State == RedisConnectionBase.ConnectionState.Closing || _connection.State == RedisConnectionBase.ConnectionState.Closed)
                {
                    try
                    {
                        _connection = getNewConnection();
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(RedisConnectionFailed, ex);
                    }
                }

                if (_connection.State == RedisConnectionBase.ConnectionState.Shiny)
                {
                    try
                    {
                        var openAsync = _connection.Open();
                        _connection.Wait(openAsync);
                    }
                    catch (SocketException ex)
                    {
                        throw new Exception(RedisConnectionFailed, ex);
                    }
                }

                return _connection;
            }
        }
    }
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sự khác biệt giữa phương pháp HSET và HMSET trong cơ sở dữ liệu redis là gì

  2. Chuyển một tham chiếu đến một phiên bản Redis tới một Gorilla / Mux Handler

  3. Làm cách nào để đặt / lấy pandas.DataFrame đến / từ Redis?

  4. Redis làm gì khi hết bộ nhớ?

  5. Docker &Celery - LỖI:Pidfile (celerybeat.pid) đã tồn tại