1.控制器
这里为什么要用redis 有序集合 (sorted set) 因为
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
/**
* 模拟数据
*/
public function index()
{
$uid = 2;
Redis::zincrby('tag', 1, $uid);
}
// 按照权重的从大到小 列出成员
$data = Redis::zRevRange('tag',0,9);
这个是打印出来的结果
因为在此之前我存储的成员 就是我数据表里面的id 所以在下面我又进行了对模型的查询
/**
* 积分排行榜
* @return \Illuminate\Http\JsonResponse
*/
public function create()
{
//显示用户排行
$data = Redis::zrevrange('tag', 0, -1);
//把id转换成字符串
$ids = implode(',', $data);
//显示权重值排行
$score = Redis::zRevRange('tag', 0, -1, true);
//改变他原有的数组模式
$score = explode(',', implode(',', $score));
//orderByRaw()指定字段值排序
//DB::raw()在下边文章有解释,用于分页
$rankingData = User::whereIn('id', $data)->orderByRaw(DB::raw("FIELD(id,$ids)"))->get()->toArray();
//查看权重
$res = [];
foreach ($rankingData as $key => $val) {
$res[] = [
'id' => $val['id'],
'name' => $val['name'],
'code' => $val['code'],
'score' => $score[$key],
'key'=>$key+1
];
}
return response()->json([
'code' => 200,
'msg' => '成功',
'data'