redis-py

实现Redis Cluster并实现Python链接集群

假装没事ソ 提交于 2020-11-12 10:36:56
[TOC] 一、Redis Cluster简单介绍 Redis集群 搭建的方式有多种,例如Redis主从复制、Sentinel高可用集群等,但从 Redis 3.0 之后版本支持Redis-cluster集群, Redis-Cluster 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。 其Redis-cluster结构图如下: Redis Cluster集群的运行机制: 所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。 节点的Failover是通过集群中超过半数的节点检测失效时才生效。 客户端与Redis节点直连,不需要中间Proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可(默认slave从节点只提供备份)。 Redis-cluster把所有的物理节点映射到[0-16383]Slot上(不一定是平均分配),Cluster 负责维护node<->slot<->value。 Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个槽中。 二、背景 为了保证Redis集群的高可用性,即使使用Sentinel哨兵实现Failover自动切换,Redis每个实例也是全量存储

爬虫数据库存储之关系型与非关系型

柔情痞子 提交于 2020-08-12 07:32:35
对于爬虫来说这些东西都是一些比较基础常识的东西,但为了记录自己的学习之路,所以简略的写下本文。 什么是数据库? 数据库是存放数据的仓库。它的存储空间很大,可以存放大量数据。用户可以对文件中的数据进行新增、查询、更新、删除等操作。 分为关系型数据库、非关系型数据库,如 MySQL、MongoDB、HBase 等,常用的库有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift。 什么是关系型数据库? 关系型数据库是基于关系模型的数据库,而关系模型是通过二维表保存的,所以它的存储方式就是行列组成的表。 每一列是一个字段,每一行是一条记录。表可以看作某个实体的集合,而实体之间存在联系,就需要表与表之间的关联关系来体现。关系型数据可以很好地存储一些关系模型的数据,比如一个老师对应多个学生的数据(“多对多”),一本书对应多个作者(“一对多”),一本书对应一个出版日期(“一对一”) 关系型数据库的优势: 1. 复杂查询 可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。 什么是非关系型数据库? 非关系型数据库主要是基于“非关系模型”的数据库(由于关系型太大,所以一般用“非关系型”来表示其他类型的数据库 关系型数据库的优势: 1. 复杂查询 可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。 2. 事务支持

第75天: Python 操作 Redis 数据库介绍

五迷三道 提交于 2020-07-27 02:08:03
by 極光 Redis 作为常用的 NoSql 数据库,主要用于缓存数据,提高数据读取效率,那在 Python 中应该如果连接和操作 Redis 呢?今天就为大家简单介绍下,在 Python 中操作 Redis 常用命令。 安装 redis 首先还是需要先安装 redis 模块,使用如下命令: $ pip3 install redis 创建 redis 连接池 安装成功后就可以在代码中导入模块,然后通过创建连接池的方式,连接到 Redis 服务器,创建代码如下: import redis #导入redis模块 # 建议使用以下连接池的方式 # 设置decode_responses=True,写入的KV对中的V为string类型,不加则写入的为字节类型。 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, decode_responses=True) rs = redis.Redis(connection_pool=pool) 需要注意的是,设置 decode_responses=True ,写入的 Key/Value 对中的 Value 为 string 类型,不加则写入的为字节类型。 Redis 操作方法 Redis 支持五种类型的数据操作,分别为字符串、 List、 Hash、 Set、 zSet类型

How to insert Billion of data to Redis efficiently?

痞子三分冷 提交于 2020-06-11 03:56:07
问题 I have around 2 billion key-value pairs and I want to load them into Redis efficiently. I am currently using Python and used Pipe as documented by the redis-py. How can I speed the following approach up? import redis def load(pdt_dict): """ Load data into redis. Parameters ---------- pdt_dict : Dict[str, str] To be stored in Redis """ redIs = redis.Redis() pipe = redIs.pipeline() for key in pdt_dict.keys(): pipe.hmset(self.seller + ":" + str(key), pdt_dict[key]) pipe.execute() 回答1: A few

来了解一下Redis的分布式锁

不想你离开。 提交于 2020-04-27 22:37:30
分布式锁本质上要实现的目标就是在 Redis 里面占一个“茅坑”,当别的进程也要来占 时,发现已经有人蹲在那里了,就只好放弃或者稍后再试。 占坑一般是使用 setnx(set if not exists) 指令,只允许被一个客户端占坑。先来先占, 用 完了,再调用 del 指令释放茅坑。 // 这里的冒号:就是一个普通的字符,没特别含义,它可以是任意其它字符,不要误解 > setnx lock :codehole true OK ... do something critical ... > del lock :codehole (integer) 1 但是有个问题,如果逻辑执行到中间出现异常了,可能会导致 del 指令没有被调用,这样 就会陷入死锁,锁永远得不到释放。 于是我们在拿到锁之后,再给锁加上一个过期时间,比如 5s,这样即使中间出现异常也 可以保证 5 秒之后锁会自动释放。 > setnx lock :codehole true OK > expire lock :codehole 5 ... do something critical ... > del lock :codehole (integer) 1 但是以上逻辑还有问题。如果在 setnx 和 expire 之间服务器进程突然挂掉了,可能是因 为机器掉电或者是被人为杀掉的,就会导致 expire 得不到执行

python处理Redis的基本操作

我与影子孤独终老i 提交于 2020-02-26 07:04:07
安装 docker run -d -p 6379:6379 redis 操作 连接 redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。 def save_to_redis(key, value): r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, decode_responses=True) return r.set(key, value, ex=REDIS_EXPIRE_TIME) 2. 连接池 redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。 def save_to_redis(key, value): r = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, decode_responses=True,

Fail-safe message broadcasting to be consumed by a specific recipient using redis and python

耗尽温柔 提交于 2020-02-25 04:02:50
问题 So redis 5.0 freshly introduced a new feature called Streams. They seem to be perfect for distributing messages for inter process communication: they surpass the abilities of PUB/SUB event messaging in terms of reliability: PUB/SUB is fire-and-forget an there's no guarantee a recipient will receive the message redis lists are somewhat low-level but could still be used. However, streams are optimized for performance and exactly the use case described above. However, since this feature is quite

Fail-safe message broadcasting to be consumed by a specific recipient using redis and python

隐身守侯 提交于 2020-02-25 04:02:38
问题 So redis 5.0 freshly introduced a new feature called Streams. They seem to be perfect for distributing messages for inter process communication: they surpass the abilities of PUB/SUB event messaging in terms of reliability: PUB/SUB is fire-and-forget an there's no guarantee a recipient will receive the message redis lists are somewhat low-level but could still be used. However, streams are optimized for performance and exactly the use case described above. However, since this feature is quite