我正在使用Python的Redis服務器。我的應用程序是多線程的(每個進程使用20-32個線程),我也是 我在不同的機器上運行應用程序。python Redis Connections
我注意到,有時Redis cpu的使用率是100%,而Redis服務器變得反應遲鈍。
我想每個應用程序使用1連接總共4個連接池。 因此,例如,如果我最多在20臺計算機上運行我的應用程序,則應該有20 * 4 = 80個連接到redis服務器的 連接。
POOL = redis.ConnectionPool(max_connections=4, host='192.168.1.1', db=1, port=6379)
R_SERVER = redis.Redis(connection_pool=POOL)
class Worker(Thread):
def __init__(self):
self.start()
def run(self):
while True:
key = R_SERVER.randomkey()
if not key: break
value = R_SERVER.get(key)
def _do_something(self, value):
# do something with value
pass
if __name__ = '__main__':
num_threads = 20
workers = [Worker() for _ in range(num_threads)]
for w in workers:
w.join()
上述代碼應運行20個線程在執行命令時獲得來自最大大小爲4的連接池的連接。
當連接被釋放?
根據這個代碼(https://github.com/andymccurdy/redis-py/blob/master/redis/client.py):
#### COMMAND EXECUTION AND PROTOCOL PARSING ####
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:
connection.disconnect()
connection.send_command(*args)
return self.parse_response(connection, command_name, **options)
finally:
pool.release(connection)
每個命令執行後,該連接被釋放,並得到回池中
有人可以驗證我已經明白這個想法正確並且上述示例代碼將按照描述工作?
因爲當我看到Redis的連接,總有超過4
編輯:我只注意到,該函數之前,終於return語句代碼。那麼最後的目的是什麼?
finally塊得到執行,無論它們是否是一個例外。這是一個DRY用例。 –
您提到Redis服務器有時無響應。你使用Windows?如果是這樣,Windows版本會將數據庫異步保存到磁盤,這會導致Redis掛起,直到完成。 –
即使在unix環境下,節約成本也很高。如果您正在使用RDB轉儲序列化策略,則Redis會將內存數據庫副本寫出來。如果您的數據庫大小大於1/2可用內存,則在嘗試執行此操作時會發生不良情況。如果這是問題,請嘗試使用AOF策略或關閉序列化。 –