柚子快報激活碼778899分享:基于redis實現(xiàn)滾動分頁功能
柚子快報激活碼778899分享:基于redis實現(xiàn)滾動分頁功能
需求是基于redis的zset集合將其中的數(shù)據(jù)以分頁的形式查詢,要求是查詢過的數(shù)據(jù)不能重復(fù)查詢到
基于redis zset集合實現(xiàn)滾動分頁功能
新建個zset集合向里面添加些測試數(shù)據(jù)
常規(guī)分頁基于索引查詢page:1,size:5,page:2,size:5......存在危害
此時集合中有7條數(shù)據(jù)執(zhí)行分頁查詢第一次查詢查詢到的的是id為13,12,11,10,9這幾條數(shù)據(jù)
第二次查詢?yōu)?,7兩條,這是正常情況下分頁查詢到的數(shù)據(jù)
另一種情況
執(zhí)行分頁查詢第一次查詢查詢到的的是id為13,12,11,10,9這幾條數(shù)據(jù),如果當(dāng)前時間其他用戶向集合中添加數(shù)據(jù)那么新數(shù)據(jù)會在最頂部新增一條id為14score為當(dāng)前時間戳的數(shù)據(jù),那么這條數(shù)據(jù)會被放到最上方第二次查詢到的數(shù)據(jù)則會變成9,8,7三條9這條數(shù)據(jù)則重復(fù)查詢到,在一些特定場景下這種情況是不允許發(fā)生的,為此我們需要實現(xiàn)滾動分頁這種動態(tài)查詢
基于stringRedisTemplate.opsForZSet()提供的reverseRangeByScoreWithScores方法可以實現(xiàn)滾動分頁查詢
內(nèi)部需要傳遞5個參數(shù)分別為
key:redis數(shù)據(jù)的key值
min:最小值,根據(jù)score打分查詢到的最小的邊界
max:最大值,根據(jù)score打分查詢到的最大的邊界
offset:如果score值相同需要跳過的個數(shù)(如果score值相同那么還是會被查詢到的,因為查詢到的數(shù)據(jù)是根據(jù)max傳輸?shù)闹祦磉M(jìn)行查詢的:比如最大值我傳入10此時集合內(nèi)score為10打分的數(shù)據(jù)存在兩條,那么這兩條都會被查詢到,需要跳過幾條傳入數(shù)值即可)
count:相當(dāng)于傳統(tǒng)分頁中的分頁條數(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
//記錄最小的時間戳
long minTime = 0;
//offset最小的時間戳出現(xiàn)的個數(shù),用來跳過相同分?jǐn)?shù)避免重復(fù)數(shù)據(jù)查詢
int os = 1;
for (ZSetOperations.TypedTuple
//筆記id
String blogId = tuple.getValue();
listIds.add(blogId);
//時間戳
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);
}
柚子快報激活碼778899分享:基于redis實現(xiàn)滾動分頁功能
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。