在redis-py 3.0之后就不在支持使用传统的‘Redis’客户端类了。StrictRedis
现在只是Redis
的一个别名,现在这个连接更加python化。例如,使用redis的字符串操作setbit
和getbit
来统计用户活跃天数:
'''
用Redis统计用户上线次数
理解:
A用户 100010001000001 //活跃了4天
B用户 111111111111111 //每日必到
'''
import redis
from ..password import redis_passwd
# 连接Redis,选择 db0
r = redis.Redis(host='localhost', port=6379, password=redis_passwd, db=0)
# A用户,一年中,每3天上线一次
for i in range(0, 365, 3):
r.setbit('usera', i, 1)
# B用户 每10天上线一次
for i in range(0, 365, 10):
r.setbit('userb', i, 1)
# 用户列表
# "Returns a list of keys matching ``pattern``"
userList = r.keys('user*')
print(userList)
Au = []
Nau = []
# 判断是否为活跃用户,(用户,登录天数)
for u in userList:
logincount = r.bitcount(u)
if logincount > 100:
Au.append((u, logincount))
else:
Nau.append((u, logincount))
for u in Au:
print(f'用户{u[0]}: 活跃用户, 共登录{u[1]}天')
for u in Nau:
print(f'用户{u[0]}: 非活跃用户, 共登录{u[1]}天')
PubSub对象遵循与其创建的客户端实例相同的编码方式。在发送到Redis之前,将使用客户端上指定的字符集对任何使用unicode编码的通道或模式进行编码。如果客户端的decode_responses
标志设置为False(默认值),则消息字典中的channel
,pattern
和data
值将是字节字符串
(Python2的str,Python3的bytes)。如果客户端的decode_responses为True,则它们值将使用客户端的字符集自动解码为unicode字符串。
默认,bytes
类型:
>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, password='***')
>>> r.set('str', 'time')
True
>>> ret = r.get('name')
>>> print(ret, type(ret))
b'Redis' <class 'bytes'>
>>>
修改为str
:
>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, password='***', decode_responses=True)
>>> r.set('str', 'time')
True
>>> ret = r.get('name')
>>> print(ret, type(ret))
Redis <class 'str'>
默认redis入库编码是utf-8
,如果要修改的话,需要指明 charset
和 decode_responsers 为True。
使用GBK
编码:
>>> r2 = redis.Redis(host='localhost', port=6379, password='***', charset='GBK' ,decode_responses=True)
>>> r2.set('greet', '你好')
True
>>> r2.get('greet')
'你好'
redis使用connection pool
来管理对一个redis server 的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数创建Redis实例,这样就可以实现多个Redis实例共享一个连接池。
"""
连接池
"""
import redis
from ..password import redis_passwd
pool = redis.ConnectionPool(host='localhost', port=6379, db=0, password=redis_passwd)
r = redis.Redis(connection_pool=pool)
r.set('name', 'Redis')
print(r.get('name'))
# 输出结果
b'Redis'
ConnectionPools管理一组Connection实例。redis-py有两种类型的连接。默认值连接方式是基于TCP套接字
的常规连接。 UnixDomainSocketConnection允许在与服务器相同的设备上运行的客户端通过unix域套接字
进行连接。 要使用UnixDomainSocketConnection连接,只需将unix_socket_path
参数传递给unix域套接字文件,该参数是一个字符串。 此外,请确保在redis.conf文件中定义了unixsocket
参数,默认注释掉了。
# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
# unixsocket /var/run/redis/redis-server.sock
# unixsocketperm 700
>>> r = redis.Redis(unix_socket_path='/tmp/redis.sock')
timestamp
)或python datetime
对象