1.Redis 协议 事务 发布订阅 异步连接
2.用 Redis 搞定游戏中的实时排行榜,附源码!
3.Python爬虫之scrapy_redis原理分析并实现断点续爬以及分布式爬虫
Redis 协议 事务 发布订阅 异步连接
redis网络协议
1.1、redis网络
微观上:reactor
宏观上:可以忽略其他流程,只关注数据包处理流程。当管道(连接)构成一个完整的网站空间源码包,处理对应的事件。
1.2、redis协议
redis协议设计
redis采用RESP序列化协议,协议的不同部分使用以CRLF(\r\n)结束。
RESP支持的数据类型,通过第一个字符判断数据类型
RESP在redis请求-响应协议中的作用方式
来看下面例子
在redis-cli,发送一条命令set key value,对应的报文为:
执行成功OK,回应的报文为:
若执行失败,回应的报文为
2、redis pipeline
redis pipeline是redis客户端提供的机制,与redis本身无关,是为了节约网络传输时间而设计的。具体来说,响应式精美列商城发卡源码客户端一次性发送多个请求,redis服务器按序依次回复,与http 1.1类似。
3、redis事务
事务:用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
探讨事务的前提:在并发连接的情况下,不同连接异步执行命令造成的不可预期的冲突。
3.1、事务的特征
3.2、事务命令
redis客户端以MULTI开启一个事务,发送多个命令到服务端的队列,直到发送EXEC命令后redis服务端才会执行队列中的命令,将队列作为一个整体来执行。
实际工作中不会使用,这是扫码共享设备开发源码因为事务命令是由乐观锁实现的,失败需要重试,会增加业务逻辑的复杂程度。
3.3、* lua脚本
redis内置lua解释器来执行lua脚本,通过lua脚本实现原子性。
面试点:lua脚本满足原子性和隔离性,不满足一致性和持久性。
3.3.1、命令
3.3.2、应用
例:执行加倍操作
4、redia发布订阅
为了支持消息的多播机制,redis引入了发布订阅模块,是一种分布式消息队列机制。订阅者通过特定的频道来接收发送者发送至该频道的消息。该机制并不保证消息一定到达,可以采用stream方式确保可达。
存在的问题有:发送者发送一条消息,若没有订阅者,则消息直接丢弃。荣耀全明星直装辅助源码若发送期间,一个订阅者断开连接,那么在断开连接期间消息对于该订阅者来说彻底丢失了。此外,redis停机重启,pubsub的消息是不会持久化的,所有的消息被直接丢弃。
4.1、命令
4.2、应用
发布订阅功能一般要重新开启一个连接,这是因为命令连接严格遵循请求回应模式,pubsub能收到redis主动推送的内容。所以实际项目中如果支持pubsub的话,需要另开一条连接用于处理发布订阅。
5、redis异步连接
hiredis是一个redis的C客户端库函数,服务端可以使用它来访问redis服务器。
5.1、同步连接
同步连接采用阻塞io来实现,自动秒收录源码好不好但是会阻塞当前线程,直至redis返回结果。
参考文档:hiredis的使用
例如:访问redis,并对counter实现自增次,统计用时。
5.2、异步连接
异步连接采用非阻塞io实现,不会阻塞当前线程。缺点是代码书写异步,业务逻辑割裂,可以通过携程解决。在有大量并发请求的情况,配合redis 6.0以后的io多线程,异步连接池,能更好解决应用层的数据访问性能
5.2.1、redis驱动
redis驱动:服务端使用异步连接,需要自己来实现redis驱动,也就是说需要把redis连接融合自己项目中的reactor进行管理。
接着还需要设计redis适配器,其主要功能有:
综上所述,hiredis的封装规则有:
5.2.2、范例
这里对4.1的例子使用异步的方法来实现。
第1步,实现redis驱动
第2步,实现redis适配器,主要是构建redis事件对象和适配hiredis的事件控制接口。
接下来,实现主体代码,实现功能
用 Redis 搞定游戏中的实时排行榜,附源码!
本文将深入探讨如何利用 Redis 实现游戏中的实时排行榜,并提供实现细节和源码。
首先,我们以一个坦克手游为例。游戏中每个角色可拥有多种类型的坦克,玩家可以加入军团(公会)。这个系统需要实现两种主要的排行榜:等级排行榜和通天塔排行榜。
等级排行榜的实现思路是将等级和战斗力合并为一个复合积分。我们可以设定一个公式:分数 = 等级* + 战力。因为玩家等级范围从1到,战斗力范围从0到,所以我们设计时考虑到,等级需要3位数,战斗力需要位数,合计需要位数的积分,而Redis的有序集合(SortedSet)的score取值范围是位整数或双精度浮点数,足以容纳这个需求。
对于通天塔排行榜,我们采用类似但略有不同的策略。要求相同层数下,通关时间越早越排在前。我们可以将通关时间转换为相对于一个较远时间点(如--)的相对时间,计算公式为:分数 = 层数 * ^N + (基准时间 - 通关时间)。这里我们选择一个远到足以避免现实时间影响的时间戳,从而确保排名的公正性。
为了实现实时更新排行榜数据,我们采用一个策略:使用 Redis 的有序集合存储玩家的复合积分(如角色uid和坦克id),而使用哈希存储动态数据(如玩家的其他相关信息)。当玩家等级或战斗力发生改变时,实时更新有序集合中的积分值即可。对于其他可能变化的数据,也相应地更新哈希表中的数据。
在取排行榜时,以等级排行榜为例,我们可以使用 Redis 的命令来获取数据。具体的代码实现通常涉及多步骤操作,例如准备数据、排序、分批取数据等。优化点在于合理使用 Redis 的 Pipeline 和 Multi 模式,以提高性能和效率。
最终,排行榜的实现并不止于此,我们需要考虑的细节还包括对排行榜数据的展示、排序算法的优化等。这里提供了一个基本框架和实现思路,具体的代码和详细步骤需要根据实际项目需求和环境进行调整。
通过以上内容,我们已经对如何利用 Redis 来搭建游戏排行榜系统有了深入的理解。通过合理的数据结构设计和 Redis 命令的运用,可以实现高效、实时且易于维护的排行榜功能。
Python爬虫之scrapy_redis原理分析并实现断点续爬以及分布式爬虫
学习目标:深入理解scrapy_redis在断点续爬和分布式爬虫中的应用,通过实战GitHub demo代码和dmoz文件进行实践。
首先,我们从dmoz爬虫文件入手,它使用crawlspider类型,但settings.py中新增了关键配置。RedisPipeline用于数据处理,RFPDupeFilter实现指纹去重,Scheduler则负责请求调度,以及SCHEDULER_PERSIST的持久化策略。
运行dmoz爬虫时,观察到爬虫在前次基础上继续扩展,证明它是基于增量式url的爬虫。RedisPipeline的process_item方法负责数据存储到Redis,RFPDupeFilter对request对象进行加密,而Scheduler则根据策略决定何时加入请求队列并过滤已抓取记录。
要实现单机断点续爬,可以借鉴网易招聘爬虫的模式,它同样基于增量式url。针对分布式爬虫,我们分析example-project项目中的myspider_redis.py,其中包含分布式爬虫的代码结构。
实战中,如要将Tencent爬虫改造为分布式,需关注启动方式的变化。整体来说,scrapy_redis的精髓在于高效去重、调度和分布式处理,通过这些组件的整合,我们可以灵活地实现断点续爬和分布式爬取。