高效异步redis客户端aredis优劣势原理解析
背景
aredis 是一款由同步的 redis 客户端 redis-py 改写而成的高效的异步 redis 客户端,在最新的 1.0.7 版本中完成了对于 redis 集群的支持。
改动
主要重写了底部建立连接和读取数据部分的代码,接口部分都向下兼容,便于使用者从 redis-py 的同步代码迁移到 async 和 await 的协程版本,详细文档请看 aredis 文档
使用
安装 pip install aredis
具体姿势可以参阅项目文档和例子,接口向下兼容 redis-py,支持 Python 3.5 及以上版本,在最新的 1.0.7 版本中也支持 redis cluster,并且对于 Python 3.6 还支持各个数据类型的 scan iter 操作。
一个简单的例子如下所示:
>>> import aredis
>>> import asyncio
>>> r = aredis.StrictRedis(host='localhost', port=6379, db=0)
>>> loop = asyncio.get_event_loop()
>>> async def test():
>>> await r.set('foo', 'bar')
>>> print(await r.get('foo'))
>>> loop.run_until_complete(test())
b'bar'
优势
使用了协程的异步客户端相较于同步客户端来说由于使用了 Python 的事件循环等多余代码,实际上运行效率是较低的,但是好处在于它不会阻塞你的 io,你可以在网络 io 进行的同时进行别的操作,aredis 比较适用于爬虫、http 服务器等密集网络 io 的操作,使得你的代码不用等上 redis 操作的时间。
而相比于现有的两款支持 async/await 的 redis 客户端来说:
aioredis:
aioredis 要求装上 hiredis , 而 aredis 可以不需要相关依赖地运行,速度上两者持平且都可以使用 hiredis 来作为 parser ,用 uvloop 代替 asyncio 的 eventloop 来加速
asyncio_redis:
asyncio_redis 使用了 Python 提供的 protocol 来进行异步通信,而 aredis 则使用 StreamReader 和 StreamWriter 来进行异步通信,在运行速度上两倍于 asyncio_redis ,附上 benchmark
而且以上两款客户端目前都还没有对于集群的支持,相对来说 aredis 的功能更为全面一些。
劣势
现在对于编码的支持还不是那么完善,大部分命令还是用 bytes 类型作为返回值,且目前只支持 Python 3.5 及以上的版本
前排求 star 和 pr 0- 0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
详解java 客户端链接不上redis解决方案
出现问题描述: 1.Could not get a resource from the pool, Connection refused: connect windows Java这边客户端链接被拒接了,想想问题 1.Vmware里面的Linux所安装的Redis已经正常启动 2.在windows用ssh客户端链接linux可以操作redis 3.linux防火墙已经关闭 4.拼linux的ip也能拼通 按理说应该没问题,下利用telnet测试下端口 telnet 192.168.0.104 6
-
Java客户端利用Jedis操作redis缓存示例代码
前言 Redis是一个开源的Key-Value数据缓存,和Memcached类似.Redis多种类型的value,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型). Jedis 是 Redis 官方首选的 Java 客户端开发包.下面就来给大家详细关于Java客户端利用Jedis操作redis缓存的相关内容,话不多说,直接来看示例代码吧. 示例代码: //连接redis ,redis的默认端口是6379 Jedis
-
Redis的Python客户端redis-py安装使用说明文档
1.安装 redis-py是Redis key-value 数据库的 Python 接口,安装如下,后面我们会讲hiredis这个库 复制代码 代码如下: $ sudo pip install redis $ sudo pip install hiredis 2.入门 复制代码 代码如下: >>> import redis >>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0) >>
-
PHP Swoole异步Redis客户端实现方法示例
本文实例讲述了PHP Swoole异步Redis客户端实现方法.分享给大家供大家参考,具体如下: 使用版本:1.8.0及以上 使用条件: 1.开启async-redis php --ri swoole (如果没有开启,重新编译安装Swoole时加入 --enable-async-redis 相关文章:Linux下源码包安装Swoole及基本使用) 2.安装hiredis: CentOS yum install libhiredis-devel Ubuntu: apt install libhi
-
java客户端Jedis操作Redis Sentinel 连接池的实现方法
pom.xml配置 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.0.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients<
-
Spring Boot Redis客户端远程操作实现过程解析
在Spring Boot 1.x中默认是Jedis作为客户端,但是在Spring Boot2.x后,默认就是Lettuce Redis的远程连接,默认是不支持的,需要手动开启 修改config文件: 注释掉bind:127.0.0.1 开启密码校验,去掉requireprass的注释 使用jedis客户端: jedis的GitHub地址:https://github.com/xetorthio/jedis 如何远程连接: //构造一个jedis对象 Jedis jedis=new Jedis("
-
简单了解redis常见客户端及Sharding机制原理
1.redis的几种常见客户端: Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持; Redisson:实现了分布式和可扩展的Java数据结构. Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器. 1)优点: Jedis:比较全面的提供了Redis的操作特性 Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列 Le
-
高效异步redis客户端aredis优劣势原理解析
背景 aredis 是一款由同步的 redis 客户端 redis-py 改写而成的高效的异步 redis 客户端,在最新的 1.0.7 版本中完成了对于 redis 集群的支持. 改动 主要重写了底部建立连接和读取数据部分的代码,接口部分都向下兼容,便于使用者从 redis-py 的同步代码迁移到 async 和 await 的协程版本,详细文档请看 aredis 文档 使用 安装 pip install aredis 具体姿势可以参阅项目文档和例子,接口向下兼容 redis-py,支持 Py
-
php redis setnx分布式锁简单原理解析
我就废话不多说了,大家还是直接看代码吧~ <?php //高并发分布式锁 header("Content-type:text/html;charset=utf-8"); $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Connection to server sucessfully"; //echo $redis->get("name");exit;
-
使用Redis实现令牌桶算法原理解析
在限流算法中有一种令牌桶算法,该算法可以应对短暂的突发流量,这对于现实环境中流量不怎么均匀的情况特别有用,不会频繁的触发限流,对调用方比较友好. 例如,当前限制10qps,大多数情况下不会超过此数量,但偶尔会达到30qps,然后很快就会恢复正常,假设这种突发流量不会对系统稳定性产生影响,我们可以在一定程度上允许这种瞬时突发流量,从而为用户带来更好的可用性体验.这就是使用令牌桶算法的地方. 令牌桶算法原理 如下图所示,该算法的基本原理是:有一个容量为X的令牌桶,每Y单位时间内将Z个令牌放入该桶.如
-
Redis数据结构SortedSet的底层原理解析
目录 概述 一些常用命令 实现 跳跃表 跳表的插入 压缩列表 概述 一些常用命令 存储:zadd key score value 获取:zrange key start end 获取:同时获取分数:zrange key start end with score 删除:zrem key value 存储的时候我们可以发现,是有一个score(分数)的,这个就是用来排序的字段. 实现 先说结论,SortedSet底层,根据配置会在不同的时候选用两种不同的数据结构zset,或ziplist进行存储:
-
Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端
本文的完整代码在github.com/hdt3213/godis/redis/client 通常 TCP 客户端的通信模式都是阻塞式的: 客户端发送请求 -> 等待服务端响应 -> 发送下一个请求.因为需要等待网络传输数据,完成一次请求循环需要等待较多时间. 我们能否不等待服务端响应直接发送下一条请求呢?答案是肯定的. TCP 作为全双工协议可以同时进行上行和下行通信,不必担心客户端和服务端同时发包会导致冲突. p.s. 打电话的时候两个人同时讲话就会冲突听不清,只能轮流讲.这种通信方式称为半
-
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
目录 Redis如何保证高效的查询效率 为什么Redis比较快 Redis中的数据结构 1.简单动态字符串 2.链表 3.字典 4.跳表 5.整数数组 6.压缩列表 为什么单线程还能很快 基于多路复用的高性能I/O模型 单线程处理IO请求性能瓶颈 总结 参考 Redis 如何保证高效的查询效率 为什么 Redis 比较快 Redis 中的查询速度为什么那么快呢? 1.因为它是内存数据库: 2.归功于它的数据结构: 3.Redis 中是单线程: 4.Redis 中使用了多路复用. Redis 中的
-
异步redis队列实现 数据入库的方法
业务需求 app客户端向服务端接口发送来json 数据 每天 发一次 清空缓存后会再次发送 出问题之前业务逻辑: php 接口 首先将 json 转为数组 去重 在一张大表中插入不存在的数据 该用户已经存在 和新增的id 入另一种详情表 问题所在: 当用户因特殊情况清除缓存 导致app 发送json串 入库并发高 导致CPU 暴增到88% 并且居高不下 优化思路: 1.异步队列处理 2.redis 过滤(就是只处理当天第一次请求) 3.redis 辅助存储app名称(验证过后批量插入数据app名
随机推荐
- springboot 文件上传大小配置的方法
- iOS中WKWebView白屏问题的分析与解决
- dvbbs 8.2 SQL Injection注射漏洞分析
- Python AES加密模块用法分析
- C# Quoted-Printable编码、解码
- 使用JavaScript实现链表的数据结构的代码
- asp.net(c#)下各种进制间的轻松转换(2进制、8进制、10进制、16进制)
- 在PHP中检查PHP文件是否有语法错误的方法
- Python实现检测代理IP是否可以翻墙
- MySQL中distinct语句的基本原理及其与group by的比较
- JavaScript多线程详解
- Java Socket编程实例(二)- UDP基本使用
- JavaScript和JQuery获取DIV值的方法示例
- SQL2008中SQL应用之-锁定(locking) 应用分析
- php正则表达式学习笔记
- Nginx中IF语句实现数学比较功能
- Php output buffering缓存及程序缓存深入解析
- 一些C语言中字符串的算法问题解决实例小结
- 使用 Node.js 实现图片的动态裁切及算法实例代码详解
- layer.open的自适应及居中及子页面标题的修改方法