您现在的位置是: 首页 >  技术分享 > 

Thinkphp5.1 随机数据问题(分页+不重复)
传说中的小明 2026-06-17 16:11:57

最近做了一个婚恋项目,客户要求每次打开app,随机查询数据,并且每次不能重复。我直接才用了redis实现,下面直接上代码。


$headerRedisKey = request()->header('redis-key'); // 前端header中的redis-key 只有不登录的时候采用
$user['id'] = 0; // 用户ID 自己获取处理

$redis = new \think\cache\driver\Redis([
   'host' => '127.0.0.1',
   'port' => 6379,
   'password' => '',
   'select' => 0,
]);

$page = input('page') ?: 1;
$total = 0; // 总数
$lastPage = 0; // 总页数
$pageSize = 15; // 每页数量

// redisKey
if ($user['id']) {
   $redisDataKey = 'data:user:' . $user['id'];
   $redisTotalKey = 'total:user:' . $user['id'];
} else {
   $redisDataKey = 'data:user:' . $headerRedisKey;
   $redisTotalKey = 'total:user:' . $headerRedisKey;
}

// 初始化
if ($page == 1) {
   if ($redis->has($redisDataKey)) {
       $redis->rm($redisDataKey);
       $redis->rm($redisTotalKey);
   }

   // 需要查询的符合条件的ID  逻辑自行处理吧
   $ids = [];
   for ($i = 1; $i <= 100; $i++) {
       array_push($ids,$i);
   }

   // 随机打乱排序
   shuffle($ids);
   // 统计总数
   $total = count($ids);

   // 将数据ID存入redis
   $redis->handler()->rPush($redisDataKey, ...$ids);
   $redis->expire($redisDataKey, 3600);
   // 将数据ID总数存入redis
   $redis->set($redisTotalKey, $total,3600);
}

if (!$redis->has($redisDataKey) && $page > 1) {
   $total = $redis->get($redisTotalKey);
   $total = $total ?: 0;
   $lastPage = ceil($total / $pageSize);

   // 返回结果
   return ApiReturn::r(1,[
       'total' => $total,
       'per_page' => $pageSize,
       'current_page' => $page,
       'last_page' => $lastPage,
       'data' => [],
   ],'获取成功');
}

// 计算总数以及最后一页
$total = $redis->get($redisTotalKey);
$total = $total ?: 0;
$lastPage = ceil($total / $pageSize);

// 弹出一页 ID
$pageIds = [];
for ($i = 0; $i < $pageSize; $i++) {
   $id = $redis->handler()->lPop($redisDataKey);
   if ($id === false) break;
   $pageIds[] = $id;
}

if (empty($pageIds)) {
   // 移除总数redis key
   if ($redis->has($redisTotalKey)) {
       $redis->rm($redisTotalKey);
   }

   // 返回结果
   return ApiReturn::r(1,[
       'total' => $total,
       'per_page' => $pageSize,
       'current_page' => $page,
       'last_page' => $lastPage,
       'data' => [],
   ],'获取成功');
} else {

     //  查询逻辑自行完善  如果需要保持乱序排序数据 一定要加  orderRaw('FIELD(id,' . implode(',', $pageIds) . ')')


   // 返回结果
   return ApiReturn::r(1,[
       'total' => $total,
       'per_page' => $pageSize,
       'current_page' => $page,
       'last_page' => $lastPage,
       'data' => $pageIds,
   ],'获取成功');
}




Copyright © 2021
www.yunyakeji.cn All rights reserved. 小明博客 豫ICP备2020029140号-1