Redis是一个“key-value”类型的存储系统,为开发者提供了丰富的数据结构,包括列表、集合、散列,还包括了关于这些数据结构的丰富操作。Redis和Memcached类似,但是它支持存储的value类型相对更多,包括字符串、列表、集合、有序集合和散列类型。这些数据类型都支持push/pop
、add/remove
及取交集、并集和差集,乃至更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证运行效率,数据都缓存在内存中。区别是Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了主从(master-slave)同步。
在Python程序中使用Redis时,需要使用redis-py驱动连接Redis的Python客户端。具体安装命令如下。
pip install redis
如图所示:
Redis提供了两个类——Redis
和StrictRedis
用于实现Redis的命令。其中StrictRedis用于实现大部分官方命令,并使用官方的语法和命令,Redis是StrictRedis的子类。
下面的实例文件r01.py演示了使用Redis连接服务器的过程。
import redis
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
r.set('name', 'zhangsan') # 添加
print(r.get('name')) # 获取
运行后会输出:
b'zhangsan'
读者需要注意,在运行上述实例代码之前,必须确保已经启动了Redis。启动命令如下。
redis-server redis.windows.conf
另外,官方还提供了针对Windows系统的开源版本,读者下载后可以用微软的Visual Studio运行。成功启动Redis后的界面如图所示。
Redis使用ConnectionPool来管理一个Redis Server的所有连接,避免每次建立、释放连接的开销。在默认情况下,每个Redis实例都会维护一个自己的连接池。我们可以直接建立一个连接池,然后作为参数 Redis,这样就可以使多个Redis实例共享一个连接池。
下面的实例文件r02.py演示了使用ConnectionPool创建连接池的过程。
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('name', 'zhangsan')
print(r.get('name'))
执行后会输出:
b'zhangsan'
Redis也可以实现“发布-订阅”模式。接下来,定义一个RedisHelper类,连接Redis,定义频道为monitor,定义发布及订阅方法。具体实现代码如下。
import redis
class RedisHelper(object):
def __init__(self):
self.__conn = redis.Redis(host='127.0.0.1', port=6379) # 连接Redis
self.channel = 'monitor' # 定义名称
def publish(self, msg): # 定义发布方法
self.__conn.publish(self.channel, msg)
return True
def subscribe(self): # 定义订阅方法
pub = self.__conn.pubsub()
pub.subscribe(self.channel)
pub.parse_response()
return pub
下面是发布者的实现代码。
from RedisHelper import RedisHelper
obj = RedisHelper()
obj.publish('hello') # 发布
下面是订阅者的实现代码。
from RedisHelper import RedisHelper
obj = RedisHelper()
redis_sub = obj.subscribe() # 调用订阅方法
while True:
msg = redis_sub.parse_response()
print(msg)
在Redis应用中,delete命令用于删除已存在的键,不存在的键会被忽略。通过使用exists命令可以判断键是否存在。
下面的实例文件r05.py演示了使用delete和exists命令的过程。
import redis
#这个Redis 连接不能用,请根据自己的需要修改
r =redis.Redis(host="127.0.0.1",port=6379)
print(r.set('1', '4028b2883d3f5a8b013d57228d760a93'))
print(r.get('1'))
print(r.delete('1'))
print(r.get('1'))
#设定键2的值是 4028b2883d3f5a8b013d57228d760a93
r.set('2', '4028b2883d3f5a8b013d57228d760a93')
# 存在就返回True 不存在就返回False
print(r.exists('2')) #返回True
print(r.exists('33')) #返回False
执行后会输出:
True
b'4028b2883d3f5a8b013d57228d760a93'
1
None
True
False
在Redis应用中,expire命令用于设置键的过期时间,键过期后将不再可用。expireat命令用于以 UNIX时间戳格式设置键的过期时间,键过期后将不再可用。读者需要注意,时间精确到秒,时间戳是10位数字。
下面的实例文件r06.py演示了使用expire和expireat命令的过程。
import redis
# 这个Redis 连接不能用,请根据自己的需要修改
r = redis.Redis(host="127.0.0.1", port=6379)
r.set('2', '4028b2883d3f5a8b013d57228d760a93')
#如果成功就返回True,如果失败就返回False,下面的20表示20s
print(r.expire('2',20))
#如果没有过期我们能得到键2的值;否则,返回None
print(r.get('2'))
r.set('2', '4028b2883d3f5a8b013d57228d760a93')
#成功就返回True 失败就返回False,下面的1598033936表示在2020-08-22 02:18:56键2过期
print(r.expireat('2',1598033936))
print(r.get('2'))
执行后会输出:
True
b'4028b2883d3f5a8b013d57228d760a93'
True
b'4028b2883d3f5a8b013d57228d760a93'
在Redis应用中,keys命令用于查找所有符合给定模式的键。persist命令用于移除给定键的过期时间,使得键永不过期;move命令用于将当前数据库的键移动到给定的数据库db中;select可以设定当前的数据库。
下面的实例文件r07.py演示了使用persist、keys和move命令的过程。
import redis
# 这个Redis 连接不能用,请根据自己的需要修改
r = redis.Redis(host="127.0.0.1", port=6379)
print (r.set('111', '11'))
print (r.set('122', '12'))
print (r.set('113', '13'))
print (r.keys(pattern='11*'))
# 输出的结果是 ['111', '112'],因为键122和11*不匹配
r.move(2,1)#将键2移动到数据库 1 中去
#设定键1的值为11
print (r.set('1', '11'))
#设定键1的过期时间为100s
print (r.expire(1,100))
# 查看键1的过期时间还剩下多少
print (r.ttl('1'))
# 目的是13s后移除键1的过期时间
import time
time.sleep(3)
# 查看键1的过期时间还剩下多少
print (r.ttl('1'))
#移除键1的过期时间
r.persist(1)
# 查看键1的过期时间还剩下多少,输出的结果是 None,可以通过redis desktop manager 查看键1的过期时间
print (r.ttl('1'))
执行后会输出:
True
True
True
[b'111', b'113']
True
True
100
97
None
在Redis应用中还有很多其他重要的命令,具体说明如表所示:
酷客网相关文章:
评论前必须登录!
注册