使用redis-py的兩個類Redis和StrictRedis時遇到的坑
前言:
今天產品經理說,有幾個隊列排序的功能不能用了。對比了下以前的代碼查到了一個原因,這個比較的坑,總結起來也是自己沒好好看文檔。
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令(比如,SET命令對應與StrictRedis.set方法)。Redis是StrictRedis的子類,用於向后兼容舊版本的redis-py。 簡單說,官方推薦使用StrictRedis方法。
不推薦Redis類,原因是他和咱們在redis-cli操作有些不一樣,主要不一樣是下面這三個方面。
·LREM:參數 ‘num’ 和 ‘value’ 的順序交換了一下,cli是 lrem queueName 0 ‘string’ 。 這里的0時所有的意思。 但是Redis這個類,把控制和string調換了。
·ZADD:實現時 score 和 value 的順序不小心弄反了,后來有人用了,就這樣了
·SETEX: time 和 value 的順序反了
.Pool: 連接池
最近爬蟲很是凶猛,標注下文章的原文地址: blog.xiaorui.cc
再就是連接池,很多人用Redis的原因是,以前的一些個博客的關於python redis的操作,基本用的時Redis的連接池方式。 其實StrictRedis也是支持的。
Redis的連接池的方法:
1
2
|
pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)
|
StrictRedis的連接池的實現方式:
1
2
3
|
In [4]: pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
In [5]: r = redis.StrictRedis(connection_pool=pool)
|
看下官方的創建redis的時候,都可以添加什么參數。
1
2
3
4
5
6
|
class redis.StrictRedis(host='localhost', port=6379, db=0, password=None, socket_timeout=None, connection_pool=None, charset='utf-8', errors='strict', decode_responses=False, unix_socket_path=None)
Implementation of the Redis protocol.
This abstract class provides a Python interface to all Redis commands and an implementation of the Redis protocol.
Connection and Pipeline derive from this, implementing how the commands are sent and received to the Redis server
|
另外的再說下redis的對於有些編碼入庫的問題,redis的連接附加的參數里面,默認編碼是utf-8,但是如果你非要用GBK那就需要指明你的chardet和decode_responses為True 。
1
|
class redis.StrictRedis (host='localhost', port=6379, db=0, password=None, socket_timeout=None,connection_pool=None, charset='GBK ' , errors='strict', decode_responses=True)
|
嗯,剩下的就沒什么了 。以后要好好的看文檔哈。
更新, 今天又遇到這問題了…
1
2
3
4
5
6
7
8
9
10
11
|
#xiaorui.cc
redis.zadd('timer_scheduler', json.dumps(urlbody), score)
File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 1574, in zadd
return self.execute_command('ZADD', name, *pieces)
File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 565, in execute_command
return self.parse_response(connection, command_name, **options)
File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 577, in parse_response
response = connection.read_response()
File "/usr/local/lib/python2.7/site-packages/redis/connection.py", line 574, in read_response
raise response
ResponseError: value is not a valid float
|
很明顯,順序不對… ResponseError: value is not a valid float ,字符串跟score反了…