2014-07-21 36 views
14

https://github.com/andymccurdy/redis-pyPython'da redis, bağlantıyı nasıl kapatırsınız?

Ruby'de biliyorum quit() yöntemini kullanıyoruz. Python için buraya bir şey bulamıyorum

piton:

import redis 
r = redis.StrictRedis(host='localhost', port=6379, db=0) 
r.set('foo', 'bar') 
print r.get('foo') 
#r.close() doesn't work 

yakut

require "redis" 
redis = Redis.new 
redis.set("mykey", "hello world") 
puts redis.get("mykey") 
redis.quit() 
+0

[Kaynak kodu] 'na (https://github.com/andymccurdy/redis-py/blob/master/redis/client.py) bakarak,' StrictRedis ''close' veya' quit' komutunu uygulamıyor yöntemleri. – jonrsharpe

+0

bağlantıyı kapatmıyoruz tamam mı, redis ile bağlantıyı anladığımı sanmıyorum ... – nevermind

+0

@nevermind Görmek r.client_kill', ama bulmak için, hangi müşteri öldürmek zorunda bunları r.client_list() 'ile listeleyebilirsiniz. 'Netstat kontrol ediliyor | grep 6379' gördüm, bağlantı "kapanış" durumuna geçti. Ayrıca r.execute_command ("QUIT") 'vardır. Ama yine de emin değilim, eğer yaparsa, ne istiyorsun? –

cevap

11

Sadece redis.Redis kullanın. Kaputun altındaki bir bağlantı havuzunu kullanır, bu yüzden bu seviyede yönetmek için endişelenmenize gerek yoktur.

Kesinlikle düşük düzeyde bir bağlantı kullanmanız gerekiyorsa, normal olarak sizin için yapılan yanıt işlemesini redis.Redis ile yapmanız gerekir. İşte

düşük seviyeli bağlantısı kullanarak tek bir talimatının uygulanması için bir örnek:

def execute_low_level(command, *args, **kwargs): 
    connection = redis.Connection(**kwargs) 
    try: 
     connection.connect() 
     connection.send_command(command, *args) 

     response = connection.read_response() 
     if command in redis.Redis.RESPONSE_CALLBACKS: 
      return redis.Redis.RESPONSE_CALLBACKS[command](response) 
     return response 

    finally: 
     del connection 

Örnek kullanımı:

response = execute_low_level(
     'HGET', 'redis:key', 'hash:key', host='localhost', port=6379) 

Ama daha önce söylediğim gibi, redis.Redis 99.9% olarak gitmek yoludur vakaların

11
StrictRedis bağlantı semantiğini kendisi uygulamıyor, bunun yerine olarak kullanılabilen bir bağlantı havuzu kullanır

StrictRedis örneğinin bir özelliği: S.connection_pool. Connection_pool nesnesinin, gerekirse havuzdaki tüm bağlantıların hemen bağlantısını kesmek için bir disconnect yöntemi vardır, ancak StrictRedis nesnesinin kapsamı dışında kaldığında, havuzdaki tüm bağlantılar, müdahaleniz olmadan kendilerini temizler (bkz. Redis/bağlantı. py: 392-396)

+0

Strict ile devam etmeye karar verirsem, bağlantı konusunda endişelenmem gerekir mi? – nevermind

1

Eğer kaynak koduna ConnectionPool.look kullandığınızda bu konuda endişe ihtiyacım yok:

def execute_command(self, *args, **options): 
    "Execute a command and return a parsed response" 
    pool = self.connection_pool 
    command_name = args[0] 
    connection = pool.get_connection(command_name, **options) 
    try: 
     connection.send_command(*args) 
     return self.parse_response(connection, command_name, **options) 
    except (ConnectionError, TimeoutError) as e: 
     connection.disconnect() 
     if not connection.retry_on_timeout and isinstance(e, TimeoutError): 
      raise 
     connection.send_command(*args) 
     return self.parse_response(connection, command_name, **options) 
    finally: 
     pool.release(connection) 

nihayet, her bağlantı olursa olsun ne havuza yayınlayacak ve diğer müşteriye atar .

İlgili konular