zoukankan      html  css  js  c++  java
  • Redis的基本操作

    Redis的基本操作

    redis普通连接与连接池

    # 安装redis模块
    pip install redis
    
    # 普通连接
    from redis import Redis
    # 创建连接对象
    conn = Redis(host='localhost', port=6379)
    ret = conn.get('name')
    

    python操作之连接池

    # redis使用connection pool来管理对一个redis Server的所有连接,以避免每次建立,释放连接的开销。
    
    import redis
    
    POOL = redis.ConnectionPool(host='127.0.0.1',port=6379)
    ret = redis.Redis(connection_pool=POOL)
    ret.set('name','cherry')
    print(ret.get('name'))
    
    # 单例的实现
    # redis_pool.py
    
    import redis
    
    POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=100) # z造一个池子,最多创建100个连接
    ret = redis.Redis(connection_pool=POOL)  # 从连接池中取出一个连接
    

    单例实现方式(模块导入)

    redis_pool.py

    import redis
    
    POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=100) # z造一个池子,最多创建100个连接
    

    这样就可以避免每执行一次,就创建一个连接池

    # 使用方式(包导入)
    from redis_pool import POOL
    import redis
    
    ret = redis.Redis(connection_pool=POOL)  # 从连接池取出一个连接
    

     注意

    如果是运行包内的文件,在该文件导入包内的文件时,注意不能用‘.’;
    在外部使用可以带点
    

    redis之字符串的操作

    重点掌握

    set操作
    def set(self, name, value,ex=None, px=None, nx=False, xx=False, keepttl=False):
        
    ex: 过期时间( 秒)
    px: 过期时间(毫秒)
    nx: 如果设置为True, 当name不存在的时候,set操作才会执行;如果存在,则不会执行。(新增操作)
    xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值。(更新操作)
    

    exp:

    conn.set('perfect','surpass',ex=5)   # 设置过期时间5秒
    conn.set('sex','Female',nx=True)   # key不存在创建,存在不做任何操作
    conn.set('name','cherry1',xx=True) # key存在才更新新值,不存在不做任何操作
    
    get操作
    # 获取值
    name = conn.get('name')
    
    mset操作
    # 批量设置值
    mset(self, mapping)
    conn.mset({'name1':'egon','name2':'lqz'})
    
    mget操作
    # 批量获取值
    mget(self, keys, *args):
    
    ret = conn.mget(['name1','name2','name3'])  # [b'egon', b'lqz', None]
    
    incr操作
    # 应用场景,统计某网站的访问数量,页面的访问量,接口的访问量
    ret = conn.incr('num',amount=1)  # 只要一执行,数字就加1
    
    decr操作
    # 应用场景,设计秒杀
    ret = conn.decr('num',amount=1) 
     等于
    ret = conn.incr('num',amount=1)
    

    了解

    setnx(name,value)  ==>  set(name,value,nx=True)
    setex(name,value,time) ==> set(name,value,ex=5)
    psetx(name,time_ms,value)  # 毫秒
    
    # 先获取值在设置值,将两次IO操作变为1次
    ret = conn.getset('name1','egon_dsb')  # ret  是获取到的值
    
    # 根据key截取字符串
    ret = conn.getrange('name1',0,0)  #  b'e'
    
    # 修改字符串内容,从指定字符串索引开始向后替换
     ret = conn.setrange('name1',2,'8888') # 从第三个位置开始替换后面的字符串
    
    # 获取name对应的值的二进制表示中的某位的值 (0或1)
    ret = conn.getbit('name1',9)   # 1
    
    # append
    在redis name对应的值后面追加内容
    ret = conn.append('num','oo')
    

    redis之hash操作

    重点掌握

    hset操作
    hset(self, name, key=None, value=None, mapping=None)
    
    ret = conn.hset('beast','name','huangliang')
    ret = conn.hset('beast','name','lqz')   # 直接覆盖
    
    hget操作
    hget(self, name, key)
    
    ret = conn.hget('beast','name2')  # b'lqz'
    
    hmget操作
    # 支持传多个key ,或者传一个keys的列表
    def hmget(self, name, keys, *args):
        "Returns a list of values ordered identically to ``keys``"
        args = list_or_args(keys, args)
        return self.execute_command('HMGET', name, *args)
    
    
    ret = conn.hmget('beast','name','name2')
    ret = conn.hmget('beast',['name','name2'])
    
    hmset操作
    # 批量设置多个值
    conn.mset({'name1':'egon','name2':'lqz'})
    
    hincrby操作
    # 应用场景 个人博客文章的访问量
    conn.hmset('blog':{'第一篇博客':'55','第二篇博客':'66'})
    
    ret = conn.hincrby('blog','第一篇博客')  # 点击一次,自增一次
    
    hscan_iter操作
    # 利用yield封装hscan创建生成器,实现分批去redis中获取数据
     
    # 参数:
        # match,匹配指定key,默认None 表示所有的key
        # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
    
    ret = conn.hscan_iter('hash3')
    print(ret)
    for i in ret:
        print(i)
    

    了解

    # 获取name对应的hash中所有的key的值
    ret = conn.hkeys('hash3')
    # 获取name对应的hash中所有的value的值
    ret = conn.hvals('hash3')
    # 检查name对应的hash是否存在当前传入的key
    ret = conn.hexists('hash3','key4')  #  存在作为True,不存在则为False
    # 将name对应的hash中指定key的键值对删除
    ret = conn.hdel('hash3','key2')  # 
    # 获取name对应的hash中键值对的个数
     ret=conn.hlen('hash3')
    

    redis之list操作

    重点掌握

    lpush操作
    # 在name对应的List中添加元素,每个新元素都添加到列表的最左边 
    ret = conn.lpush('list1',1,2,3,4,5)
    """
    实现队列
    先进先出
    """
    
    rpush操作
    # 在name对应的List中添加元素,每个新元素都添加到列表的最右边 
    ret = conn.rpush('list1',777,888)
    """
    实现堆栈
    后进先出
    """
    
    blpop操作
    消息队列(生产者消费者模型)
    # block,阻塞操作,可以写一个超时时间
    # 应用场景:分布式爬虫
    
    ret=conn.blpop('list1',timeout=10)
    print(ret)
    

    其他

    # lpushx(name,value) 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
    lpushx('list1',888)
    # rpushx(name,value) 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边
    rpushx('list1',999)
    # llen(name)  统计一下name对应list的总长度
    ret = conn.llen('list1')
    
    # 在name对应的列表的某一个值前或后插入一个新值
    ret = conn.linsert('list1','before','3','88887') # 在‘3’前面插入一条数据
    ret = conn.linsert('list1','after','3','18887')  # 在‘3’后面插入一条数据
    
    #  对name对应的list中的某一个索引位置重新赋值
    ret = conn.lset('list1','0','1111')
    
    # 在name对应的list中删除指定的值
    def lrem(self, name, count, value):
        """
        The count argument influences the operation in the following ways:
            count > 0: Remove elements equal to value moving from head to tail.
            count < 0: Remove elements equal to value moving from tail to head.
            count = 0: Remove all elements equal to value.
        """
        return self.execute_command('LREM', name, count, value)
    ret=conn.lrem('list1',2,'5')   # 从前往后删除两个5  (+ 从前往后)
    ret=conn.lrem('list1',-1,'5')  # 从后往前删除1个5   (- 从后往前)
    ret=conn.lrem('list1',0,'5')   # 删除所有5  (0-all)
    
    # 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
    ret = conn.lpop('list1')
    
    # 在name对应的列表的右侧获取第一个元素并在列表中移除,返回值则是第一个元素
    ret = conn.rpop('list1')
    
    # 在name对应的列表中根据索引获取列表元素
    ret = conn.lindex('list1','0')   #取出索引为0的位置的值
    
    # 对name对应的list进行切片取值
    ret = conn.lrange('list1','0','2')  #[b'4', b'88887', b'3']
    
    # 在name对应的列表中移除没有在start-end索引之间的值
    ret = conn.ltrim('list1','0','2')
    

    自定义增量迭代

    # yield的应用场景
    
    # 自定制分批取列表的数据
    # conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])
    # conn.flushall()
    def scan_list(name,count=2):
        index=0
        while True:
            data_list=conn.lrange(name,index,count+index-1)
            if not data_list:
                return
            index+=count
            for item in data_list:
                yield item
    

    Redis之管道

    # 在redis中使用管道来实现事务
    事务的一致性:要么都成功,要么都失败
     
    import redis
    from xxx import POOL
    
    conn = redis.Redis(connection_pool=POOL)
    # pipe = r.pipeline(transaction=False)
    pipe = r.pipeline(transaction=True)  #开启事务
    pipe.multi()
    pipe.set('name', 'alex')
    pipe.set('role', 'sb')
     
    pipe.execute()
    

    单例模式封装

    import redis
    POOL = redis.ConnectionPool(host='10.211.55.4', port=6379)
    

    Redis的其它使用

    # 删除操作
    conn.delete('list1')
    ret=conn.delete('hash1')
    
    # 判断name是否存在
    ret=conn.exists('hash2')
    
    #根据模型获取redis的name
    ret=conn.keys('cache*')  #查询以cache开头的所有key
    
    #为某个redis的某个name设置超时时间
    ret=conn.expire('hash2',2)
    
    # 获取name对应值的类型
    ret=conn.type('name3')
    ret=conn.type('test')
    ret=conn.type('test')
    
  • 相关阅读:
    用Python实现的数据结构与算法:双端队列
    用Python实现的数据结构与算法:队列
    用Python实现的数据结构与算法:堆栈
    用Python实现的数据结构与算法:开篇
    用Markdown写博客
    一个简单的web.py论坛
    在OpenShift上托管web.py应用
    SQLite中的自增关键字:AUTO_INCREMENT、INTEGER PRIMARY KEY与AUTOINCREMENT
    【读书笔记】《HTTP权威指南》:Web Hosting
    【读书笔记】《HTTP权威指南》:Web Robots
  • 原文地址:https://www.cnblogs.com/surpass123/p/13375591.html
Copyright © 2011-2022 走看看