关于排行榜如果分数相同,得分相同时间早的排在前面的操作。
之前刷到一个博主的文章,分享下自己想法
原文章地址
第一种方式
根据REDIS的默认规则,如果具有相同分数值的成员按字典序的逆序(reverse lexicographical order)排列
//接收命令行参数
$key= $argv[1];
$score= $argv[2];
//Redis存储
if (!extension_loaded('redis')) {
die('Please install the phpredis extension.');
}
//这种方式缺点就是你必须知道这次排名有多少。比如说你已经知道这次排名有26个,那么就直接从第26个开始,然后倒序排列。假设分数为100,第一个100为 “key+Z”=keyZ,第二个为 “key+Y”=keyY
$redis=new REDIS();
$redis->connect('192.168.70.3',6379);
$redis->Zadd('rank',$score,$key);
$members = $redis->zRevRange('rank', 0, -1, true);
print_r($members);
$redis->close();
第二种方式
位运算+时间戳(活动结束时间-得分时间)
//根据整形进行位运算,加上活动结束时间减去当前时间(越早减得分数越高),这种方式要注意当前系统是多少位在进行位运算,不然超出之后会出错。
$now_timestamp= time(); //当前得分时间
$activity_timestamp= strtotime("2024-08-30 15:10:37");//活动结束时间
//接收命令行参数
$key= $argv[1];
$score= $argv[2];
//Redis存储
if (!extension_loaded('redis')) {
die('Please install the phpredis extension.');
}
$score=$score << 32;
$score+=$activity_timestamp-$now_timestamp;
$redis=new REDIS();
$redis->connect('192.168.70.3',6379);
$redis->Zadd('rank',$score,$key);
$members = $redis->zRevRange('rank', 0, -1, true);
print_r($members);
//还原分数
foreach($members as $k=>$v){
$v_shifted = $v >> 32;
// 输出结果
echo $k . ':' . $v_shifted . PHP_EOL;
}
$redis->close();
本作品采用《CC 协议》,转载必须注明作者和本文链接
什么时候开始流行面向
Redis
编程了。mysql100万数据阁下又该如何应对