<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
LRU(Least recently used,最近最少使用)演演算法根據資料的歷史存取記錄來進行淘汰資料,其核心思想是“如果資料最近被存取過,那麼將來被存取的機率也更高”。
最常見的實現是使用一個連結串列儲存快取資料,詳細演演算法實現如下:
在Java中可以使用LinkHashMap去實現LRU利用雜湊連結串列實現:
在 redis 中,允許使用者設定最大使用記憶體大小maxmemory,預設為0,沒有指定最大快取,如果有新的資料新增,超過最大記憶體,則會使redis崩潰,所以一定要設定。
redis 記憶體資料集大小上升到一定大小的時候,就會實行資料淘汰策略。
redis淘汰策略設定:maxmemory-policy voltile-lru,支援熱設定
redis 提供 6種資料淘汰策略:
用於標記事務塊的開始。 Redis會將後續的命令逐個放入佇列中,然後使用EXEC命令原子化地執行這個命令序列。
語法:
multi
在一個事務中執行所有先前放入佇列的命令,然後恢復正常的連線狀態
語法:
exec
清除所有先前在一個事務中放入佇列的命令,然後恢復正常的連線狀態。
語法:
discard
當某個[事務需要按條件執行]時,就要使用這個命令將給定的[鍵設定為受監控]的狀態。
語法:
watch key [key…]
注意事項:使用該命令可以實現 Redis 的樂觀鎖。
UNWATCH
清除所有先前為一個事務監控的鍵
語法:
unwatch
命令圖解:
事務演示:
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 # 此時在沒有exec之前,通過另一個命令視窗對監控的s1欄位進行修改 (nil) 127.0.0.1:6379> get s1 111
大多數事務失敗是因為語法錯誤或者型別錯誤,這兩種錯誤,在開發階段都是可以預見的Redis 為了效能方面就忽略了事務回滾。
樂觀鎖基於CAS(Compare And Swap)思想(比較並替換),是不具有互斥性,不會產生鎖等待而消耗資源,但是需要反覆的重試,但也是因為重試的機制,能比較快的響應。因此我們可以利用redis來
實現樂觀鎖。具體思路如下:
public void watch() { try { String watchKeys = "watchKeys"; //初始值 value=1 jedis.set(watchKeys, 1); //監聽key為watchKeys的值 jedis.watch(watchkeys); //開啟事務 Transaction tx = jedis.multi(); //watchKeys自增加一 tx.incr(watchKeys); //執行事務,如果其他執行緒對watchKeys中的value進行修改,則該事務將不會執行 //通過redis事務以及watch命令實現樂觀鎖 List<Object> exec = tx.exec(); if (exec == null) { System.out.println("事務未執行"); } else { System.out.println("事務成功執行,watchKeys的value成功修改"); } } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); } }
public class RedisLock { public static void main(String[] arg) { //庫存key String redisKey = "stock"; ExecutorService executorService = Executors.newFixedThreadPool(20); try { Jedis jedis = new RedisProperties.Jedis("127.0.0.1", 6378); // 可以被秒殺的庫存的初始值,庫存總共20個 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(); // 沒有秒完 if (valInteger < 20) { Transaction tx = jedis1.multi(); tx.incr(redisKey); List list = tx.exec(); // 秒成功 失敗返回空list而不是空 if (list != null && list.size() > 0) { System.out.println("使用者:" + userInfo + ",秒殺成 功!當前成功人數:" + (valInteger + 1)); } // 版本變化,被別人搶了。 else { System.out.println("使用者:" + userInfo + ",秒殺失 敗"); } } // 秒完了 else { System.out.println("已經有20人秒殺成功,秒殺結束"); } } catch (Exception e) { e.printStackTrace(); } finally { jedis1.close(); } }); } executorService.shutdown(); } }
到此這篇關於Redis 快取淘汰策略和事務實現樂觀鎖詳情的文章就介紹到這了,更多相關Redis 快取淘汰策略內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45