Python&Redis

一、单机

  1、安装redis模块

sudo pip3 install redis
或
sudo easy_install redis

     源码地址:https://github.com/WoLpH/redis-py  、https://github.com/redis/redis-py

  2、单机连接

    redis模块提供两个类Redis和StrictRedis用于实现大部分官方的命令。

    Redis是StrictRedis的子类,用于向后兼用旧版本

    redis取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串

import redis # 导入redis模块

if __name__ == '__main__':
    # StrictRedis
    r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)
    # Redis
    # r = redis.Redis(host='localhost', port=6379, decode_responses=True)
    r.set('name', 'yangyongjie')
    test = r.get('name')
    print(test)

 

  3、连接池

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

    默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池

import redis    # 导入redis 模块

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)  
r.set('name', 'runoob')  # 设置 name 对应的值
print(r.get('name'))  # 取出键 name 对应的值

 

  4、基本命令

    1)String

      ①:set

      set(name, value, ex=None, px=None, nx=False, xx=False)

      在 Redis 中设置值,默认,不存在则创建,存在则修改

      参数:

        ex - 过期时间(秒)

        px - 过期时间(毫秒)

        nx - 如果设置为True,则只有name不存在时,当前set操作才执行

        xx - 如果设置为True,则只有name存在时,当前set操作才执行

 

      ②:setnx

        setnx(name,value) :设置值,只有name不存在时,执行设置操作(添加)

      ③:setex(name, time, value):设置值并设置过期时间,单位秒

      ④:mset(*args, **kwargs):批量设置值

      ⑤:mget(keys, *args):批量获取

      

    2)hash

      ①:hset(name, key, value)

      name对应的hash中设置一个键值对(不存在,则创建;否则,修改)

       参数:

        name - redis的name

        key - name对应的hash中的key

        value - name对应的hash中的value

      ②:hmset(name, mapping)

        在name对应的hash中批量设置键值对

        参数:

          在name对应的hash中批量设置键值对

          mapping - 字典,如:{'k1':'v1', 'k2': 'v2'}

      ③:hgetall(name)

        取出所有的键值对

 

  5、管道(pipeline)

    redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作

    如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作

    管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类。它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能  

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

# pipe = r.pipeline(transaction=False)    # 默认的情况下,管道里执行的命令可以保证执行的原子性,执行pipe = r.pipeline(transaction=False)可以禁用这一特性。
# pipe = r.pipeline(transaction=True)
pipe = r.pipeline() # 创建一个管道

pipe.set('name', 'jack')
pipe.sadd('faz', 'baz')
pipe.incr('num')    # 如果num不存在则vaule为1,如果存在,则value自增1
pipe.execute()
# 管道的命令可以写在一起
# pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()

 

 

二、集群

  python的redis库是不支持集群操作的,推荐库:redis-py-cluster

  文档地址:https://redis-py-cluster.readthedocs.io/en/master/

   1、安装 

  pip install redis-py-cluster

   2、连接

from rediscluster import RedisCluster


def redis_cluster():
    redis_nodes = [{'host': '127.0.0.1', 'port': 6379},
                   {'host': '127.0.0.1', 'port': 6379},
                   {'host': '127.0.0.1', 'port': 6379}
                   ]
    redis_connect = None
    try:
        redis_connect = RedisCluster(startup_nodes=redis_nodes, password='cluster_password', decode_responses=True)
    except Exception as e:
        print(e)
    return redis_connect


if __name__ == '__main__':
    redis = redis_cluster()
    redis.set('name', 'yangyongjie')
    print(redis.get('name'))

 

 

END.

posted @ 2021-12-09 09:53  杨岂  阅读(66)  评论(0编辑  收藏  举报