1.基于Redis实现点赞及排行榜功能
2.用 Redis 排排序搞定游戏中的实时排行榜,附源码!序源
3.redis源码阅读--跳表解析
4.redis实现排行榜
5.Redis 实现实现高效有序集合(zset):跳表源码分析
6.Redis 哨兵模式 - 源码梳理
基于Redis实现点赞及排行榜功能
1.1、点赞相关需求:
1、排排序同一个用户只能点赞一次,序源再次点击则取消点赞(点赞/取消点赞);
2、实现美容会所溯源码燕窝怎么买如果当前用户已经点赞,排排序则点赞按钮高亮显示(前端实现,序源判断字段Blog类的实现isLik属性)。
1.2、排排序实现步骤:
1、序源给Blog类中添加一个isLike字段,实现标识是排排序否被当前用户点赞;
2、修改点赞功能,序源利用Redis的实现set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1;
3、修改根据id查询Blog的业务,判断当前登录用户是否点赞过,赋值给isLike字;
4、修改分页查询Blog业务,判断当前登录用户是否点赞过,赋值给isLike字段。
1.3、点赞实现思路:
1.4、排行榜实现:
分析:由于需要对点赞功能进行排行榜分析,按照点赞时间先后排序,返回最早点赞的Top5的用户,所以最好是选择SortedSet实现功能。(特别说明:代码获取方式在文章结尾)
涉及到表信息:
2.1、zadd
案例:
2.2、zscore
案例:
2.3、django考试源码zrem
案例:
2.4、zrange
案例:获取前四个元素
3.1、点赞/取消点赞功能
核心代码实现:
控制层:
接口调用:
结果展示:
3.2、排行榜功能
核心代码实现:
控制层:
接口调用及展示:
四、源码获取方式
更多优秀文章,请关注个人微信公众号或搜索“程序猿小杨”查阅。然后回复:源码,可以获取该项目对应的源码及表结构,开箱即可使用。
说明:后面redis相关操作的功能都会放在此文件夹中,需要相关功能的,只需要获取最新的资源即可。
用 Redis 搞定游戏中的实时排行榜,附源码!
使用 Redis 实现游戏实时排行榜的步骤如下:
1. 分类:按排行主体类型分为等级、战力和通天塔、通关时间等排行榜。
2. 思路:基于实时性考虑,决定使用 Redis 实现排行榜。使用 Redis 的有序集合(SortedSet)来实现排行榜,通过 Redis 命令 ZADD 来添加成员-积分。默认情况下,若积分相同,按照成员字典顺序排序。
3. 实现复合排序:等级排行榜中,分数定义为等级* + 战力,考虑到数值范围和 Redis 的表示能力,设计分数足以覆盖需求。通天塔排行榜中,为满足通过层数相同,通关时间较早的untime源码编译优先要求,将通关时间转换为相对时间,定义分数为层数*^N + (基准时间 - 通关时间)。
4. 排名数据动态更新:对于等级排行榜,使用有序集合存储角色 UID 和复合积分,使用哈希存储动态数据。玩家等级和战斗力变化时,实时更新有序集合中的复合积分,同时更新动态数据。
5. 取排行榜:以等级排行榜为例,通过 Redis 命令获取排行榜数据。优化步骤包括分析和解决潜在问题,采用 Pipeline 或 Multi 模式提升效率。
实现过程中,关注技术细节和代码优化,确保排行榜功能稳定高效。参考相关资源获取更深入的实现和优化技巧。代码示例以 PHP 语言实现,展示了排行榜最基础的实现方式。
redis源码阅读--跳表解析
跳表是 Redis 中实现 zset 和 set 功能的关键数据结构。通过在链表基础上构建多级索引,跳表有效提升了查找效率,且其实现相较于红黑树更为简洁,无需大量精力来维持树的平衡。跳表节点具有顺序排列的特性,支持范围查询。
跳表的构成包括头结点、尾节点、长度以及索引层数。每一个节点包含数据 robj、分数 score 用于排序、上一节点指针 prev 用于反向遍历,诱支付源码以及多层索引信息 levels。各层索引 skiplistlevel 包括该层索引中节点指向的下一个节点指针 next 和间隔 span。节点的索引层数通过随机数生成,设计思路为使用第 n 级索引是使用第 n-1 级索引概率的 1/4,最多使用 级索引。使用如此设计可确保即便用到最高层级,所持数据量也足够大,无需担心索引不足。
跳表按照 score 和 robj 的大小进行排序,因此节点有序,支持范围查找。插入节点时,首先找到新节点可以插入的位置,即比新节点小的最大节点。此过程从最高层索引开始,使用 update 数组记录各层索引中节点的前一节点位置,以及 rank 数组记录 update 节点到 header 的间隔 span。新节点插入后,更新 prev 指针、tail 指针、跳表长度等信息。
删除节点同样遵循类似的逻辑,先查找节点的前一个节点,然后删除目标节点。在删除过程中,需要检查节点的下一节点是否为待删除数据,并调整节点连接和更新跳表的 level 值。当某层索引中节点的 next 指针变为 nil 时,该层索引已无用,可将 level 减一。最后,java源码收银更新跳表长度。
虽然跳表概念看似复杂,但通过理解其多级索引机制,其余操作如范围查询、排名查询等将变得相对简单。在实际应用中,可通过阅读 Redis 源码中的 t_zset.c 和 redis.h 文件,了解跳表的具体实现。然而,更难的是将这些抽象概念转化为清晰、易于理解的文档,绘制图表对于深入理解跳表的逻辑非常有帮助。
redis实现排行榜
实现一个排版榜,我们通常想到的就是mysql的order by 简单粗暴就撸出来了。但是这样真的优雅吗?数据库是系统的瓶颈,这是众所周知的。如果给你一张百万的表,让你排序做排行榜,花费的时间是十分可怕的。
不如缓存吧,order by的时候强制使用索引。但是这样真的优雅吗?
幸运的是,Redis可以提供更优雅的解决方案。Redis的ZSet是一种可以保留元素唯一性和有序性的数据结构,按分数从小到大排序。作为一名优秀的crud程序员,我们可以从以下几个方面了解和使用zset。
首先,ZADD命令用于增加或修改元素。其时间复杂度为 O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量。如果key不存在就插入,存在就更新。
使用示例如下,page_rankde 是key,是分数, google.com是value。
其次,ZRANK命令用于查询元素的排名。时间复杂度为O(log(N))。
使用示例如下,salary的key,tom是value,只要输入特定的key与value就能查询到对应的排名。
再者,del命令用于直接删除元素。
实现排行榜的关键在于如何设计分数。如果排行榜的设计按一个维度比如金币数量,只需把其数量取反作为分数即可。取反是因为zset默认从小到大排序。
如果排行榜的设计按两个维度比如金币数量和用时,可以将用时作为小数,用一天的总毫秒数减去花费毫秒数作为小数部分,然后当做字符串拼接起来,然后取反作为score。具体实现如下。
最后,代码实现源码可以通过GitHub查找,例如:github.com/blackdogss/H...
Redis 实现高效有序集合(zset):跳表源码分析
跳表(Skip List)是一种基于随机化的高效数据结构,旨在加速查找操作。它通过多层索引来实现快速搜索,与平衡树相比,插入、删除和查找操作的平均时间复杂度均为O(log n),构建更为简便。跳表结构类似链表,每个节点不仅存储元素值,还包含指向对应层次的下一个节点的指针,实现跳跃式访问。每一层的链表是下一层的子集,形成多级结构,优化搜索路径,同时保持高效性和简洁性。跳表支持范围查询、插入、删除、查找、合并等高级操作,适用于搜索引擎、缓存、排序等场景。
在Redis中,有序集合(Sorted Set)正是基于跳表实现的。每个有序集合包含一个跳表,每个节点存储元素的成员值和score值,以及指向其他节点的指针。元素按照score值从小到大排序,使得跳表中节点同样按照此规则排序。跳表通过随机生成多级索引来支持有序集合的高效操作,例如范围查询、排名和集合操作等。Redis选择跳表而非平衡树,是基于其在性能与内存使用之间的良好平衡。
跳表在Redis的实现涉及多个方面,从结构定义到操作实现。数据结构定义在`server.h`文件中,具体操作实现在`t_zset.c`文件中。节点创建与释放关注于指定key、score和节点的层次(层高)。跳表初始化涉及分配内存并创建头节点,并进行相关初始化。插入、删除和更新节点涉及节点间复杂但高效的指针操作。查找节点、获取排名和查询score范围则通过逐层比较关键值与节点值来实现。整体结构与操作设计旨在提供高效、灵活的有序集合支持,满足Redis应用中对数据排序和检索需求的高性能要求。
Redis 哨兵模式 - 源码梳理
本文以Redis 7.0.版本为基准,如有不妥之处,敬请指正。
哨兵模式的代码流程逻辑如下:哨兵节点每秒(主从切换时为1秒)向已知的主节点和从节点发送info命令。接收到主节点的info回复后,解析其中的slave字段信息,进而创建相应的从节点instance。收到从节点的info回复后,解析其中的slave_master_host、slave_master_port、slave_master_link_status、slave_priority、slave_repl_offset、replica_announced等信息(步骤2和sentinelInfoReplyCallback)。
在sentinel.masters的初始数据中,来自于sentinel.conf中的monitor,利用info命令探测主节点及其所属的从节点。通过订阅__sentinel__:hello频道,获取其他哨兵节点的信息。其中,link->act_ping_time表示最早一次未收到回复的ping请求发送时间,收到回复后其会被重置为0。因此,其不为0时,表示有未收到回复的ping请求。link->last_avail_time表示最近一次收到对ping有效回复的时间,link->last_pong_time表示最近一次收到对ping回复(有效和无效)的时间,link->pc_last_activity表示最近一次收到publish的消息,ri->role_reported_time表示最近一次收到info且回复中role相比于上次发生改变的时间。
Raft一致性算法
thesecretlivesofdata.com...
Redis radix tree 源码解析
Redis 实现了不定长压缩前缀的 radix tree,用于集群模式下存储 slot 对应的所有 key 信息。本文解析在 Redis 中实现 radix tree 的核心内容。
核心数据结构的定义如下:
每个节点结构体 (raxNode) 包含了指向子节点的指针、当前节点的 key 的长度、以及是否为叶子节点的标记。
以下是插入流程示例:
场景一:仅插入 "abcd"。此节点为叶子节点,使用压缩前缀。
场景二:在 "abcd" 之后插入 "abcdef"。从 "abcd" 的父节点遍历至压缩前缀,找到 "abcd" 空子节点,插入 "ef" 并标记为叶子节点。
场景三:在 "abcd" 之后插入 "ab"。ab 为 "abcd" 的前缀,插入 "ab" 为子节点,并标记为叶子节点。同时保留 "abcd" 的前缀结构。
场景四:在 "abcd" 之后插入 "abABC"。ab 为前缀,创建 "ab" 和 "ABC" 分别为子节点,保持压缩前缀结构。
删除流程则相对简单,找到指定 key 的叶子节点后,向上遍历并删除非叶子节点。若删除后父节点非压缩且大小大于1,则需处理合并问题,以优化树的高度。
合并的条件涉及:删除节点后,检查父节点是否仍为非压缩节点且包含多个子节点,以此决定是否进行合并操作。
结束语:云数据库 Redis 版提供了稳定可靠、性能卓越、可弹性伸缩的数据库服务,基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版高可用架构。提供全面的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案,欢迎使用。
2024-11-28 16:10
2024-11-28 15:59
2024-11-28 15:32
2024-11-28 14:59
2024-11-28 14:03
2024-11-28 13:56