基于Redis实现点赞及排行榜功能
微信公众号访问地址: 基于Redis实现点赞及排行榜功能
推荐文章:
1、榜源 springBoot对接kafka,排行排行批量、并发、源码异步获取消息,榜源php医院源码并动态、批量插入库表;
2、排行排行 SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据;
3、源码 为什么引入Redisson分布式锁?
4、榜源 Redisson可重入锁原理
5、排行排行 SpringBoot整合多数据源,源码并支持动态新增与切换(详细教程)
一、榜源简介
实现用户之间的排行排行关注和取消关注、查询是源码否关注、共同关注及关注后消息采用feed方式推送及滚动分页查看效果等相关功能。榜源利用redis里面的Set集合实现关注,取关,共同关注,消息推送等,结合Java代码实现具体的功能。
二、实现关注和取关2.1、关注和取消关注功能
业务流程图:
核心代码实现:
结果展示:
2.2、共同关注功能2.3、使用的redis命令如下:2.4、代码实现2.5、问答app源码.结果展示
三、关注推送3.1、Feed流模式3.2、常见模式
Feed流产品有两种常见模式:
●Timeline:不做内容筛选,简单的按照内容发布时间排序,常用于好友或关注。例如:朋友圈。
>优点:信息全面,不会有缺失。并且实现也相对简单。
>缺点:信息噪音较多,用户不一定感兴趣,内容获取效率低。
●智能排序:利用智能算法屏蔽掉违规的、用户不感兴趣的内容。推送用户感兴趣信息来吸引用户
>优点:投喂用户感兴趣信息,用户粘度很高,容易沉迷。
>缺点:如果算法不精准,可能起到反作用。
本例中的个人页面,是基于关注的好友来做Feed流,因此采用Timeline的模式。该模式的实现方案有三种:
①拉模式 ②推模式 ③推拉结合
3.3、三种实现方案
3.3.1、补码到源码拉模式
说明:粉丝主动去拉取相关信息。
3.3.2、推模式
说明:博主主动推送相关信息给粉丝。
3.3.3、推拉结合模式
说明:活跃粉丝:博主主动推送相关信息给粉丝。普通粉丝:粉丝主动去拉取相关信息。
3.3.4、总结
对于大部分中小型公司需求,采取推模式基本上满足需求,对于超千万的用户量的大型公司,需要采取推拉模式,但是实现上相比就复杂多了。
四、案例4.1、需求分析
滚动分页:
4.2、使用到的redis命令
1、ZREVRANGEBYSCORE:Redis的一个Sorted Set命令,用于按照分数从高到低的顺序返回满足指定分数范围条件的元素。它的语法如下:
参数解释如下:
key:排序集合的键名。
max:分数范围的上限,可以使用"+inf"表示正无穷大。
min:分数范围的下限,可以使用"-inf"表示负无穷大。
WITHSCORES:可选参数,表示返回结果时同时返回元素与分数。android 包源码
LIMIT:可选参数,用于限制返回结果的偏移量和数量。
示例用法:
第一个示例命令将返回分数从最高到最低的所有元素,分数范围为(,0],不包括。
第二个示例命令将返回分数从最高到最低的所有元素及其对应的分数,分数范围为(,0],不包括。
第三个示例命令将返回分数从最高到最低的前个元素,分数范围为(,0],不包括。
注意:ZREVRANGEBYSCORE是按照分数从高到低的顺序返回结果的,如果需要按照分数从低到高的顺序返回结果,可以使用ZRANGEBYSCORE命令。
2、ZADD:在Redis中,ZADD命令用于向有序集合(Sorted Set)中添加一个或多个成员。有序集合是一种将成员与分数(score)关联的数据结构,通过分数可以对成员进行排序。
ZADD命令的语法如下:
参数说明:
key:有序集合的键名。
NX:仅在键不存在时添加成员。
XX:仅在键已经存在时添加成员。jsp源码发布
CH:返回修改的成员数量,包括新增和更新的成员。
INCR:对已经存在的成员的分数进行自增操作。
score:成员的分数,用于排序。
member:要添加的成员。
示例:
注意:ZADD命令在Redis版本2.4以及以上版本可用。
reids中实现滚动分页功能:
4.3、业务流程图4.4、核心代码展示
4.4.1、保存探店笔记并发送收件箱
4.4.2、查询关注的所有探店笔记(并含滚动分页)
备注:
4.4.3、请求参数
参考案例:
五、源码获取方式
更多优秀文章,请关注个人微信公众号或搜索“程序猿小杨”查阅。然后回复:源码,可以获取该项目对应的源码及表结构,开箱即可使用。
说明:后面redis相关操作的功能都会放在此文件夹中,需要相关功能的,只需要获取最新的资源,替换项目即可。
用 Redis 搞定游戏中的实时排行榜,附源码!
本文将深入探讨如何利用 Redis 实现游戏中的实时排行榜,并提供实现细节和源码。
首先,我们以一个坦克手游为例。游戏中每个角色可拥有多种类型的坦克,玩家可以加入军团(公会)。这个系统需要实现两种主要的排行榜:等级排行榜和通天塔排行榜。
等级排行榜的实现思路是将等级和战斗力合并为一个复合积分。我们可以设定一个公式:分数 = 等级* + 战力。因为玩家等级范围从1到,战斗力范围从0到,所以我们设计时考虑到,等级需要3位数,战斗力需要位数,合计需要位数的积分,而Redis的有序集合(SortedSet)的score取值范围是位整数或双精度浮点数,足以容纳这个需求。
对于通天塔排行榜,我们采用类似但略有不同的策略。要求相同层数下,通关时间越早越排在前。我们可以将通关时间转换为相对于一个较远时间点(如--)的相对时间,计算公式为:分数 = 层数 * ^N + (基准时间 - 通关时间)。这里我们选择一个远到足以避免现实时间影响的时间戳,从而确保排名的公正性。
为了实现实时更新排行榜数据,我们采用一个策略:使用 Redis 的有序集合存储玩家的复合积分(如角色uid和坦克id),而使用哈希存储动态数据(如玩家的其他相关信息)。当玩家等级或战斗力发生改变时,实时更新有序集合中的积分值即可。对于其他可能变化的数据,也相应地更新哈希表中的数据。
在取排行榜时,以等级排行榜为例,我们可以使用 Redis 的命令来获取数据。具体的代码实现通常涉及多步骤操作,例如准备数据、排序、分批取数据等。优化点在于合理使用 Redis 的 Pipeline 和 Multi 模式,以提高性能和效率。
最终,排行榜的实现并不止于此,我们需要考虑的细节还包括对排行榜数据的展示、排序算法的优化等。这里提供了一个基本框架和实现思路,具体的代码和详细步骤需要根据实际项目需求和环境进行调整。
通过以上内容,我们已经对如何利用 Redis 来搭建游戏排行榜系统有了深入的理解。通过合理的数据结构设计和 Redis 命令的运用,可以实现高效、实时且易于维护的排行榜功能。
菜鸟教程 | 微信小游戏好友排行榜教程
菜鸟教程分享微信小游戏好友排行榜制作过程,涵盖创建项目与发布、添加小游戏、开启开放域功能、主域与开放域通讯以及ShareCanvas与原生Canvas布局。
创建项目并发布:启动Egret项目,通过Launcher发布,使用个人AppID(测试用的id限制功能,如分享)。
添加小游戏:设置中添加小程序(通过审核即可)。
开放域功能:利用微信开发者工具或终端运行egret run --target wxgame,修改game.json配置,打开开放域功能。
ShareCanvas介绍:使用离屏画布绘制排行榜,ShareCanvas允许主域与开放域共享访问权限。
渲染效果:index.js文件提供简单排行榜demo,显示效果可见。
主域与开放域通讯:通过共享数据接口进行单向数据交换,主域请求,开放域响应。
布局建议:使用舞台宽高作为基数调整样式,避免不同手机适配问题,注意安卓显示BUG。
源码链接:深入理解本文代码,参考源码链接:/shenysun/FriendsList
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...
2024-11-23 07:46
2024-11-23 07:13
2024-11-23 07:10
2024-11-23 06:01
2024-11-23 05:52