婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > 基于Redis的List實(shí)現(xiàn)特價(jià)商品列表功能

基于Redis的List實(shí)現(xiàn)特價(jià)商品列表功能

熱門標(biāo)簽:山東外呼銷售系統(tǒng)招商 日本中國地圖標(biāo)注 十堰營(yíng)銷電銷機(jī)器人哪家便宜 超呼電話機(jī)器人 貴州電銷卡外呼系統(tǒng) 魔獸2青云地圖標(biāo)注 宿遷便宜外呼系統(tǒng)平臺(tái) 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 鄭州人工智能電銷機(jī)器人系統(tǒng)

 1、場(chǎng)景分析

淘寶京東的特價(jià)商品列表,

商品特點(diǎn):

  • 商品有限,并發(fā)量非常的大。
  • 考慮分頁

傳統(tǒng)解決方案:數(shù)據(jù)庫db,

但是在如此大的并發(fā)量的情況下,不可取。

一般會(huì)采用redis來處理。這些特價(jià)商品的數(shù)據(jù)不多,而且redis的list本身也支持分頁。是天然處理這種列表的最佳選擇解決方案。

2、分析

采用list數(shù)據(jù),因?yàn)閘ist數(shù)據(jù)結(jié)構(gòu)有:lrange key 0 -1 可以進(jìn)行數(shù)據(jù)的分頁。

127.0.0.1:6379> lpush products p1 p2 p3 p4 p5 p6 p7 p8 p9 p10
(integer) 10
127.0.0.1:6379> lrange products 0 1
1) "p10"
2) "p9"
127.0.0.1:6379> lrange products 2 3
1) "p8"
2) "p7"
127.0.0.1:6379> lrange products 4 5
1) "p6"
2) "p5"

3 、具體實(shí)現(xiàn)

淘寶,京東的熱門商品在雙11的時(shí)候,可能有100多w需要搞活動(dòng):程序需要5分鐘對(duì)特價(jià)商品進(jìn)行刷新。

3.1 ProductListService類

  •  初始化的活動(dòng)的商品信息100個(gè)(從數(shù)據(jù)庫去查詢)

@PostContrcut使用

  •  查詢產(chǎn)品列表信息

換算的分頁的起始位置和結(jié)束位置

package com.example.service;

import com.example.entity.Product;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @Auther: 長(zhǎng)頸鹿
 * @Date: 2021/08/29/18:00
 * @Description:
 */
@Service
@Slf4j
public class ProductListService {

    @Autowired
    private RedisTemplate redisTemplate;

    // 數(shù)據(jù)熱加載
    @PostConstruct
    public void initData(){
        log.info("啟動(dòng)定時(shí)加載特價(jià)商品到redis的list中...");
        new Thread(() -> runCourse()).start();
    }

    public void runCourse() {
        while (true) {
            // 從數(shù)據(jù)庫中查詢出特價(jià)商品
            ListProduct> productList = this.findProductsDB();
            // 刪除原來的特價(jià)商品
            this.redisTemplate.delete("product:hot:list");
            // 把特價(jià)商品添加到集合中
            this.redisTemplate.opsForList().leftPushAll("product:hot:list", productList);
            try {
                // 每隔一分鐘執(zhí)行一次
                Thread.sleep(1000 * 60);
                log.info("定時(shí)刷新特價(jià)商品....");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 數(shù)據(jù)庫中查詢特價(jià)商品
     *
     * @return
     */
    public ListProduct> findProductsDB() {
        //ListProduct> productList = productMapper.selectListHot();
        ListProduct> productList = new ArrayList>();
        for (long i = 1; i = 100; i++) {
            Product product = new Product();
            product.setId((long) new Random().nextInt(1000));
            product.setPrice((double) i);
            product.setTitle("特價(jià)商品" + (i));
            productList.add(product);
        }
        return productList;
    }

}

3.2 商品的數(shù)據(jù)接口的定義和展示及分頁

package com.example.controller;

import com.example.entity.Product;
import com.example.service.ProductListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Auther: 長(zhǎng)頸鹿
 * @Date: 2021/08/29/18:04
 * @Description:
 */
@RestController
public class ProductListController {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private ProductListService productListService;

    @GetMapping("/findProducts")
    public ListProduct> findProducts(int pageNo, int pageSize) {

        // 從那個(gè)集合去查詢
        String key = "product:hot:list";
        // 分頁的開始結(jié)束的換算
        if (pageNo = 0) pageNo = 1;
        int start = (pageNo - 1) * pageSize;
        // 計(jì)算分頁的結(jié)束頁
        int end = start + pageSize - 1;

        // 根據(jù)redis的api去處理分頁查詢對(duì)應(yīng)的結(jié)果
        try {
            ListProduct> productList = this.redisTemplate.opsForList().range(key, start, end);
            if (CollectionUtils.isEmpty(productList)) {
                //todo: 查詢數(shù)據(jù)庫,存在緩存擊穿的情況,大量的并發(fā)請(qǐng)求進(jìn)來,可能把數(shù)據(jù)庫沖
                productList = productListService.findProductsDB();
            }
            return productList;

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

}

3.3 定時(shí)任務(wù)

@Configuration      // 主要用于標(biāo)記配置類,兼?zhèn)銫omponent的效果。
@EnableScheduling   // 開啟定時(shí)任務(wù)
public class SaticScheduleTask {
    // 添加定時(shí)任務(wù)
    @Scheduled(cron = "* 0/5 * * * ?")
    // 或直接指定時(shí)間間隔,例如:5秒
    // @Scheduled(fixedRate=5000)
    private void configureTasks() {
        System.err.println("執(zhí)行靜態(tài)定時(shí)任務(wù)時(shí)間: " + LocalDateTime.now());
    }
}

4、解決商品列表存在的緩存擊穿問題

 4.1 如何引起的緩存擊穿的情況

public void runCourse() {
        while (true) {
            // 從數(shù)據(jù)庫中查詢出特價(jià)商品
            ListProduct> productList = this.findProductsDB();
            // 刪除原來的特價(jià)商品
            this.redisTemplate.delete("product:hot:list");
            // 把特價(jià)商品添加到集合中 需要時(shí)間
            this.redisTemplate.opsForList().leftPushAll("product:hot:list", productList);
            try {
                // 每隔一分鐘執(zhí)行一遍
                Thread.sleep(1000 * 60);
                log.info("定時(shí)刷新特價(jià)商品....");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

出現(xiàn)原因:

  • 特價(jià)商品的數(shù)據(jù)更換需要時(shí)間,剛好特價(jià)商品還沒有放入到redis緩存中。
  • 查詢特價(jià)商品的并發(fā)量非常大,可能程序還正在寫入特價(jià)商品到緩存中,這時(shí)查詢緩存根本沒有數(shù)據(jù),就會(huì)直接沖入數(shù)據(jù)庫中去查詢特價(jià)商品。可能造成數(shù)據(jù)庫沖垮。這個(gè)就叫做:緩存擊穿

4.2 解決方案

主從輪詢

可以開辟兩塊redis的集合空間A和B。定時(shí)器在更新緩存的時(shí)候,先更新B緩存,然后再更新A緩存

一定要按照特定順序來處理。

package com.example.service;

import com.example.entity.Product;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @Auther: 長(zhǎng)頸鹿
 * @Date: 2021/08/29/18:00
 * @Description:
 */
@Service
@Slf4j
public class ProductListService {

    @Autowired
    private RedisTemplate redisTemplate;

    // 數(shù)據(jù)熱加載
    @PostConstruct
    public void initData(){
        log.info("啟動(dòng)定時(shí)加載特價(jià)商品到redis的list中...");
        new Thread(() -> runCourse()).start();
    }

    public void runCourse() {
        while (true) {
            // 從數(shù)據(jù)庫中查詢出特價(jià)商品
            ListProduct> productList = this.findProductsDB();

            // 刪除原來的特價(jià)商品
            this.redisTemplate.delete("product:hot:slave:list");
            // 把特價(jià)商品添加到集合中
            this.redisTemplate.opsForList().leftPushAll("product:hot:slave:list", productList);// 刪除原來的特價(jià)商品

            this.redisTemplate.delete("product:hot:master:list");
            // 把特價(jià)商品添加到集合中
            this.redisTemplate.opsForList().leftPushAll("product:hot:master:list", productList);

//            // 刪除原來的特價(jià)商品
//            this.redisTemplate.delete("product:hot:list");
//            // 把特價(jià)商品添加到集合中
//            this.redisTemplate.opsForList().leftPushAll("product:hot:list", productList);
            try {
                // 每隔一分鐘執(zhí)行一次
                Thread.sleep(1000 * 60);
                log.info("定時(shí)刷新特價(jià)商品....");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 數(shù)據(jù)庫中查詢特價(jià)商品
     *
     * @return
     */
    public ListProduct> findProductsDB() {
        //ListProduct> productList = productMapper.selectListHot();
        ListProduct> productList = new ArrayList>();
        for (long i = 1; i = 100; i++) {
            Product product = new Product();
            product.setId((long) new Random().nextInt(1000));
            product.setPrice((double) i);
            product.setTitle("特價(jià)商品" + (i));
            productList.add(product);
        }
        return productList;
    }

}
package com.example.controller;

import com.example.entity.Product;
import com.example.service.ProductListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Auther: 長(zhǎng)頸鹿
 * @Date: 2021/08/29/18:04
 * @Description:
 */
@RestController
public class ProductListController {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private ProductListService productListService;

    @GetMapping("/findProducts")
    public ListProduct> findProducts(int pageNo, int pageSize) {

        // 從那個(gè)集合去查詢

        String master_key = "product:hot:master:list";
        String slave_key = "product:hot:slave:list";

        String key = "product:hot:list";
        // 分頁的開始結(jié)束的換算
        if (pageNo = 0) pageNo = 1;
        int start = (pageNo - 1) * pageSize;
        // 計(jì)算分頁的結(jié)束頁
        int end = start + pageSize - 1;

        // 根據(jù)redis的api去處理分頁查詢對(duì)應(yīng)的結(jié)果
        try {

            ListProduct> productList = this.redisTemplate.opsForList().range(master_key, start, end);

//            ListProduct> productList = this.redisTemplate.opsForList().range(key, start, end);
            if (CollectionUtils.isEmpty(productList)) {
                // todo: 查詢數(shù)據(jù)庫,存在緩存擊穿的情況,大量的并發(fā)請(qǐng)求進(jìn)來,可能把數(shù)據(jù)庫沖

                productList = this.redisTemplate.opsForList().range(slave_key, start, end);

//                productList = productListService.findProductsDB();
            }
            return productList;

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

}

到此這篇關(guān)于基于Redis的List實(shí)現(xiàn)特價(jià)商品列表的文章就介紹到這了,更多相關(guān)redis list商品列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python3操作redis實(shí)現(xiàn)List列表實(shí)例
  • Redis List列表的詳細(xì)介紹
  • redis redisson 集合的使用案例(RList、Rset、RMap)
  • Redis快速表、壓縮表和雙向鏈表(重點(diǎn)介紹quicklist)
  • redis 獲取 list 中的所有元素操作
  • 詳解Redis中的List類型
  • Redis list 類型學(xué)習(xí)筆記與總結(jié)
  • Redis教程(三):List數(shù)據(jù)類型

標(biāo)簽:大慶 果洛 吉安 北京 臺(tái)州 朝陽 楊凌 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《基于Redis的List實(shí)現(xiàn)特價(jià)商品列表功能》,本文關(guān)鍵詞  基于,Redis,的,List,實(shí)現(xiàn),特價(jià),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于Redis的List實(shí)現(xiàn)特價(jià)商品列表功能》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于Redis的List實(shí)現(xiàn)特價(jià)商品列表功能的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    婷婷综合另类小说色区| 国产成人免费网站| 成人免费三级在线| 欧美视频一区二区| 国产日韩欧美在线一区| 日本大胆欧美人术艺术动态| 91免费看片在线观看| 久久综合狠狠综合久久激情| 亚洲亚洲精品在线观看| 成人av在线电影| 久久久精品欧美丰满| 五月激情综合色| 91视频你懂的| 国产精品不卡视频| 国产毛片精品国产一区二区三区| 欧美精品一二三区| 亚洲妇女屁股眼交7| 99久久精品国产一区| 久久久久久黄色| 日韩高清一区在线| 色噜噜久久综合| 国产精品久久久久久久久免费丝袜 | 欧美图片一区二区三区| 欧美国产日韩一二三区| 久久av资源网| 91麻豆精品国产91久久久久久久久 | 欧美一区二区免费视频| 一区二区三区精品久久久| 成人国产亚洲欧美成人综合网| 日韩视频一区在线观看| 亚洲一级二级三级| 欧美怡红院视频| 亚洲图片自拍偷拍| 精品视频1区2区| 日本成人在线看| 91精品黄色片免费大全| 日日摸夜夜添夜夜添亚洲女人| 欧美欧美欧美欧美| 婷婷综合在线观看| 欧美女孩性生活视频| 亚洲国产视频直播| 正在播放一区二区| 国产一区二区三区四区在线观看| 久久久久久亚洲综合影院红桃| 国产一区二区三区免费在线观看| xfplay精品久久| 国产69精品久久久久777| 一色屋精品亚洲香蕉网站| 99re6这里只有精品视频在线观看| 亚洲欧洲国产日本综合| 91黄色免费观看| 午夜精品成人在线| 欧美tickling挠脚心丨vk| 国产馆精品极品| 亚洲一区二区四区蜜桃| 日韩一级大片在线| 国产福利一区在线| 亚洲毛片av在线| 日韩一级片在线播放| 成人av在线资源网站| 亚洲一二三四区| 91丝袜美腿高跟国产极品老师| 国产一区二区三区久久久| 久久成人18免费观看| 日韩黄色小视频| 久久99国内精品| 精品亚洲成av人在线观看| 久久精品免费观看| 91蝌蚪porny九色| 亚洲成人自拍网| 久久久久久久国产精品影院| 日本久久一区二区| 久88久久88久久久| 亚洲人成网站在线| 日韩一区二区精品在线观看| 成人av免费在线播放| 亚洲国产视频一区| 国产精品女同互慰在线看| 在线91免费看| 岛国一区二区三区| 青青草原综合久久大伊人精品| 欧美激情一区在线| 欧美一区二区三区喷汁尤物| 粉嫩av一区二区三区| 午夜精品一区在线观看| 美女mm1313爽爽久久久蜜臀| 久久99精品久久久久久久久久久久| 国产电影精品久久禁18| 欧美精品在欧美一区二区少妇| 国产婷婷精品av在线| 天堂久久一区二区三区| 国产一区不卡视频| 欧美日韩久久久久久| 欧美国产综合一区二区| 日韩av网站在线观看| 91亚洲精品一区二区乱码| 精品国产一区二区三区忘忧草| 亚洲男人的天堂在线aⅴ视频| 久久成人羞羞网站| 在线观看免费亚洲| 中文字幕高清不卡| 久久福利视频一区二区| 欧美男人的天堂一二区| 亚洲特级片在线| 久久成人精品无人区| 欧美日韩一区二区在线观看视频 | 婷婷综合五月天| 亚洲电影中文字幕在线观看| 亚洲女人****多毛耸耸8| 欧美激情一区二区三区蜜桃视频| 日韩三级免费观看| 欧美大尺度电影在线| 日韩欧美国产一区二区三区| 91精品国产一区二区人妖| 69p69国产精品| 欧美日韩不卡一区| 欧美一区二区视频在线观看2022| 欧美日本一道本| 欧美一区二区三级| 欧美zozozo| 日韩三级视频中文字幕| 精品粉嫩超白一线天av| 26uuu色噜噜精品一区| 国产欧美一区二区三区沐欲| 久久久午夜精品| 中文字幕精品三区| 国产精品成人免费| 亚洲欧美欧美一区二区三区| 亚洲精品国产精华液| 日韩av电影免费观看高清完整版在线观看| 日韩电影在线一区二区| 乱中年女人伦av一区二区| 国内久久婷婷综合| 不卡的av中国片| 欧洲一区在线电影| 日韩视频一区二区| 久久久久久久网| 国产精品久久久久久一区二区三区 | 99久久久久久99| 欧美在线观看视频在线| 欧美一级日韩免费不卡| 久久午夜老司机| 亚洲欧美视频在线观看| 日韩电影在线一区| 久久国产精品一区二区| 欧美精品三级日韩久久| 日韩av电影免费观看高清完整版 | 97精品电影院| 亚洲专区一二三| 4438x成人网最大色成网站| 久久精品理论片| 欧美极品xxx| 色狠狠桃花综合| 亚洲bt欧美bt精品| 欧美一区二区三区免费大片 | 成人avav影音| 亚洲女性喷水在线观看一区| 色网站国产精品| 日韩综合在线视频| 久久久久久免费网| 色婷婷精品久久二区二区蜜臀av | 视频一区国产视频| 国产精品18久久久久久久久久久久 | 国产成人午夜精品影院观看视频| 欧美亚洲自拍偷拍| 久久精品日产第一区二区三区高清版| 亚洲色欲色欲www在线观看| 久久国产精品免费| 欧美日本一区二区三区四区| 国产精品色呦呦| 国产永久精品大片wwwapp| 欧美日本视频在线| 91精品在线免费观看| 成人一区二区三区视频| 亚洲国产精品久久久久秋霞影院| 日韩一级二级三级| 色综合咪咪久久| 久久国产免费看| 亚洲免费观看在线视频| 精品久久99ma| 在线视频观看一区| 国产一区二区三区在线观看免费视频| 有码一区二区三区| 精品免费一区二区三区| 日本黄色一区二区| 国产一区二区三区高清播放| 亚洲高清不卡在线观看| 欧美国产精品久久| 欧美一级免费大片| 91美女在线看| 极品少妇xxxx精品少妇偷拍| 一区二区三区四区乱视频| 久久久久亚洲综合| 日韩一区二区影院| 92精品国产成人观看免费| 激情综合网av| 亚洲成人自拍偷拍| 一区二区三区在线不卡| 国产欧美精品区一区二区三区 | 欧美老女人在线|