使用 Redis 实现语音社交聊天室源码中的排行榜功能
在语音社交聊天室源码中,排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。
一般语音社交聊天室源码的排行榜都是有实效性的,比如“用户积分榜”。如果没有实效性一直按照总榜来排,可能榜首总是那几个老用户,对于新用户来说,体验感并不好。
首先,来个“今日积分榜”吧,排序规则是今日用户新增积分从多到少。
那么在语音社交聊天室源码中用户增加积分时,都操作一下记录当天积分增加的有序集合。
假设一个日期是 2015 年 04 月 01 日,UID 为 1 的用户因为某个操作,增加了 5 个积分。
Redis 命令如下:
ZINCRBY rank:20150401 5 1
假设还有其他几个用户也增加了积分:
ZINCRBY rank:20150401 1 2
ZINCRBY rank:20150401 10 3
看看现在有序集合 rank:20150401 中的数据(withscores 参数可以附带获取元素的 score):
ZRANGE rank:20150401 0 -1 withscores
1) "2"
2) "1"
3) "1"
4) "5"
5) "3"
6) "10"
按照分数从高到低,获取语音社交聊天室源码中的 top10:
ZREVRANGE rank:20150401 0 9 withscores
1) "3"
2) "10"
3) "1"
4) "5"
5) "2"
6) "1"
因为只有三个元素,所以就查询出了这些数据。
如果每天记录当天的积分排行榜,那么其他花样百出的榜单也就简单了。
比如语音社交聊天室源码中的“昨日积分榜”:
ZREVRANGE rank:20150331 0 9 withscores
利用并集实现多天的积分总和,实现“上周积分榜”:
ZUNIONSTORE rank:last_week 7 rank:20150323 rank:20150324 rank:20150325 rank:20150326 rank:20150327 rank:20150328 rank:20150329 WEIGHTS 1 1 1 1 1 1 1
这样就将 7 天的积分记录合并到有序集合 rank:last_week 中了。权重因子 WEIGHTS 如果不给,默认就是 1。为了不隐藏细节,特意写出。
那么查询语音社交聊天室源码上周积分榜 Top10 的信息就是:
ZREVRANGE rank:last_week 0 9 withscores
“月度榜”、“季度榜”、“年度榜”等等就以此类推。
下面给出一个 PHP 版的简单实现。使用 Redis 依赖于 PHP 扩展 PhpRedis,代码还依赖于 Carbon 库,用于处理时间。代码量很少,所以就不敲注释了。
<?phpnamespace Blog\Redis;use \Redis;
use Carbon\Carbon;class Ranks {const PREFIX = 'rank:';protected $redis = null;public function __construct(Redis $redis) {$this->redis = $redis;}public function addScores($member, $scores) {$key = self::PREFIX . date('Ymd');return $this->redis->zIncrBy($key, $scores, $member);}protected function getOneDayRankings($date, $start, $stop) {$key = self::PREFIX . $date;return $this->redis->zRevRange($key, $start, $stop, true);}protected function getMultiDaysRankings($dates, $outKey, $start, $stop) {$keys = array_map(function($date) {return self::PREFIX . $date;}, $dates);$weights = array_fill(0, count($keys), 1);$this->redis->zUnion($outKey, $keys, $weights);return $this->redis->zRevRange($outKey, $start, $stop, true);}public function getYesterdayTop10() {$date = Carbon::now()->subDays(1)->format('Ymd');return $this->getOneDayRankings($date, 0, 9);}public static function getCurrentMonthDates() {$dt = Carbon::now();$days = $dt->daysInMonth;$dates = array();for ($day = 1; $day <= $days; $day++) {$dt->day = $day;$dates[] = $dt->format('Ymd');}return $dates;}public function getCurrentMonthTop10() {$dates = self::getCurrentMonthDates();return $this->getMultiDaysRankings($dates, 'rank:current_month', 0, 9);}}
以上就是“使用 Redis 实现语音社交聊天室源码中的排行榜功能”的全部内容了,希望在大家开发语音社交聊天室源码时能提供一些帮助。
使用 Redis 实现语音社交聊天室源码中的排行榜功能相关推荐
- 语音聊天室源码中的变声,应用了哪些算法?
导读:2021开年以来,语音聊天室源码伴随着Clubhouse的爆火再获资本的关注,国内相关产品都迎来了股价的大幅上涨,预计未来音频化在社交领域还会有长期且广泛的需求. 在移动互联网技术加持下,语音聊 ...
- 语音聊天室源码开发点赞功能,用 MySQL 还是 Redis ?
为了提升用户在语音聊天室源码中的互动性,一般在开发动态广场功能时会支持用户间对动态进行点赞,所以点赞功能可以说是语音聊天室源码开发的基础性功能,今天我们就来聊聊点赞.评论.收藏等这些场景的db数据库设 ...
- Android聊天室源码开发,悬浮窗的实现及封装思路
为了实现语音聊天室源码的多场景应用,悬浮小窗口在语音聊天室源码开发中还是比较常见的需求,主要是指用户在语音连麦过程中打开其它界面或者退到桌面时语音连麦不会中断且会有一个悬浮小窗口位于最上层,接下来我们 ...
- YShout一款PHP+TXT+Ajax嵌入式在线聊天室源码
简介: YShout是一款PHP+TXT+AJAX开发嵌入式在线聊天室源码,UTF-8编码. 可以非常方便的嵌入到的你的网站中,无需数据库,采用TXT存储数据,小巧灵活,移植方便.采用AJAX技术,增 ...
- 完整版H5社交聊天平台源码[完整数据库+完整文档教程]
介绍: 开发语言:PHP 数据库:MySQL 完整版H5社交聊天平台源码:一款优化了的版本,带有完善的文档教程和完整数据库文件. 东西非常的齐全,这款是客户定制的,所以东西很完整,也值不少钱,源码开发 ...
- 聊天室平台搭建【免费下载 无需积分/C币】java、Android、php多平台聊天室源码打包下载
关键词:多款聊天平台源码合集免费下载 #聊天源码,#聊天工具,#源码下载,#仿QQ,#聊天室源码 聊天室平台搭建 搭建自己的聊天交流平台 [点击此处]下载源码 原网址:https://download ...
- 仿9158 VC++视频聊天室源码
视频聊天室源码简介: 成熟产品可提供全套系统源代码(包服务端,客户端,网站平台) 采用C++语言开发系统速度快,稳定.H264视频编解码视频清晰,流畅,同时3路视频
- 高清视频会议 视频聊天室源码下载
高清视频会议.视频聊天室源码简介: "SDK即时通讯平台"是一套跨平台的即时通讯解决方案,基于先进的H.264视频编码标准.AAC音频编码标准与P2P技术,支持高清视频,整合了佰锐 ...
- 开源版-在线客服系统源码_网页聊天室源码_webim
2019独角兽企业重金招聘Python工程师标准>>> WoLive是一款在线客服系统源码,支持PC Web和移动端,只需嵌入一段js代码即可快速接入.购买后可私有化部署,WoLiv ...
最新文章
- Android适应方案汇总(三)
- Ubuntu编译安装VASP
- mysql中判断字段为空
- python矩阵运算numpy_Python Numpy中的几个矩阵乘法
- 车站信号计算机联锁系统英语,车站信号计算机联锁-复习题
- BugkuCTF-Reverse题signin
- 2017.4.16 麦森数 思考记录
- 将python程序打包成可执行文件exe
- 无法将多信息文本转换为url_实体链接:信息抽取中的NLP的基础任务
- windows系统: 解决ie谷歌浏览器证书错误.2021-05-27
- oracle12能卸干净吗,Oracle卸载干净方法
- python输入一个三位整数、求逆序数_编写程序,从键盘输入一个三位数,求出其逆序数并输出,例如输入123,输出321。编写程序,从键盘输入一个三位数...
- SAP License:实例讲解SAP与金税接口
- 举个栗子!Tableau 技巧(133):完整显示工具提示中的数据
- 测试面试题-如何测试朋友圈
- ios silk to MP3
- vue3中 provide 和 inject 用法
- Diffusion models代码解读:入门与实战
- 计算机无法连接到指定的服务器,无法连接Windows远程服务器的几种解决办法
- 代码随想录算法训练营第一天 704 二分查找、27 移除元素