链条传动

砥砺前行,不忘初心!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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())  #获取接收的消息

 

posted on 2016-12-02 14:37  链条君  阅读(324)  评论(0编辑  收藏  举报