Python&Redis

摘要:
Redis是StrictRedis的一个子类。它用于向后使用旧版本的Redis。默认结果为字节。我们可以将decode_Resports=True设置为字符串importRedis#导入Redis模块if__name__=='__main__':#StrictRedisr=Redis.SstrictRedis#Redis#r=Redis.Risr.settest=r。连接池redis-py使用连接池来管理到Rediserver的所有连接,避免了每次建立和释放连接的开销。

一、单机

  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.

免责声明:文章转载自《Python&Redis》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Indy10中IdMappedPortTCP的用法NetworkStream的使用(TcpClient,TcpListener)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis-cluster集群安装(基于redis-3.2.10)

上节主要演示了redis单节点的安装部署,对于数据量更大的服务可以安装redis-cluster进行处理 1. 安装ruby yum install ruby ruby-devel rubygems rpm-build -y rpm -qa|grepruby ruby -v 2.安装redis-cluster gem install redis --v...

面试官:Redis 单线程已经很快,为何 6.0要引入多线程?有啥优势?

作者:Java斗帝之路 链接:https://www.jianshu.com/p/ba2f082ff668 Redis作为一个基于内存的缓存系统,一直以高性能著称,因没有上下文切换以及无锁操作,即使在单线程处理情况下,读速度仍可达到11万次/s,写速度达到8.1万次/s。但是,单线程的设计也给Redis带来一些问题: 只能使用CPU一个核; 如果删除的键...

使用redis时出现java.util.ArrayList cannot be cast to java.lang.Long

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long at redis.clients.jedis.Connection.getIntegerReply(Connection.java:222) at redis.client...

线上redis bgsave导致服务响应延迟

最近一个服务上线一个月后出现某个时间段响应延迟的问题,先看下监控数据: 这里有一点,单台实例的并发最高达到200是因为没修改spring boot中tomcat默认的最大线程数(默认是200)。 从上图可以看出21点—24点以及第二天08点—11点服务的延迟已经达到s级别,甚至严重时已经达到30多s,整个app基本不可用。 问题第一次出现时,整个服务启了...

redis心跳日志【i.l.core.protocol.ConnectionWatchdog : Reconnecting, last destination was】

[io.lettuce.core.protocol.ConnectionWatchdog:106]-- Reconnecting, last destination was 看了很多文章,最后已解决 在配置文件中配置指定包的 日志打印级别为error即: 我们项目用的是springcloud + nacos配置中心 所以在nacos的yml文件中添加对应的...

nginx反向代理后,重定向失败问题

nginx反向代理后,重定向失败问题 location / { proxy_set_header Host 172.18.0.242:90;proxy_pass http://172.18.0.246; } proxy_set_header Host xxxxxx; 主要是改变头部就行了。 找这个找了很久。...