Redis使用
#!/usr/bin/env python # -*- coding: utf-8 -*- """ http://www.cnblogs.com/wupeiqi/articles/5132791.html redis:支持5种数据类型 key--->value(字符串:'xxx') key--->value(列表:[11,11,22,44]) key--->value(字典:{'k1':'v1'}) key--->value(集合:[11,22,33]) key--->value(有序集合:{(123,1),('asdf',2),(23,3)}) """ """ #普通redis连接 import redis # 创建一个普通的redis连接 r = redis.Redis(host='192.168.1.22',port=6379) r.set("foo","bar") #存 ret = r.get('foo') #取 print(ret) """ # redis连接池:使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销 import redis # 创建一个redis连接池 pool = redis.ConnectionPool(host='192.168.1.22', port=6379) # 从连接池中获取redis连接 r = redis.Redis(connection_pool=pool) r.set("foo","bars") #存 # r.set("foo","bars",ex=3) #存,设置过期时间(秒) # 批量设置key:value r.mset(k1='v1',k2='v2') r.mset({'k1':'v1','k2':'v2'}) ret = r.get('foo') #取 print(ret) #批量获取 ret1 = r.mget('k1','k2') ret1 = r.mget(['k1','k2']) #设置新值,并获取原来的值 #k1:v1 ret = r.getset('k1','new_value') #ret=v1 ---->k1=new_value ############################################################################# # 事务----原子性操作---管道实现 # redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令, # 则可以使用pipline(管道)实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。 # 比如银行转账:A向B转账1000元-------用管道操作:创建一个管道,在这个管道中A账户扣除1000元,B账户增加1000元,如果A扣除失败, # 或者B增加失败,则A和B的账户都回到没有操作之前的状态,该次转账操作不生效 # 例: import redis pool = redis.ConnectionPool(host='1192.168.1.22', port=6379) r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False) pipe = r.pipeline(transaction=True) #创建一个管道 #管道中可以有多个操作,但是如果其中有一个操作出错,所有操作都不生效 r.set('name', 'alex') r.set('role', 'sb') pipe.execute() #关闭管道
Redis发布订阅
#!/usr/bin/env python # -*- coding: utf-8 -*- """ http://www.cnblogs.com/wupeiqi/articles/5132791.html """ ''' # redis其他小知识 import redis # redis连接池 pool = redis.ConnectionPool(host='127.0.0.1', port=6379) r = redis.Redis(connection_pool=pool) # 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要: # 1、获取name对应的所有列表 # 2、循环列表 # 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能: def list_iter(name): """ 自定义redis列表增量迭代 :param name: redis中的name,即:迭代name对应的列表 :return: yield 返回 列表元素 """ list_count = r.llen(name) for index in range(list_count): yield r.lindex(name, index) # 使用 for item in list_iter('pp'): print(item) ''' # 发布订阅 import redis class RedisHelper: """ 发布订阅帮助类 """ def __init__(self): self.__conn = redis.Redis(host='192.168.1.22') def public(self, channel, msg): """ 发布 :param channel: 信息发布的频道号 :param msg: 要发布的信息 :return: """ self.__conn.publish(channel, msg) # publish方法用于发布在指定频道发布消息 return True def subscribe(self, channel): """ 订阅 :param channel: 订阅的频道号,接收该频道的消息 :return: """ pub = self.__conn.pubsub() # 打开收音机 pub.subscribe(channel) # 调到订阅频道 pub.parse_response() # 准备接收信息 return pub # 发布代码 pub = RedisHelper() pub.public('101fm','hello,I have publishd a message at 101fm') # 订阅代码 # while True: # sub = RedisHelper() # msg = sub.subscribe('101fm') # print(msg.parse_response()) #获取接收的消息
关注我的公众号,不定期推送资讯
本文来自博客园,作者:链条君,转载请注明原文链接:https://www.cnblogs.com/MacoLee/articles/6125693.html