最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis分布式緩存與秒殺

 更新時間:2023年04月03日 10:12:50   作者:哪吒  
這篇文章主要介紹了Redis分布式緩存與秒殺,單點Redis的問題,主要有數(shù)據(jù)丟失,并發(fā)能力,故障恢復(fù),存儲能力,想進(jìn)一步了解的同學(xué),可以借鑒本文

一、單點Redis的問題

1、數(shù)據(jù)丟失問題

Redis數(shù)據(jù)持久化。

2、并發(fā)能力問題

大家主從集群,實現(xiàn)讀寫分離。

3、故障恢復(fù)問題

利用Redis哨兵,實現(xiàn)健康檢測和自動恢復(fù)。

4、存儲能力問題

搭建分片集群,利用插槽機制實現(xiàn)動態(tài)擴(kuò)容。

二、RDB

RDB全稱Redis Database Backup file(Redis數(shù)據(jù)備份文件),也被叫做Redis數(shù)據(jù)快照。簡單來說就是把內(nèi)存中的所有數(shù)據(jù)都記錄到磁盤中。當(dāng)Redis實例故障重啟后,從磁盤讀取快照文件,恢復(fù)數(shù)據(jù)。
快照文件稱為RDB文件,默認(rèn)是保存在當(dāng)前運行目錄。

Redis內(nèi)部有觸發(fā)RDB的機制,可以在redis.conf文件中找到,格式如下:

bgsave開始時會fork主進(jìn)程得到子進(jìn)程,子進(jìn)程共享主進(jìn)程的內(nèi)存數(shù)據(jù)。完成fork后讀取內(nèi)存數(shù)據(jù)并寫入 RDB 文件。

fork采用的是copy-on-write技術(shù):

  • 當(dāng)主進(jìn)程執(zhí)行讀操作時,訪問共享內(nèi)存;
  • 當(dāng)主進(jìn)程執(zhí)行寫操作時,則會拷貝一份數(shù)據(jù),執(zhí)行寫操作;

RDB方式bgsave的基本流程?

  1. fork主進(jìn)程得到一個子進(jìn)程,共享內(nèi)存空間;
  2. 子進(jìn)程讀取內(nèi)存數(shù)據(jù)并寫入新的RDB文件;
  3. 用新RDB文件替換舊的RDB文件;

RDB會在什么時候執(zhí)行?save 60 1000代表什么含義?

  • 默認(rèn)是服務(wù)停止時;
  • 代表60秒內(nèi)至少執(zhí)行1000次修改則觸發(fā)RDB;

RDB的缺點?

  • RDB執(zhí)行間隔時間長,兩次RDB之間寫入數(shù)據(jù)有丟失的風(fēng)險;
  • fork子進(jìn)程、壓縮、寫出RDB文件都比較耗時;

AOF的命令記錄的頻率也可以通過redis.conf文件來配:

三、AOF

AOF全稱為Append Only File(追加文件)。Redis處理的每一個寫命令都會記錄在AOF文件,可以看做是命令日志文件。

AOF默認(rèn)是關(guān)閉的,需要修改redis.conf配置文件來開啟AOF:

AOF的命令記錄的頻率也可以通過redis.conf文件來配:

配置項刷盤時機優(yōu)點缺點
Always同步刷盤可靠性高,幾乎不丟數(shù)據(jù)性能影響大
everysec每秒刷盤性能適中最多丟失一分鐘的數(shù)據(jù)
no操作系統(tǒng)控制性能最好可靠性較差,可能丟失大量數(shù)據(jù)

 因為是記錄命令,AOF文件會比RDB文件大的多。而且AOF會記錄對同一個key的多次寫操作,但只有最后一次寫操作才有意義。通過執(zhí)行bgrewriteaof命令,可以讓AOF文件執(zhí)行重寫功能,用最少的命令達(dá)到相同效果。

set id 1
set name nezha
set id 2

bgrewriteaof

mset name nezha id 2

Redis也會在觸發(fā)閾值時自動去重寫AOF文件。閾值也可以在redis.conf中配置:

# AOF文件比上次文件 增長超過多少百分比則觸發(fā)重寫auto-aof-rewrite-percentage 100# AOF文件體積最小多大以上才觸發(fā)重寫 auto-aof-rewrite-min-size 64mb 

 RDB和AOF各有自己的優(yōu)缺點,如果對數(shù)據(jù)安全性要求較高,在實際開發(fā)中往往會結(jié)合兩者來使用。

RDBAOF
持久化方式定時對整個內(nèi)存做快照記錄每一次執(zhí)行的命令
數(shù)據(jù)完整性不完整,兩次備份之間會丟失相對完整,取決于刷盤策略
文件大小會有壓縮,文件體積小記錄命令,文件體積很大
宕機恢復(fù)速度很快
數(shù)據(jù)恢復(fù)優(yōu)先級低,因為數(shù)據(jù)完整性不低高,因為數(shù)據(jù)完整性更高
系統(tǒng)資源占用高,大量CPU和內(nèi)存消耗低,主要是磁盤IO資源,但AOF重寫時會占用大量CPU和內(nèi)存資源
使用場景可以容忍數(shù)分鐘的數(shù)據(jù)丟失,追求更快的啟動速度對數(shù)據(jù)安全性要求較高常見

四、Redis優(yōu)化秒殺流程

1、秒殺步驟:

  1. 查詢優(yōu)惠券;
  2. 判斷秒殺商品庫存;
  3. 查詢訂單
  4. 校驗一人一單;
  5. 減庫存;
  6. 創(chuàng)建訂單;

2、Redis優(yōu)化秒殺步驟:

  1. 新增秒殺的優(yōu)惠券,將優(yōu)惠券信息保存到Redis中;
  2. 基于Lua腳本,判斷秒殺商品庫存,一人一單,決定用戶是否秒殺成功;
  3. 如果秒殺成功,將優(yōu)惠券id、用戶id、商品id封裝到阻塞隊列中;
  4. 開啟異步任務(wù),不斷從阻塞隊列中讀取信息,實現(xiàn)異步下單功能;

3、秒殺的lua腳本

 4、調(diào)用秒殺的lua腳本

public Result seckillVoucher(Long voucherId) {
     Long userId = UserHolder.getUser().getId();
     long orderId = redisIdWorker.nextId("order");
     // 1.執(zhí)行l(wèi)ua腳本
     Long result = stringRedisTemplate.execute(
             SECKILL_SCRIPT,
             Collections.emptyList(),
             voucherId.toString(), userId.toString(), String.valueOf(orderId)
     );
     int r = result.intValue();
     // 2.判斷結(jié)果是否為0
     if (r != 0) {
         // 2.1.不為0 ,代表沒有購買資格
         return Result.fail(r == 1 ? "庫存不足" : "不能重復(fù)下單");
     }
     // 3.返回訂單id
     return Result.ok(orderId);
 }

5、通過線程池,操作阻塞隊列

// 線程池
private static final ExecutorService SECKILL_ORDER_EXECUTOR = Executors.newSingleThreadExecutor();

/**
* 在類初始化完成后執(zhí)行
*/
@PostConstruct
private void init() {
    SECKILL_ORDER_EXECUTOR.submit(new VoucherOrderHandler());
}

// 阻塞隊列
private BlockingQueue<VoucherOrder> orderTasks = new ArrayBlockingQueue<>(1024 * 1024);
private class OrderHandler implements Runnable{

    @Override
    public void run() {
        while (true){
            try {
                doSomething();
            } catch (Exception e) {
                log.error("處理訂單異常", e);
            }
        }
    }
}

五、基于Redis實現(xiàn)共享session登錄

基于session實現(xiàn)登錄

基于Redis實現(xiàn)共享session登錄

public class RefreshTokenInterceptor implements HandlerInterceptor {

    private StringRedisTemplate stringRedisTemplate;

    public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1、獲取請求頭中的token
        String token = request.getHeader("authorization");
        if (StrUtil.isBlank(token)) {
            return true;
        }
        // 2、基于TOKEN獲取redis中的用戶
        String key  = LOGIN_USER_KEY + token;
        Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);
        // 3、判斷用戶是否存在
        if (userMap.isEmpty()) {
            return true;
        }
        // 5、將查詢到的hash數(shù)據(jù)轉(zhuǎn)為UserDTO
        UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);
        // 6、存在,保存用戶信息到 ThreadLocal
        UserHolder.saveUser(userDTO);
        // 7、刷新token有效期
        stringRedisTemplate.expire(key, LOGIN_USER_TTL, TimeUnit.MINUTES);
        // 8、放行
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 移除用戶
        UserHolder.removeUser();
    }
}

 到此這篇關(guān)于Redis分布式緩存與秒殺的文章就介紹到這了,更多相關(guān)Redis分布式緩存秒殺內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis刪除某個目錄下的數(shù)據(jù)的實現(xiàn)

    Redis刪除某個目錄下的數(shù)據(jù)的實現(xiàn)

    本文介紹了如何在Redis中刪除指定目錄下的數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • redis中的數(shù)據(jù)結(jié)構(gòu)和編碼詳解

    redis中的數(shù)據(jù)結(jié)構(gòu)和編碼詳解

    本文主要和大家分享幾種Redis數(shù)據(jù)結(jié)構(gòu)詳解,希望文中的案例和代碼,能幫助到大家。
    2020-03-03
  • Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程

    Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程

    但有時候想在windows下折騰下Redis,那么就可以參考下面的方法了,雖然腳本之家小編以前整理了一些,發(fā)現(xiàn)這篇做的比較詳細(xì),下載也給出來了
    2018-08-08
  • 簡介Redis中的showlog功能

    簡介Redis中的showlog功能

    這篇文章主要介紹了簡介Redis中的showlog功能,作者同時對比了DEL命令的性能,需要的朋友可以參考下
    2015-06-06
  • 利用Redis實現(xiàn)SQL伸縮的方法

    利用Redis實現(xiàn)SQL伸縮的方法

    本文主要介紹了如何通過鎖和時間序列等方面來提升傳統(tǒng)數(shù)據(jù)庫的性能等方法,利用Redis實現(xiàn)SQL伸縮,供有需要的朋友們參考。
    2015-09-09
  • Redis分布式鎖的實現(xiàn)方式

    Redis分布式鎖的實現(xiàn)方式

    本文主要介紹了Redis分布式鎖的實現(xiàn)方式,分布式鎖是?滿足分布式系統(tǒng)或集群模式下多進(jìn)程可見并且互斥的鎖。感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • 在項目中使用redis做緩存的一些思路

    在項目中使用redis做緩存的一些思路

    這篇文章主要介紹了在項目中使用redis做緩存的一些思路,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • redis 集群批量操作實現(xiàn)

    redis 集群批量操作實現(xiàn)

    這篇文章主要介紹了redis 集群批量操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • redis+lua實現(xiàn)限流的項目實踐

    redis+lua實現(xiàn)限流的項目實踐

    redis有很多限流的算法(比如:令牌桶,計數(shù)器,時間窗口)等,在分布式里面進(jìn)行限流的話,我們則可以使用redis+lua腳本進(jìn)行限流,下面就來介紹一下redis+lua實現(xiàn)限流
    2023-10-10
  • Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼

    Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼

    這篇文章主要介紹了Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02

最新評論

阿拉善盟| 高淳县| 凯里市| 仙游县| 册亨县| 平泉县| 田东县| 酒泉市| 平塘县| 抚顺市| 霸州市| 沙湾县| 安达市| 林西县| 唐山市| 定结县| 桂林市| 章丘市| 伊金霍洛旗| 利辛县| 丰镇市| 昌都县| 舟山市| 吉首市| 临汾市| 毕节市| 响水县| 隆德县| 珠海市| 体育| 简阳市| 咸宁市| 崇文区| 景德镇市| 镇康县| 大田县| 大渡口区| 抚顺县| 上犹县| 宁强县| 滦平县|