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

Redis?緩存淘汰策略和事務(wù)實(shí)現(xiàn)樂(lè)觀鎖詳情

 更新時(shí)間:2022年07月21日 11:36:26   作者:Miaoshuowen  
這篇文章主要介紹了Redis緩存淘汰策略和事務(wù)實(shí)現(xiàn)樂(lè)觀鎖詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

緩存淘汰策略

標(biāo)題LRU原理

LRU(Least recently used,最近最少使用)算法根據(jù)數(shù)據(jù)的歷史訪問(wèn)記錄來(lái)進(jìn)行淘汰數(shù)據(jù),其核心思想是“如果數(shù)據(jù)最近被訪問(wèn)過(guò),那么將來(lái)被訪問(wèn)的幾率也更高”。

最常見(jiàn)的實(shí)現(xiàn)是使用一個(gè)鏈表保存緩存數(shù)據(jù),詳細(xì)算法實(shí)現(xiàn)如下:

  • 新數(shù)據(jù)插入到鏈表頭部;
  • 每當(dāng)緩存命中(即緩存數(shù)據(jù)被訪問(wèn)),則將數(shù)據(jù)移到鏈表頭部;
  • 當(dāng)鏈表滿的時(shí)候,將鏈表尾部的數(shù)據(jù)丟棄。

在Java中可以使用LinkHashMap去實(shí)現(xiàn)LRU利用哈希鏈表實(shí)現(xiàn):

標(biāo)題Redis緩存淘汰策略

設(shè)置最大緩存

在 redis 中,允許用戶設(shè)置最大使用內(nèi)存大小maxmemory,默認(rèn)為0,沒(méi)有指定最大緩存,如果有新的數(shù)據(jù)添加,超過(guò)最大內(nèi)存,則會(huì)使redis崩潰,所以一定要設(shè)置。

redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候,就會(huì)實(shí)行數(shù)據(jù)淘汰策略。

淘汰策略

redis淘汰策略配置:maxmemory-policy voltile-lru,支持熱配置

redis 提供 6種數(shù)據(jù)淘汰策略:

  • volatile-lru:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
  • volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰
  • volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
  • allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
  • allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
  • no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)

Redis事務(wù)

Redis事務(wù)介紹

  • Redis 的事務(wù)是通過(guò) MULTI 、 EXEC 、 DISCARD 和 WATCH 、UNWATCH這五個(gè)命令來(lái)完成的。
  • Redis 的單個(gè)命令都是原子性的,所以這里需要確保事務(wù)性的對(duì)象是命令集合。
  • Redis 將命令集合序列化并確保處于同一事務(wù)的命令集合連續(xù)且不被打斷的執(zhí)行
  • Redis 不支持回滾操作。 事務(wù)命令

MULTI

用于標(biāo)記事務(wù)塊的開(kāi)始。 Redis會(huì)將后續(xù)的命令逐個(gè)放入隊(duì)列中,然后使用EXEC命令原子化地執(zhí)行這個(gè)命令序列。

語(yǔ)法:

multi

EXEC

在一個(gè)事務(wù)中執(zhí)行所有先前放入隊(duì)列的命令,然后恢復(fù)正常的連接狀態(tài)

語(yǔ)法:

exec

DISCARD

清除所有先前在一個(gè)事務(wù)中放入隊(duì)列的命令,然后恢復(fù)正常的連接狀態(tài)。

語(yǔ)法:

discard

WATCH

當(dāng)某個(gè)[事務(wù)需要按條件執(zhí)行]時(shí),就要使用這個(gè)命令將給定的[鍵設(shè)置為受監(jiān)控]的狀態(tài)。

語(yǔ)法:

watch key [key…]

注意事項(xiàng):使用該命令可以實(shí)現(xiàn) Redis 的樂(lè)觀鎖。

UNWATCH

清除所有先前為一個(gè)事務(wù)監(jiān)控的鍵

語(yǔ)法:

unwatch

命令圖解:

事務(wù)演示:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s1 111
QUEUED
127.0.0.1:6379> hset set1 name zhangsan
QUEUED
127.0.0.1:6379> exec
1) OK
2) (integer) 1
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s2 222
QUEUED
127.0.0.1:6379> hset set2 age 20
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec (error) ERR EXEC without MULTI 
127.0.0.1:6379> watch s1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s1 555
QUEUED 127.0.0.1:6379> exec # 此時(shí)在沒(méi)有exec之前,通過(guò)另一個(gè)命令窗口對(duì)監(jiān)控的s1字段進(jìn)行修改 
(nil)
127.0.0.1:6379> get s1
111

Redis 不支持事務(wù)回滾(為什么呢)

大多數(shù)事務(wù)失敗是因?yàn)檎Z(yǔ)法錯(cuò)誤或者類型錯(cuò)誤,這兩種錯(cuò)誤,在開(kāi)發(fā)階段都是可以預(yù)見(jiàn)的Redis 為了性能方面就忽略了事務(wù)回滾。

Redis樂(lè)觀鎖

樂(lè)觀鎖基于CAS(Compare And Swap)思想(比較并替換),是不具有互斥性,不會(huì)產(chǎn)生鎖等待而消耗資源,但是需要反復(fù)的重試,但也是因?yàn)橹卦嚨臋C(jī)制,能比較快的響應(yīng)。因此我們可以利用redis來(lái)

實(shí)現(xiàn)樂(lè)觀鎖。具體思路如下:

  • 利用redis的watch功能,監(jiān)控這個(gè)redisKey的狀態(tài)值
  • 獲取redisKey的值
  • 創(chuàng)建redis事務(wù)
  • 給這個(gè)key的值+1
  • 然后去執(zhí)行這個(gè)事務(wù),如果key的值被修改過(guò)則回滾,key不加1
public void watch() {
	try {
		String watchKeys = "watchKeys";
		//初始值 value=1
		jedis.set(watchKeys, 1);
		//監(jiān)聽(tīng)key為watchKeys的值
		jedis.watch(watchkeys);
		//開(kāi)啟事務(wù)
		Transaction tx = jedis.multi();
		//watchKeys自增加一
		tx.incr(watchKeys);
		//執(zhí)行事務(wù),如果其他線程對(duì)watchKeys中的value進(jìn)行修改,則該事務(wù)將不會(huì)執(zhí)行
		//通過(guò)redis事務(wù)以及watch命令實(shí)現(xiàn)樂(lè)觀鎖
		List<Object> exec = tx.exec();
		if (exec == null) {
			System.out.println("事務(wù)未執(zhí)行");
		} else {
			System.out.println("事務(wù)成功執(zhí)行,watchKeys的value成功修改");
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		jedis.close();
	}
}

Redis樂(lè)觀鎖實(shí)現(xiàn)秒殺

public class RedisLock {
    public static void main(String[] arg) {
        //庫(kù)存key 
        String redisKey = "stock";
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        try {
            Jedis jedis = new RedisProperties.Jedis("127.0.0.1", 6378);
            // 可以被秒殺的庫(kù)存的初始值,庫(kù)存總共20個(gè)
            jedis.set(redisKey, "0");
            jedis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 1000; i++) {
            executorService.execute(() -> {
                Jedis jedis1 = new Jedis("127.0.0.1", 6378);
                try {
                    jedis1.watch(redisKey);
                    String redisValue = jedis1.get(redisKey);
                    int valInteger = Integer.valueOf(redisValue);
                    String userInfo = UUID.randomUUID().toString();
                    // 沒(méi)有秒完
                    if (valInteger < 20) {
                        Transaction tx = jedis1.multi();
                        tx.incr(redisKey);
                        List list = tx.exec();
                        // 秒成功 失敗返回空l(shuí)ist而不是空
                        if (list != null && list.size() > 0) {
                            System.out.println("用戶:" + userInfo + ",秒殺成 功!當(dāng)前成功人數(shù):" + (valInteger + 1));
                        }
                        // 版本變化,被別人搶了。
                        else {
                            System.out.println("用戶:" + userInfo + ",秒殺失 敗");
                        }
                    }
                    // 秒完了
                    else {
                        System.out.println("已經(jīng)有20人秒殺成功,秒殺結(jié)束");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    jedis1.close();
                }
            });
        }
        executorService.shutdown();
    }
}

到此這篇關(guān)于Redis 緩存淘汰策略和事務(wù)實(shí)現(xiàn)樂(lè)觀鎖詳情的文章就介紹到這了,更多相關(guān)Redis 緩存淘汰策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis 實(shí)現(xiàn)登陸次數(shù)限制的思路詳解

    redis 實(shí)現(xiàn)登陸次數(shù)限制的思路詳解

    這篇文章主要介紹了redis 實(shí)現(xiàn)登陸次數(shù)限制的思路詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Redis key命令key的儲(chǔ)存方式

    Redis key命令key的儲(chǔ)存方式

    這篇文章主要介紹了Redis key命令key的儲(chǔ)存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Redis集群的搭建圖文教程

    Redis集群的搭建圖文教程

    下面小編就為大家分享一篇Redis集群的搭建圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 深入解析Redis中常見(jiàn)的應(yīng)用場(chǎng)景

    深入解析Redis中常見(jiàn)的應(yīng)用場(chǎng)景

    這篇文章主要給大家介紹了關(guān)于Redis中常見(jiàn)的應(yīng)用場(chǎng)景的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Redis中Lua腳本的使用場(chǎng)景示例分析

    Redis中Lua腳本的使用場(chǎng)景示例分析

    通過(guò)使用Lua腳本,可以在Redis中實(shí)現(xiàn)復(fù)雜邏輯和原子操作,如原子計(jì)數(shù)、條件更新、事務(wù)性操作、分布式鎖、批量處理、計(jì)數(shù)器與過(guò)期管理、條件刪除、數(shù)據(jù)聚合等,本文介紹了Redis中Lua腳本的幾種常見(jiàn)使用場(chǎng)景及其Java實(shí)現(xiàn)示例,為開(kāi)發(fā)者提供了一個(gè)參考
    2024-11-11
  • Redis設(shè)置密碼的實(shí)現(xiàn)步驟

    Redis設(shè)置密碼的實(shí)現(xiàn)步驟

    本文主要介紹了Redis設(shè)置密碼的實(shí)現(xiàn)步驟,主要包括兩種方法:臨時(shí)密碼和持久密碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Redis集群水平擴(kuò)展、集群中添加以及刪除節(jié)點(diǎn)的操作

    Redis集群水平擴(kuò)展、集群中添加以及刪除節(jié)點(diǎn)的操作

    這篇文章主要介紹了Redis集群水平擴(kuò)展、集群中添加以及刪除節(jié)點(diǎn)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Redis的Spring客戶端使用小結(jié)

    Redis的Spring客戶端使用小結(jié)

    在Spring中使用Redis,可以極大地提升應(yīng)用程序的性能和響應(yīng)速度,本文主要介紹了Redis的Spring客戶端使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • 淺談Redis在分布式系統(tǒng)中的協(xié)調(diào)性運(yùn)用

    淺談Redis在分布式系統(tǒng)中的協(xié)調(diào)性運(yùn)用

    這篇文章主要介紹了Redis在分布式系統(tǒng)中的協(xié)調(diào)性運(yùn)用,講解了Redis在進(jìn)程和線程的調(diào)度上以及消息隊(duì)列中的作用,需要的朋友可以參考下
    2016-03-03
  • Redis緩存穿透/擊穿工具類的封裝

    Redis緩存穿透/擊穿工具類的封裝

    在實(shí)際生產(chǎn)環(huán)境中,緩存的使用規(guī)范也是一直備受重視的,如果使用的不好,很容易就遇到緩存擊穿、雪崩等嚴(yán)重異常情景。本文為大家準(zhǔn)備了Redis緩存穿透/擊穿工具類的封裝,需要的可以參考一下
    2022-07-07

最新評(píng)論

南投市| 尤溪县| 永善县| 崇礼县| 临猗县| 玉田县| 蛟河市| 增城市| 寻乌县| 拜泉县| 宣城市| 孝昌县| 盱眙县| 宣化县| 汉阴县| 长宁区| 荃湾区| 汉川市| 保亭| 博白县| 海伦市| 阿拉尔市| 尖扎县| 宝山区| 涿州市| 富锦市| 灵川县| 嵩明县| 林芝县| 大荔县| 喀什市| 正定县| 延长县| 永安市| 高台县| 雷山县| 南宫市| 会理县| 桂东县| 保定市| 长葛市|