복붙노트

[REDIS] PooledRedisClientManager는 연결을 해제하지

REDIS

PooledRedisClientManager는 연결을 해제하지

나는 레디 스에서 JSON 데이터의 목록을 저장하고 ServiceStack의 C #을 클라이언트를 사용하여 접근하고있다. 나는 기본적으로 내가 ID의 zrange를 저장하는 내 자신의 외래 키를 관리하고 있는데이 ID 년대 zrange에서 당겨 후 레디 스에서 기본 JSON 객체를 가져오고 돌아갑니다리스트로 패키지 내 응용 프로그램 내부 인터페이스를 사용 내 응용 프로그램의 다른 부분.

나는 레디 스 코드를 실행하는 서버에서 다른 서버에서 호스팅하는 기대로 나는 PooledRedisClientManager을 사용하고 있습니다.

나는 MSOpenTech 레디 스 서버를 사용하여, 윈도우 8에서 로컬 내 모든 개발 작업을하고있는 중이 야. 현재 내 가장 큰 도전은 클라이언트 연결이 종료되지 않는 것입니다.

내 레디 스 persister IRedisClientManager 인스턴스 IOC (CastleWindsor가있다)에 주입되고있다. 이 코드는 푸른 작업자 역할의 컨텍스트에서 실행됩니다.

이것은 내가 zrange에서 항목을 가져 오는 오전하는 방법입니다 :

public class MyRedisPersister<T> : IResourcePersister<T>
{ 
    IRedisClientManager _mgr;
    public MyRedisPersister(IRedisClientManager mgr)
    {
        _mgr = mgr;
    }

    public IResourceList<T> Get<T>(string key, int offset, int count) where T
    {
        using (var redis = _clientManager.GetClient())
        {
            var itemKeys = redis.GetRangeFromSortedSet(key, offset, offset + count - 1).ToList();
            var totalItems = redis.GetSortedSetCount(key);

            if (itemKeys.Count == 0)
            {
                return new ResourceList<T>
                    {
                        Items = new List<T>(),
                        Offset = 0,
                        PageSize = 0,
                        TotalItems = 0,
                        TotalPages = 0
                    };
            }
            else
            {
                return new ResourceList<T>
                    {
                        Items = itemKeys.Select(k => redis.Get<T>(k)).ToList(),
                        Offset = offset,
                        PageSize = count,
                        TotalItems = totalItems,
                        TotalPages = (int) Math.Ceiling((float) totalItems/count)
                    };
            }
        }
    }
}

이것은 IRedisClientManager를 등록하는 코드 I의 사용이다

var mgr = new PooledRedisClientManager(100, 10, "localhost:6379");
container.Register(Component.For<IRedisClientsManager>().Instance(mgr).LifeStyle.Singleton);

어떤 도움을 크게 감상 할 수있다.

해결법

  1. ==============================

    1.현재 내 가장 큰 도전은 클라이언트 연결이 종료되지 않는 것입니다.

    현재 내 가장 큰 도전은 클라이언트 연결이 종료되지 않는 것입니다.

    나의 이해는 클라이언트 연결 그냥 재사용을 위해 수영장에 넣어 닫을 수 없습니다해야한다는 것입니다, 그래서 당신은 'PooledRedisClientManager'를 사용하고 있습니다. 풀 크기가 100 개 연결 것 같습니다.

    당신은 사용해 볼 수 있습니다 var에 MGR = 새로운 BasicRedisClientManager ( "로컬 호스트 : 6379") 이는 클라이언트 폐기해야한다.

  2. ==============================

    2.편집하려면이 방법 아래 권장하지 않습니다 - 당신이 IRedisClientsManager에 대한 종속성을하고 사용 () 블록 내부의 모든 레디 스 클라이언트 호출을 포장해야한다, 그렇지 않으면 당신은 그렘린 물린됩니다.

    편집하려면이 방법 아래 권장하지 않습니다 - 당신이 IRedisClientsManager에 대한 종속성을하고 사용 () 블록 내부의 모든 레디 스 클라이언트 호출을 포장해야한다, 그렇지 않으면 당신은 그렘린 물린됩니다.

    나는 비슷한 문제가이 일 듯 결국, PooledRedisClientsManager 멋지게 연주 윈저을 얻는을 꾸게 :

            container.Register(
                Component.For<IRedisClientsManager>()
                         .Instance(redisClients)
                         .LifestyleSingleton(),
    
                Component.For<IRedisClient>()
                         .UsingFactoryMethod(c => c.Resolve<IRedisClientsManager>().GetClient(),
                                            managedExternally: true));
        }
    

    managedExternally 매개 변수는 IRedisClients에 우려를 해체 적용하고 PooledRedisClientsManager 핸들 재활용을하게하려고하지 윈저을 알려줍니다.

  3. from https://stackoverflow.com/questions/14856975/pooledredisclientmanager-not-releasing-connections by cc-by-sa and MIT license