av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

利用Redis進(jìn)行分頁(yè)查詢(redis的分頁(yè)查詢)

利用Redis進(jìn)行分頁(yè)查詢

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、大通ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的大通網(wǎng)站制作公司

隨著數(shù)據(jù)量的增加,傳統(tǒng)的數(shù)據(jù)庫(kù)查詢?cè)诿鎸?duì)大數(shù)據(jù)量、實(shí)時(shí)性要求高的場(chǎng)景下逐漸顯得捉襟見(jiàn)肘,難以滿足業(yè)務(wù)需求。因此,一些新型的數(shù)據(jù)庫(kù)技術(shù)應(yīng)運(yùn)而生,其中就包括Redis。

Redis是一個(gè)基于內(nèi)存的數(shù)據(jù)存儲(chǔ)系統(tǒng),可以支持不同類(lèi)型的數(shù)據(jù)結(jié)構(gòu)操作,提供高速讀寫(xiě)、數(shù)據(jù)持久化等多種功能。特別是Redis提供的分布式鎖機(jī)制、發(fā)布訂閱功能,使得它成為大型分布式應(yīng)用、高流量網(wǎng)站的首選數(shù)據(jù)庫(kù)之一。

概述

本文將介紹如何利用Redis實(shí)現(xiàn)分頁(yè)查詢,以方便程序員更好地處理大量數(shù)據(jù)。我們將使用Java語(yǔ)言作為開(kāi)發(fā)語(yǔ)言,Redis作為緩存服務(wù),SpringBoot作為Web框架,使用MyBatis作為ORM框架操作MySQL數(shù)據(jù)庫(kù)。

代碼實(shí)現(xiàn)

我們首先在pom.xml文件中添加相關(guān)依賴(lài):

 

org.springframework.boot
spring-boot-starter-data-redis




org.mybatis.spring.boot
mybatis-spring-boot-starter

接著配置Redis的連接信息和SpringBoot的配置文件application.properties中添加以下配置:

# Redis連接信息
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=0
# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.model

我們需要根據(jù)查詢條件實(shí)現(xiàn)一個(gè)分頁(yè)查詢的接口,代碼如下:

public interface UserMapper {
/**
* 分頁(yè)查詢用戶信息
*
* @param params 查詢條件
* @return 用戶列表
*/
List findUserByPage(Map params);
}

接下來(lái)我們實(shí)現(xiàn)具體的分頁(yè)查詢操作,在Redis中保存分頁(yè)查詢結(jié)果,查詢時(shí)先從Redis緩存中查詢,如果Redis中不存在,則從MySQL中查詢并將結(jié)果保存到Redis中,代碼如下:

@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private UserMapper userMapper;
@Autowired
private stringRedisTemplate stringRedisTemplate;

private static final String REDIS_PAGE_KEY_PATTERN = "page:%s:%d:%d";
private static final int REDIS_PAGE_EXPIRE_TIME = 3600; // Redis緩存過(guò)期時(shí)間,單位秒
@Override
public List findUserByPage(int pageNum, int pagesize) {
String redisKey = String.format(REDIS_PAGE_KEY_PATTERN, getClass(), pageNum, pageSize);
BoundListOperations boundListOps = stringRedisTemplate.boundListOps(redisKey);
if (boundListOps.size() == 0) {
Map params = new HashMap();
params.put("offset", (pageNum - 1) * pageSize);
params.put("limit", pageSize);
List userList = userMapper.findUserByPage(params);
for (User user : userList) {
boundListOps.rightPush(JSON.toJSONString(user));
}

stringRedisTemplate.expire(redisKey, REDIS_PAGE_EXPIRE_TIME, TimeUnit.SECONDS);
}
List userListJson = boundListOps.range(0, -1);
return userListJson.stream().map(userJson -> JSON.parseObject(userJson, User.class)).collect(Collectors.toList());
}
}

我們定義了一個(gè)Redis緩存的鍵值對(duì)格式:”page:{Class}:{pageNum}:{pageSize}”,其中{Class}表示當(dāng)前類(lèi)名稱(chēng),{pageNum}和{pageSize}表示頁(yè)碼和頁(yè)大小。如果Redis中已經(jīng)存在這個(gè)鍵,我們直接從Redis緩存中獲取對(duì)應(yīng)頁(yè)碼的用戶列表;否則,我們就進(jìn)行MySQL查詢并將查詢結(jié)果存入Redis緩存中,并設(shè)置緩存過(guò)期時(shí)間。

優(yōu)化

考慮到分頁(yè)查詢時(shí)緩存是按頁(yè)分的,每次查詢只能獲取一整頁(yè)的數(shù)據(jù),存在一定的數(shù)據(jù)冗余。因此,我們可以將分頁(yè)查詢的結(jié)果按需讀取,避免一次性讀取整個(gè)頁(yè)面的數(shù)據(jù),進(jìn)一步提高查詢效率。

我們?nèi)匀皇褂肦edis進(jìn)行緩存,但改用Redis的Hash類(lèi)型進(jìn)行存儲(chǔ)。鍵的格式為:”page:{Class}:{pageNum}:{pageSize}”,值為一個(gè)Hash,其中鍵值對(duì)的鍵為”user:{userId}”,值為用戶信息的JSON字符串。

代碼實(shí)現(xiàn):

@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
private static final String REDIS_PAGE_KEY_PATTERN = "page:%s:%d:%d";
private static final int REDIS_PAGE_EXPIRE_TIME = 3600; // Redis緩存過(guò)期時(shí)間,單位秒
@Override
public List findUserByPage(int pageNum, int pageSize) {
String redisKey = String.format(REDIS_PAGE_KEY_PATTERN, getClass(), pageNum, pageSize);

if (!redisTemplate.hasKey(redisKey)) {
Map params = new HashMap();
params.put("offset", (pageNum - 1) * pageSize);
params.put("limit", pageSize);
List userList = userMapper.findUserByPage(params);
HashOperations hashOps = redisTemplate.opsForHash();
for (User user : userList) {
hashOps.put(redisKey, "user:" + user.getId(), JSON.toJSONString(user));
}

redisTemplate.expire(redisKey, REDIS_PAGE_EXPIRE_TIME, TimeUnit.SECONDS);
}
HashOperations hashOps = redisTemplate.opsForHash();
List userListJson = hashOps.values(redisKey);
return userListJson.stream().map(userJson -> JSON.parseObject(userJson, User.class)).collect(Collectors.toList());
}
}

總結(jié)

Redis作為緩存和分布式鎖服務(wù)的首選,它提供的高速讀寫(xiě)、數(shù)據(jù)持久化等功能,能夠較好地支持大流量、高并發(fā)的應(yīng)用場(chǎng)景。利用Redis實(shí)現(xiàn)分頁(yè)查詢,能夠避免傳統(tǒng)數(shù)據(jù)庫(kù)查詢的瓶頸,提高查詢效率,緩解數(shù)據(jù)庫(kù)壓力,減少服務(wù)器負(fù)擔(dān),提高系統(tǒng)性能。如果您有類(lèi)似需求,可以根據(jù)本文提供的代碼進(jìn)行實(shí)現(xiàn)。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


分享文章:利用Redis進(jìn)行分頁(yè)查詢(redis的分頁(yè)查詢)
文章分享:http://uogjgqi.cn/article/dhogges.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流