zoukankan      html  css  js  c++  java
  • python的redis简单使用

    安装的Python版本 3.6.1

    redis安装的2.8

    安装redis模块

    pip install redis

    简单使用

    redis-test.py

    import redis
    r=redis.Redis(host='127.0.0.1',port=6609,db=0)
    r.set('name','baby')
    print(r.get('name'))
    print(r.dbsize())

    使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。

    默认,每个Redis实例都会维护一个自己的连接池。

    可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个Redis实例共享一个连接池

    使用连接池

     import redis
     pool = redis.ConnectionPool(host='127.0.0.1',port=6609)
     r = redis.Redis(connection_pool=pool)
     r.set('name1','lili')
     print(r.get('name1'))

    应用:页面点击数

      需要对一系列页面记录点击次数,如果使用关系数据库来存储点击,可能存在大量的行级锁争用

      (1)当redis服务器启动时,可以从关系数据库读入点击数的初始值

    import redis
    r=redis.Redis(host='127.0.0.1',port=6609,db=0)
    r.set('visits:100',999)

      (2)有人访问页面时

    r.incr('visits:100')

      (3)获取页面点击数

    r.get('visits:100')

    Pipeline 是 StrictRedis 类的子类,支持在一个请求里发送缓冲的多个命令。通过减少客户端和服务器之间往来的数据包,可以大大提高命令组的性能

    简单使用

    >>>import redis 
    >>>r=redis.Redis(host='127.0.0.1',port=6609,db=0)
    >>> r.set('name', 'baby')
    >>> pipe = r.pipeline()
    >>> pipe.set('birthday', '2010')
    >>> pipe.get('name')
    >>> pipe.execute()

    为了方便使用,所有缓冲到 pipeline 的命令返回 pipeline 对象本身

    调用可以连接起来

    >>> pipe.set('name', 'baby').set('birthday', '2010').get('name').execute()

    pipeline 也可以保证缓冲的命令组做为一个原子操作

    要使用命令缓冲,但禁止pipeline 的原子操作属性,关掉 transaction

    pipe = r.pipeline(transaction=False)

    WATCH 命令提供了在开始事务前监视一个或多个键

    这些键中的任何一个在执行事务前发生改变,整个事务就会被取消并抛出 WatchError 异常

    import redis
    import time
    r=redis.Redis(host='127.0.0.1',port=6609,db=0)
    sellerid = 101
    itemid = 101
    price = 50
    print(time.time())
    def list_item(r,itemid,sellerid,price):
        inventory = "inventory:%s"%sellerid
        item = "%s.%s"%(itemid,sellerid)
        end = time.time()+5
        pipe = r.pipeline()
        while time.time()<end:
            try:
                pipe.watch(inventory)
                if not pipe.sismember(inventory,itemid):
                    pipe.unwatch()
                    return None
                pipe.multi()
                pipe.zadd("market:",item,price)
                pipe.srem(inventory,itemid)
                pipe.execute()
                return True
            except redis.exceptions.WatchError:
                pass
            return False
            
    list_item(r,itemid,sellerid,price)    

    redis只会在数据已经被其他客户端抢先修改了的情况下,通知执行了WATCH命令的客户端,即--乐观锁

    而关系型数据库执行的加锁操作为悲观锁,这种方式下持有锁的客户端运行越慢,等待解锁的客户端被阻塞的时间越长

    事务由命令MULTI命令启动,然后需要传递一个应该在事务中执行的命令列表,然后整个事务由EXEC命令执行

    如果在watch后值被修改,在执行pipe.execute()的时候会报异常WatchError: Watched variable changed

    redis只会在自己的事务执行失败时重试

    流水线:一次性发送多个命令,然后等待所有回复出现。可以通过减少客户端与redis服务器之间的网络通信次数来提升redis在执行多个命令时的性能

  • 相关阅读:
    Oracle设置某张表为只读
    greenplum不能下载问题解决方法(转)
    MyBatis学习-入门
    Oracle-数据泵使用
    oracle锁表
    linux查看文件大小
    Apache日志分割
    nginx日志切割
    zookeeper 事务日志查看
    zookeeper连接 org.apache.curator.framework.imps.CuratorFrameworkImpl Background exception was not retry-able or retry gave up [main-EventThread]
  • 原文地址:https://www.cnblogs.com/baby123/p/7245086.html
Copyright © 2011-2022 走看看