天天看点

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,如需转载请自行联系原作者