天天看點

python連接配接redis

一、安裝服務

下載下傳、編譯安裝

<code>wget http:</code><code>//download</code><code>.redis.io</code><code>/releases/redis-3</code><code>.0.1.</code><code>tar</code><code>.gz</code>

<code>tar</code> <code>-zxvf redis-3.0.1.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>redis-3.0.1</code>

<code>make</code>

二進制檔案是編譯完成後在src目錄下,通過下面的指令啟動Redis服務:

<code>$ src</code><code>/redis-server</code> <code>&amp;</code>

用戶端也可以如下安裝:

<code>pip </code><code>install</code> <code>redis</code>

二、redis連接配接示例

    redis是以key-value的形式存儲的。首先我們将redis所在主機的ip和釋出端口作為參數執行個體化了一個對象r,然後去設定set和取出get值。

例子:

<code>import</code> <code>redis</code>

<code>redis_config </code><code>=</code> <code>{</code>

<code>"host"</code><code>: </code><code>"192.168.2.230"</code><code>,</code>

<code>"port"</code><code>: </code><code>6379</code>

<code>}</code>

<code>r </code><code>=</code> <code>redis.Redis(</code><code>*</code><code>*</code><code>redis_config)</code>

<code>r.</code><code>set</code><code>(</code><code>"name"</code><code>,</code><code>"huangzhenping"</code><code>)</code>

<code>print</code><code>(r.keys())</code>

<code>print</code><code>(r.get(</code><code>"name"</code><code>))</code>

運作結果:

name

huangzhenping

三、連接配接池

    redis-py使用connection pool來管理對一個redis server的所有連接配接,避免每次建立、釋放連接配接的開銷。預設,每個Redis執行個體都會維護一個自己的連接配接池。可以直接建立一個連接配接池,然後作為參數Redis,這樣就可以實作多個Redis執行個體共享一個連接配接池

<code>    </code><code>"host"</code><code>: </code><code>"192.168.2.230"</code><code>,</code>

<code>    </code><code>"port"</code><code>: </code><code>6379</code>

<code>pool </code><code>=</code> <code>redis.ConnectionPool(</code><code>*</code><code>*</code><code>redis_config)</code>

<code>r </code><code>=</code> <code>redis.Redis(connection_pool</code><code>=</code><code>pool)</code>

<code>r.</code><code>set</code><code>(</code><code>"age"</code><code>,</code><code>"27"</code><code>)</code>

<code>print</code><code>(r.get(</code><code>"age"</code><code>))</code>

運作結果:

27

或者将連接配接池包裝成一個函數,友善調用:

<code>def</code> <code>get_redis_connect():</code>

<code>    </code><code>redis_config </code><code>=</code> <code>{</code>

<code>        </code><code>"host"</code><code>: </code><code>"192.168.2.230"</code><code>,</code>

<code>        </code><code>"port"</code><code>: </code><code>6379</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>    </code><code>pool </code><code>=</code> <code>redis.ConnectionPool(</code><code>*</code><code>*</code><code>redis_config)</code>

<code>    </code><code>r </code><code>=</code> <code>redis.Redis(connection_pool</code><code>=</code><code>pool)</code>

<code>    </code><code>return</code> <code>r</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>

<code>    </code><code>r </code><code>=</code> <code>get_redis_connect()</code>

<code>    </code><code>print</code><code>(r.keys())</code>

四、管道

    redis-py預設在執行每次請求都會建立(連接配接池申請連接配接)和斷開(歸還連接配接池)一次連接配接操作,如果想要在一次請求中指定多個指令,則可以使用pipline實作一次請求指定多個指令,并且預設情況下一次pipline 是原子性操作。redis服務端會處理完多條指令後會将多條指令的處理結果打包到一起傳回給用戶端。需要注意到是redis必須在處理完所有指令前先緩存起所有指令的處理結果,打包的指令越多,緩存消耗記憶體也越多。

例子:對比使用管道和不使用管道處理的時間

<code>import</code> <code>datetime</code>

<code>def</code> <code>withpipe(r):</code>

<code>    </code><code>pipe </code><code>=</code> <code>r.pipeline(transaction</code><code>=</code><code>True</code><code>)</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>xrange</code><code>(</code><code>1</code><code>, </code><code>1000</code><code>):</code>

<code>        </code><code>key </code><code>=</code> <code>"key1_"</code> <code>+</code> <code>str</code><code>(i)</code>

<code>        </code><code>value </code><code>=</code> <code>"value1_"</code> <code>+</code> <code>str</code><code>(i)</code>

<code>        </code><code>pipe.</code><code>set</code><code>(key, value)</code>

<code>    </code><code>pipe.execute()</code>

<code>def</code> <code>withoutpipe(r):</code>

<code>        </code><code>key </code><code>=</code> <code>"key2_"</code> <code>+</code> <code>str</code><code>(i)</code>

<code>        </code><code>value </code><code>=</code> <code>"value2_"</code> <code>+</code> <code>str</code><code>(i)</code>

<code>        </code><code>r.</code><code>set</code><code>(key, value)</code>

<code>        </code> 

<code>    </code><code>"port"</code><code>: </code><code>6379</code><code>,</code>

<code>    </code><code>"db"</code><code>: </code><code>0</code>

<code>    </code><code>r1 </code><code>=</code> <code>redis.Redis(connection_pool</code><code>=</code><code>pool)</code>

<code>    </code><code>r2 </code><code>=</code> <code>redis.Redis(connection_pool</code><code>=</code><code>pool)</code>

<code>    </code><code>start </code><code>=</code> <code>datetime.datetime.now()</code>

<code>    </code><code>withpipe(r1)</code>

<code>    </code><code>end </code><code>=</code> <code>datetime.datetime.now()</code>

<code>    </code><code>t_time </code><code>=</code> <code>(end </code><code>-</code> <code>start).microseconds</code>

<code>    </code><code>print</code><code>(</code><code>"withpipe time is: {0}"</code><code>.</code><code>format</code><code>(t_time))</code>

<code>    </code><code>withoutpipe(r2)</code>

<code>    </code><code>print</code><code>(</code><code>"withoutpipe time is: {0}"</code><code>.</code><code>format</code><code>(t_time))</code>

withpipe time is: 17000

withoutpipe time is: 105000

本文轉自 huangzp168 51CTO部落格,原文連結:http://blog.51cto.com/huangzp/2043948,如需轉載請自行聯系原作者