python redis模块

发布时间:2019-09-16 07:33:19编辑:auto阅读(1495)

      redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

      python也提供的操作redis的模块。通过这个模块我们就可以向redis中写入和获取数据了。

    看一个简单的插入和查询数据的代码。

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    import redis
    #创建一个Redis方法实例,指定redis服务所在的地址和端口
    r = redis.Redis(host='192.168.10.105', port=6379)
    """
    通过set()方法向redis中写入数据,因为redis存储是k-v类型的字典模式
    所以下面的的代码相当于向redis中写入一个字典{'foo':'Bar'}
    """
    r.set('foo', 'Bar')
    #通过get()方法从redis中key值'foo'对应的value值
    print r.get('foo')

    运行结果如下

    Bar


    连接池

      先说一下线程池(进程池)与连接池的区别。按我的理解,线程池(进程池)是限制执行一个任务的时候最多可以启动多少个线程(进程),一条线程(进程)处理完任务就消亡掉了。随后马上再创建一条新的线程(进程)到队列里获取任务执行再消亡。这样周而复始的运作。线程(进程)池只是限制一下同时存在的线程(进程)数量上限而已。这个方式的好处是不用预留大量线程等待连接,避免占用资源。缺点就是需要反复创建和销毁线程,这个过程开销也很大。

      连接池里面跑的都是线程。这些线程用来连接应用和数据库。每个连接池只要启动就会最少产生n个线程用于等待连接。当应用的连接数大于现有的线程数时,就产生新的线程应对连接请求。但是当达到预设上线的时候就不再产生新线程,其他请求只能等着有空余线程之后直接再连上。这样在繁忙的时候线程只会产生和等待不会消亡。当业务高峰过去。没每断开一个连接就会消亡掉一个线程。知道线程降低到最小线程数n的时候,线程数量就不会继续消亡了。这种方式的好处是不用反复创建新的线程增加创建开销。但是一启动就需要创建很多线程等着连接。时间久了也会对资源过度占用。

      redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。看代码:

    import redis
    """
    调用ConnectionPool()方法创建一个连接池实例,这里不管指定了redis服务器的ip和port还可以指定连接池
    的最大连接数。如果不指定的话就是按系统的最大连接数取值(具体是什么有时候需要好好看看源码的解释)
    """
    pool = redis.ConnectionPool(host='192.168.10.105', port=6379,max_connections=10)
    """
    实例化redis的API的时候填入的参数变为刚刚定义的连接池
    """
    r = redis.Redis(connection_pool=pool)
    r.set('foo', 'Bar')
    print r.get('foo')

    执行结果和调用的普通的方法没什么区别,只是用了连接池之后最多只能有10个这样的set操作连接到redis服务器

    Bar

    管道

      我们上面的命令都是一次执行一个set操作,每次set都会连接一次数据库。如果set的量比较大,操作有比较密集的话就可以使用pipline管道操作。这个方法的作用就是把set这类的针对redis的操作都放入管道中,最后统一执行一次。这样的好处就是一次连接执行多条命令,减少与redis的连接次数。看代码

    #!/usr/bin/env python
    # -*-coding:utf-8-
    import redis
    """
    调用ConnectionPool()方法创建一个连接池实例,这里不管指定了redis服务器的ip和port还可以指定连接池
    的最大连接数。如果不指定的话就是按系统的最大连接数取值(具体是什么有时候需要好好看看源码的解释)
    """
    pool = redis.ConnectionPool(host='192.168.10.105', port=6379,max_connections=10)
    r = redis.Redis(connection_pool=pool)
    """
    默认情况下,向redis中set一次数据就叫一次原子性的操作。说白了就是事物操作如果set成功就没事了,如果不
    成功就把插入的数据回退。非原子性的操作就是不管成功与否都继续进行也没有回退的数据。是否启用原子性操作
    就通过transaction关键字来设置
    """
    # pipe = r.pipeline(transaction=False)
    #创建一个管道实例
    pipe = r.pipeline(transaction=True)
    #管道下面插入要执行的语句
    r.set('name', 'alex')
    r.set('role', 'sb')
    #执行通道里的所有命令
    pipe.execute()

     

    redis订阅和发布。

     redis有个很有用的功能,它的原理就像个收音机一样。一个订阅者就相当于听众,一个发布者类似于主播。redis就是个广播电台。主播(发布者)通过电台(redis)传达给听众(订阅者)。另外要说明一下的就是主播和听众不是一对多,而是多对多的关系。可以多个主播多个听众的。下面通过代码来实现一下。

    先来把电台这边的搭建好

    #!/usr/bin/env python
    # coding:utf-8
    import redis
    r=redis.Redis(host='192.168.10.105',port=6379)
    #就这么简单,两句话。向指定的频道发送消息
    r.publish('wgw_channel','hello everyone')


    下面写个听众这一端的代码

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    import redis
    r=redis.Redis(host='192.168.10.105',port=6379)
    #打开收音机电源
    sub=r.pubsub()
    #调整收音机的接收频率,两边的频率必须一样,不然就收不到了。
    sub.subscribe('wgw_channel')
    #调整好了就循环接受接收电台的信号,播放出来
    while True:
        print sub.parse_response()

    客户端运行起来之后会收到如下的运行结果

    D:\Python27\python.exe F:/python_file/day12/test.py

    #这一行第一次运行的时候肯定会出现,这个相当于频道的一个启动提示

    ['subscribe', 'wgw_channel', 1L]

    #这里开始就是接收到的从电台主播那里发送过来的消息了

    ['message', 'wgw_channel', 'hello everyone']















      

















关键字