python的redis简单使用详解编程语言

安装的Python版本 3.6.1

redis安装的2.8

安装redis模块

pip install redis

python的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())

python的redis简单使用详解编程语言

使用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在执行多个命令时的性能

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20507.html

(0)
上一篇 2021年7月19日 23:28
下一篇 2021年7月19日 23:28

相关推荐

发表回复

登录后才能评论