柚子快報(bào)激活碼778899分享:基于redis實(shí)現(xiàn)滾動(dòng)分頁(yè)功能
柚子快報(bào)激活碼778899分享:基于redis實(shí)現(xiàn)滾動(dòng)分頁(yè)功能
需求是基于redis的zset集合將其中的數(shù)據(jù)以分頁(yè)的形式查詢,要求是查詢過(guò)的數(shù)據(jù)不能重復(fù)查詢到
基于redis zset集合實(shí)現(xiàn)滾動(dòng)分頁(yè)功能
新建個(gè)zset集合向里面添加些測(cè)試數(shù)據(jù)
常規(guī)分頁(yè)基于索引查詢page:1,size:5,page:2,size:5......存在危害
此時(shí)集合中有7條數(shù)據(jù)執(zhí)行分頁(yè)查詢第一次查詢查詢到的的是id為13,12,11,10,9這幾條數(shù)據(jù)
第二次查詢?yōu)?,7兩條,這是正常情況下分頁(yè)查詢到的數(shù)據(jù)
另一種情況
執(zhí)行分頁(yè)查詢第一次查詢查詢到的的是id為13,12,11,10,9這幾條數(shù)據(jù),如果當(dāng)前時(shí)間其他用戶向集合中添加數(shù)據(jù)那么新數(shù)據(jù)會(huì)在最頂部新增一條id為14score為當(dāng)前時(shí)間戳的數(shù)據(jù),那么這條數(shù)據(jù)會(huì)被放到最上方第二次查詢到的數(shù)據(jù)則會(huì)變成9,8,7三條9這條數(shù)據(jù)則重復(fù)查詢到,在一些特定場(chǎng)景下這種情況是不允許發(fā)生的,為此我們需要實(shí)現(xiàn)滾動(dòng)分頁(yè)這種動(dòng)態(tài)查詢
基于stringRedisTemplate.opsForZSet()提供的reverseRangeByScoreWithScores方法可以實(shí)現(xiàn)滾動(dòng)分頁(yè)查詢
內(nèi)部需要傳遞5個(gè)參數(shù)分別為
key:redis數(shù)據(jù)的key值
min:最小值,根據(jù)score打分查詢到的最小的邊界
max:最大值,根據(jù)score打分查詢到的最大的邊界
offset:如果score值相同需要跳過(guò)的個(gè)數(shù)(如果score值相同那么還是會(huì)被查詢到的,因?yàn)椴樵兊降臄?shù)據(jù)是根據(jù)max傳輸?shù)闹祦?lái)進(jìn)行查詢的:比如最大值我傳入10此時(shí)集合內(nèi)score為10打分的數(shù)據(jù)存在兩條,那么這兩條都會(huì)被查詢到,需要跳過(guò)幾條傳入數(shù)值即可)
count:相當(dāng)于傳統(tǒng)分頁(yè)中的分頁(yè)條數(shù)下方代碼寫死為2條,正常由前端傳入
public R queryBLongOfFollow(Long max, Integer offset) {
//獲取當(dāng)前用戶id
String userId = threadLocal.get().getId();
//key
String key = "all:follows:" + userId;
//查詢收件箱
Set
reverseRangeByScoreWithScores(key, 0, max, offset, 2);
if (typedTuples == null || typedTuples.isEmpty()) {
return R.ok();
}
//筆記id集合
ArrayList
//記錄最小的時(shí)間戳
long minTime = 0;
//offset最小的時(shí)間戳出現(xiàn)的個(gè)數(shù),用來(lái)跳過(guò)相同分?jǐn)?shù)避免重復(fù)數(shù)據(jù)查詢
int os = 1;
for (ZSetOperations.TypedTuple
//筆記id
String blogId = tuple.getValue();
listIds.add(blogId);
//時(shí)間戳
long time = tuple.getScore().longValue();
if (minTime == time) {
os++;
} else {
minTime = time;
os = 1;
}
}
//將筆記id集合以,拼接
String idsStr = StrUtil.join(",", listIds);
//按照順序查詢筆記集合
List
.last("order by field(id," + idsStr + ")").list();
for (Blog b : blogList) {
isLikeBLong(b);
if (b == null) {
return R.error("查詢失敗");
}
User user = userService.query().eq("id", b.getUserId()).one();
b.setUser(user);
}
ScrollResult result = new ScrollResult();
result.setList(blogList);
result.setMinTime(minTime);
result.setOffset(os);
return R.ok().data("result",result);
}
柚子快報(bào)激活碼778899分享:基于redis實(shí)現(xiàn)滾動(dòng)分頁(yè)功能
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。