最近做了一个婚恋项目,客户要求每次打开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