[好書分享] 巴比倫致富聖經 - 用10%薪水,賺到100%的人生【經典新譯.漫畫版】

作者: 喬治.山繆.克拉森  
企劃.腳本 大橋弘祐  
插畫: 坂野旭  
原文作者: George Samuel Clason  
出版社:三采文化股份有限公司 
出版日期:2021/07/09 
SBN: 9789576585401 

買書推薦網址:

前言:

這一本是今年所讀完的第十本書。其實這是一本漫畫書,本來是希望可以買來給小孩有基礎的投資概念, 但是沒有想到整個故事裡還蠻寫實的。除了有騙子之外,更有恐怖的戰爭畫面。 不過裡面的故事情節其實都呼應的蠻好的,很現實卻又可以讓人深入思考許多理財的面向。

內容簡介:

│來自古巴比倫的一塊泥板,究竟有什麼神奇魔力……│
故事從日本東京開始,負債累累的考古學家――大場拓也,接到一個解讀伊拉克出土泥板的的工作,沒想到這塊泥板竟然刻著流傳幾世紀的「智慧真理」,就此改變了他的人生。
泥板的主人班錫爾,在古巴比倫是一間不賺錢的兵器鋪接班人,認真、努力卻依然家境窮困。明明家中兵器品質極佳,銷售也不差,到底哪裡出了錯,導致貧窮?要如何才能成為有錢人?班錫爾前往尋找古巴比倫第一大富豪阿卡德,習得了鹹魚翻身的7大箴言、5大法則!開啟「由負到富」的傳奇人生。
如何賺?怎麼存?拖欠債?……這些現代人共同的苦惱,就讓古巴比倫的智慧,為你打開致富大門。

◎吸引黃金的7句箴言
1. 存下收入的1/10。
2. 為欲望訂下優先順序。
3. 讓存款為你工作。
4. 堅守財富,避開危險和天敵。
5. 選擇良好的住所。
6. 從現在開始替未來的生活做好準備。
7. 讓自己成為最大的資本。

◎人生致富5大法則
1. 為家人和自己的將來,存下1/10以上的收入。
2. 為黃金尋覓能夠錢滾錢的投資去處。
3. 認真聆聽理財專家的建言。
4. 只對自己熟悉的領域、投資專家看好的項目進行投資。
5. 企圖謀取不切實際的利益,聽信有心人士的花言巧語,或是盲目相信自己不成熟的經驗,財富將會遠離你。

章節條列

因為是漫畫,我就不透過章節條列的方式來整理。 故事就從一個四處欠債自我放逐跟妻子跟小開分開的日本的歷史學家開始,從他收到了巴比倫的一塊泥板考古開始。 那塊理版的主人是兵器舖的接班人 - 班錫爾的故事。 他從巴比倫最聰明得商人學到了七句箴言,首先先透過「存下收入的 1/10 」很認真的存錢並且學習。 商人見他相當有潛力,給他一袋金幣去好好學習如何投資賺到兩袋金幣。

天真又信心滿滿的班錫爾帶著金幣到了其他的都市,結果路上遇到同路的人慫恿他一起參加賭駱駝。 結果就把一袋金幣的錢花了一半被騙。這就是很重要的「要規避危險」並且不要做自己不熟悉的領域。 透過了破產之後,班錫爾開始認真思考重新把錢存下來。並且透過做生意與了解整個市場的原因。 傾聽專家的建議,也讓自己成為最大的資本。 於是他賺到了兩袋金幣衣錦還鄉。

如果故事就在這邊結束,或許也太幸福了。 回到了巴比倫他加入了商人的振興巴比倫的專案中,一起幫忙讓巴比倫更加富有。但是就是在這個幸福的時候,遇到了其他的國家妒忌巴比倫的富有,開始侵略過來。 班錫爾的家人與商人都在這次的戰爭中過世,讓他悲痛萬分。開始放棄自我,到處欠錢。最後由於聽了別人的故事,最後終於奮發向上也變成了巴比倫重要的導師,指導更多的人學習富有的財富。

而研究這個泥板的日本考古學家了解這些箴言後,也開始不斷努力。後來終於可以努力存錢也爭取回妻子跟小孩。

心得

最近一連看了不少的投資書籍,都不斷的強調的「破產」與「失敗」的痛苦。也強調了心理建設的重要性。 就像是這一篇巴比倫的投資故事一樣。許多人都會因為「運氣」賺到了第一桶金,但是卻往往會因為實力與情緒而一系之間破產。

獲利可以是 5% ~ 6% 慢慢的成長,但是破產一下就變成 0% 。這一切的警語都是要告訴學投資的人要懂的停損與不要過度的擴張信用。這一本書更用了戰爭與欺騙來給予主角血淋淋的教訓。投資或許也是如此,我們真的要懂的讓錢去幫你來賺錢外,更應該要了解不論虧損多少,只要不是一次歸零都還有機會可以重新投資。

[好書分享] 投機者的撲克 - 操盤18年手記

投機者的撲克- 操盤18年手記
投机者的扑克 : 操盘18年手记
作者: 扁蟲魚  出版社:樂金文化 

買書推薦網址:

前言:

這一本是今年所讀完的第九本書。我們家人很有趣,平均一個月會全家大小去逛信義區的誠品。除了吃好吃的午餐外,就是去看一個下午的書。我女兒也很喜歡在誠品看書,常常一個下午就看完一兩本書之外,也是我挑書的好機會。

這一本書好像就是誠品擺在架上推薦的書籍,當時快速翻了一下覺得很不錯。就買了電子書的版本來好好的閱讀。

內容簡介:

   無數投資人敲碗期盼!
  十八年操盤血淚史的寫照,直擊每個股海中人內心最柔軟的深處!

  在股海求勝,你不只需要與市場搏鬥,
  更重要的,是與自己的盲目自負、貪念、恐懼等
  種種不理性相抗衡……

  ◆ 在市場上,為什麼總有這麼多看對行情,卻賠錢的投資人?
  ◆ 為什麼原本以為沒什麼風險的「投資」行為,卻常讓我們認賠殺出?
  ◆ 投資與投機真的涇渭分明嗎?
  ◆ 長期價值投資的未來一定美好嗎?

  眾多讀者不斷敲碗期待再版的話題長銷巨作!
  他曾抄過大頂、逃過大底,親身見證中國股市的興起
  他向你娓娓道來,中國金融市場不為人道的「歷史」
  也講出了一個生活中領悟投機的人,怎樣逆向從投機中領悟生活

章節條列

第一章 了解市場是情緒

一開始提到了「投資」跟「投機」的差別,每一個人都認為自己是投資而不是投機。

價值投資者有一個說法,就是「股價」就像是放出來的狗一樣,會到處亂跑。而價值本身就像是主人一樣緩步前進,但是終究狗會回到主人的身邊。 但是這本書卻提出了一個有趣的說法,有沒有可能你持股的股價就像是「藏獒」一樣? 主人抓都抓不住? 被拖著走?

就像美國的安隆,因為市場喪失信心後。股價就不斷的下跌。 造成死亡螺旋的連鎖反應。

如何逆大眾而行:要逆結果,而非簡單的逆行為

股票是一個少數人獲利的行為,並不是要你直接跟大家對著做,而是要反著大家來思考為什麼會有類似的情形。

  • 有節制的交易
  • 避免只看圖型或是 K 線圖來交易
  • 膽小謹慎是稀有的珍貴

進出的點位,決定你的盈虧。

即便選定一個好股票,如果買得太高,風險就太高,下修的時候也抱不住。 漲跌本來就是在兩段結果中的來回震盪,問題是你能不能抱得住。

  • 漲跌本無意義,你參與後才有意義。
  • 漲跌本無情緒,入場之後你就有了情緒。

市場是一種情緒

行情是市場情緒的產物(或是說全部投資的總和),你的買賣點就是你跟市場情緒的共振。明白了這點,你就知道你需要了解的是市場的未來? 還是多花點時間來研究自我與情緒是如何運作的?
  • 初次受到刺激,有情緒,沒行動。
  • 再次受到刺激,情緒加深,有行動。
  • 小刺激,情緒爆發,情緒有疊加效應,也會造成多種類型的行動。

快樂與平衡

既然知道了自我的情緒與控制往往影響你的獲利,那麼需要好好的控制自己的快樂與情緒。

  • 生活多一點支點:不要只是有交易,避免情緒被牽著走。
  • 用生活平衡來測試交易: 是否下單後,覺得一身輕鬆的感受。可以完全不擔心你的配置?那麼你的投資獲利的機會極大。

保持彈性

不要硬著頭皮跟市場對做,市場就是值得你尊重的高手,要能夠順勢而為。作者指出他投資期貨玉米的時候遇到的慘敗,經過幾次大跌後,他一直不願意相信自己的問題。 最後他靜下心來分析空方的角度來看市場。 就發現了有許多市場不利因素相當有利於空方,於是他開始停損,也就慢慢變得有彈性。

第二章:尋找市場的密碼

多空的轉換: 每個買進來的人都是潛在的空方,因為未來的某一天,你還是會要兌現的時候。

第三章: 交易歷程

不論賺多少倍,破產都只需要一次

李佛摩 (Livemore) (是美國一個投資大師,不過作者這樣寫,每次都讓我以為是中國人) 曾經說過:

市場永遠一個面向,不是牛市也不是熊市,而是正確的一面。

接下來作者分享了他破產的經驗(這次很珍貴的,你需要從其他人破產經驗來了解為什麼失敗)。

  • 滿倉之日就是套牢之時:全部資金下去的時候,往往無法有任何變化的可能性。
  • 認為對手當傻瓜的人,最傻。
  • 敬畏市場的本質就是敬畏對手
  • 到了死之前都還是活著(破產之前都還有機會)
  • 要讓風險意識進入你的血液,交易是生活的一部分,需要讓自己知道如何避免風險。
  • 目標管理第一條就是訂定一個目標,投資第一條就是要訂立好自己的目標。
  • 而目標中第一條就是: 保護本金

第四章: 開啟交易之門

瞭解自己比瞭解市場更重要。

  • 一年中操盤不超過十次
  • 不做短線,也不要天天盯盤
  • 平倉制度與休息模式
    • 會買的是,會賣的是老子,會休息的是爺爺
  • 持倉量的管理(停損機制)
  • 情緒,注意力管理
    • 注意自己的買點是不是跟著市場盲目躁進
    • 賣點是不是又是跟著市場恐慌而平倉

盤前需要問自己的事情:

  • 順市還是逆市
  • 用趨勢的眼光,還是短線的靈感
  • 有跟著主力,還是散戶的中間
  • 準備持有多久
  • 停損點
  • 持股比例
  • 想要抄底還是要抓頂?
  • 有沒有先下一些試試看?
  • 信念堅強嗎
  • 心態平衡嗎?
  • 可以去放鬆不看盤散步嗎?
要迴避的不是低價買進,而是「因為低價,而買進」

離場策略

  • 停損離場(全部)
  • 停利離場(一半):這個狀況下,可以選擇再入場。
  • 獲利離場(三分)
    • 第一次信號(本金)
    • 第二次信號(半倉)
    • 第三次信號(遇到虧損三次,完全離場)
    • 時間止半(設定一段時間後,大盤打不出去)先平倉一半,看狀況。
  • 突發離場(全):
    • 遇到大型突發事件,第一時間先全部離場。
    • 獲利就感謝老天,避免虧損一次出場。
  • 情緒停損(全)
    • 由於家庭,身體或是情緒狀況造成不適合操作股票。

風險控制需要注意的地方

  • 絕不透支跟負債交易
  • 不跟大趨勢做反方向
  • 滿倉即代表風險
  • 絕不攤低成本
  • 不抄底,不逃頂

第五章 投機者的撲克

  • 投資本身就像是賭博,問題在於你有沒有辦法把致勝機率調整到最高。
  • 投資除了提高致勝機率外,降低滿倉機率也就代表有更多彈性。
  • 絕對不要使用倍注法。

第六章 從交易風險中逃生

交易人生的富足關鍵 --- 避免致命打擊(也就是破產)

以下作者列出一些交易市場中經常出現的陷阱:

  • 流動性低的標的: 當持倉過高的時候,容易在流動性低的標的被強性賣空。
  • 資訊不對稱造成可能有資訊落差的市場: 上海期貨銅的市場跟倫敦銅的市場,作者有做空上海的期貨銅,但是做多倫敦的銅。造照理來說應該是很保險的機制。因為跌停造成,強制平倉並且有某些規則造就兩頭都被強制平倉。 這種細節要小心。
  • 錯誤的市場分析圖表: 在震盪得盤勢中,如果給出過於片面的圖表容易有錯誤的解讀。
通常,投機市場中,回饋總是來得真實而直接。 你犯了錯,市場會以適當的方式來修理你的口袋,還有你的自尊心,猶如一份強制的學費。
投資市場中,停損很重要:
- 截斷虧損
- 保護好你的投資心態

停損就是承認自己的錯誤,這是一般投資人最討厭的事情。 但是這卻是可以讓你保持下一場投資動力(還有資金)的重要動作。

第七章: 交易是全天下最好玩的遊戲

  • 根據你投資標的,找出需要觀察的時間點。 不要一直觀察。
  • 當沖需要極大的注意力,很大機率會把自己的健康也當沖掉。
  • 套利遊戲:
    • 跨期套利
    • 跨市場套利
    • 跨品種套利
  • 不要輕易建滿倉位
    • 倉位小,可以變動彈性就比較大。
    • 滿倉後,也就只剩下少數的計策可以使用。
  • 養成良好習慣 – 資金管理。
    • 確定好獲利百分比,作為停利點。(或是部分停利)

第八章: 最強作手的殞落

這邊講的就是李佛摩(Livemore) 的故事,由於我有買他的傳記書: 股票作手回憶錄。我們就不太多敘述。

第九章:學習資訊的解讀與串連

「基差」:現貨跟期貨的價格差異。

  • 「正基差」: 遠期預期價格遠遠高於現貨。(反之: 倒基差)。

關於「熵」

指的是市場中獨特的,無法預見的參數。他代表著混亂無序與不確定因素。某些即時市場解讀充滿了太多不確定性,就是「熵」的存在。即便你有許多自己對於「熵」的判斷,依舊只能跟著這些雜亂無序的資訊來開始預測未來的走勢。

第十章:跟著大師擬定假說

這一個章節講的是「索羅斯」的投資策略,也就是群體心理學的解析。 身為投機者,就像是在一隻羊想要在羊群中判斷羊的走勢。索羅斯就是在研究群體關係與資訊中的相關性,透過這些的相關性來推測未來的走勢。

試著對現在的狀況給出你的判斷(假說),從相反的角度來針對自己提出的判斷去批判與思考。透過雙方的激盪之下,你會慢慢地了解大眾的想法與未來極有可能出現的脈絡。

第十一章:交易中的神蹟

這個章節在講解著,許多時候大盤會有你無法解釋與瞭解的資訊。 這個時候,千萬不要強迫自已去找出相關的脈絡。或許試著去透過「不可以解釋的力量」也就是神的力量,可以讓你獲得平靜。 作者甚至也提出來,可以透過禱告的方式,來讓你內心獲得平靜避免做出過於情緒化的決定。

第十二章:情緒與性格

作者分享自己在寫書的時候,往往會因為情緒與身體的影響造成寫作無法順利完成。投資也是一樣,往往許多時候「懷疑」「恐懼」「自大」等等的負面情緒充斥著,容易讓你在進出間做出不合理的判斷。這格時候建議透過外在條件(指的是肉體的外在),去調整。可以讓自己運動一下,來調整心情。也可以透過「規律的運動」與規律的投資習慣,可以避免讓自己做出過多的干預。

第十三章:交易戰士的修煉

枯坐三年的勇氣  - 日本交易大師

很多時候交易的時間點決定了交易的成敗,所以「有耐心的等待。 並且有等待的耐心」

這個時候需要有交易者的敏銳觸覺外,也要有大師們的魄力與決心。很多時候底部的抄底人人會講,但是卻沒有多少人有相關的勇氣能夠執行。

一個優秀戰士需要有兩種重要因素:

  • 能力
  • 心態

第十四章: 群體心理與殺手遊戲

這個章節要敘述當群體的總數越大的時候,往往情緒就會相當的極端。投機市場也是群體心理的極端呈現,

心得

這是一本完整的心法手冊,跟我剛剛讀完的「一個操盤手的虧損自白」很像。作者經歷過不少的成功交易,卻在一次不小心破產了。這一本書也是從保護你的資產出發。我們從巴菲特的名言經常聽到:「不要虧錢」,但是真正在投機市場(作者比較喜歡稱為「投機」,因為他認為未來是不可測的,我們能做的就是搜集完整的資訊。並且投機下去。但是如果都不查資訊,就是賭博了)。

這本書有提供相當多的心得整理,並且也不斷的提醒以下幾件事情:

  • 不要一次虧損完,絕對要嚴格停損。
  • 不要滿倉,你能變化的手法就變得相對少。
  • 心裡絕對是你要戰勝的,超過市場基本面或是任何內線。
  • 如果心理無法戰勝,試著去運動或是禱告(如果有幫助的話)也是可以。

這會是一本很值得深入閱讀的投資教學書,但是他也有一些淺顯易動的心法與進場策略我覺得獲益良多。

[Golang] 測試 Twitter 認證的流程與抓出你的 Twitter timeline 小專案

img

Twitter API 1.1 三階段認證範例網站

因為 2015 年有做了一個 52 Projects 的挑戰,所以常常有一堆專案都是我已經忘記我有寫過的。直到我收到 PR (Pull Request) ,這邊有一個專案。

https://github.com/kkdai/twitter

我甚至還有為了他寫文章: [Golang] 學習關於Twitter的Three-legged Authentication ,我真的都忘記我寫過這個專案。不過直到有人發了 PR 我才想到這個專案,然後呢? 我其實也忘記這個專案到底還能不能動,於是把當初的範例程式快速的部署到 Heroku 做一個測試。

twitter-web-auth.herokuapp.com/

你可以進入這個網站後,點選 Twitter ICON 認證後,就會顯示最新一篇你的 Twiter Timeline 的訊息。 (好啦,他就醜醜的。

有興趣可以一起來開發 Twitter Go SDK HTTPS://GITHUB.COM/KKDAI/TWITTER

相關連結

[TIL] PTT 加上 CloudFlare 來擋爬蟲 Web Crawler ?

image-20220525172234806

爬蟲出問題

原本有弄一個 PTT 爬蟲來爬一些資料,最近發現好像沒有資料可以看到。 一下去查就發現,好像有個 CloudFlare 擋在前面。

錯誤訊息

2022-05-25T08:45:46.856731+00:00 app[web.1]: <div class="attribution">
2022-05-25T08:45:46.856731+00:00 app[web.1]: DDoS protection by <a rel="noopener noreferrer" href="https://www.cloudflare.com/5xx-error-landing/" target="_blank">Cloudflare</a>
2022-05-25T08:45:46.856731+00:00 app[web.1]: <br />
2022-05-25T08:45:46.856731+00:00 app[web.1]: <span class="ray_id">Ray ID: <code>710cff2fcebb1962</code></span>

只好先放著,有空再來查查看怎麼辦。 有找到一些文章先放著。

相關連結

[好書分享] 當上主管後,難道只能默默崩潰? - Facebook產品設計副總打造和諧團隊的領導之路


當上主管後,難道只能默默崩潰? Facebook產品設計副總打造和諧團隊的領導之路
The Making of a Manager : What to Do When Everyone Looks to You
作者: 卓茱莉  
原文作者: Julie Zhuo  
譯者: 許恬寧  
出版社:時報出版 

買書推薦網址:

前言:

這一本是今年所讀完的第八本書。這一本書也是買了蠻久沒有看的,但是最近想到了一些相關的議題,就想透過這一本書來找答案。這是一個前 FB 設計團隊的大主管寫的書,裡面有包含大家心裡想知道的一些資訊,包括了:

  • 如何從專業的獨立貢獻者變成管理人
  • 如何帶領小團隊
  • 如何帶領團隊成長到大團隊。

蠻推薦大家來看的。

內容簡介:

★ 亞馬遜2019年度最佳商業書、華爾街日報暢銷書。
★ 不論是菜鳥上路,或是識途老馬,這本書都能助你成為理想的管理者。

誰說同事一定會虛心為你的晉升感到開心?
卓茱莉永遠不會忘記升上管理職的第一天,踏進會議室時同事臉上的表情,就像一個厭世少年被強迫參加表妹的寶可夢派對,對著她說:「妳知道妳自己在幹嘛嗎?」

老天,一切都糟透了!

從Facebook實習生一路往上爬的茱莉,非設計科班出身,在25歲升為菜鳥主管後,開啟她一連串深感失敗、沮喪的管理之路。原以為是踏進職涯中令人興奮的下一章,卻發現晉升主管的她「其實不太確定每件事該怎麼做」。

章節條列

Chapter 1 什麼是管理?
Chapter 2 新官上任三個月
Chapter 3 帶領小型團隊
Chapter 4 提供回饋的技巧
Chapter 5 管理自己
Chapter 6 精彩會議
Chapter 7 雇用正確人選
Chapter 8 讓事情發生
Chapter 9 帶領成長中的團隊
Chapter 10 培養文化

這一本敘述著作者帶領著 FB 設計團隊從小團隊逐漸成長到大團隊的一些領導守則。身為創意為上的設計團得管裡者,這一本書有一些蠻有見解的分享:

管理者的重責大任

身為管理者,工作首要環節是「確保團隊知道成功長什麼樣子,而且大家都想要成功的做到那樣。」你要讓每個人知道團隊目標,並且真心認為那個目標很重要。

是否適合管理者

很多公司都開始有 IC (Individual Contributior) (獨立貢獻者:指的是相關技術能力強勁,但是不需要管理團隊的人)。許多資深有能力的工作人員,其實不需要急著讓自己開始管理的相關能力, 反而要認清相關事情:

  • 成為管理者,你的時間將會花在如何讓團隊成長,你的技術能力就沒有足夠的時間來兼顧。
  • 管理者並不是晉升,要當成職務上的轉換。往往「十倍工程師」在許多公司都是炙手可熱的人力。

一定要拿出信任

剛開始從資深貢獻者轉到管理人員的通病就是,無法信任底下的人。作家契坷夫提過:「你一定得信任人,要不然日子過不下去。」,一開始當管理人員需要有足夠的同理心與信任。

管理就是關懷

  • 用關心替代質問
  • 儘量協助,讓他們滿意自己工作
  • 不論成功或是失敗,都關心他們。 讓他們知道,管理者不是只有在做對才會理他們。
  • 協調優秀表現標準
  • 分享與回饋意見

三明治回饋法

  • 先給正面意見,
  • 再講出改善事項

管理自己

  • 減少自己必要會議(剛開始可以,之後要減少)
  • 增加自己管理的時間

良好 1 on 1 範本

  • 雙方設定主題(2~3個)
  • 事先設定主題,不要當天討論,避免發散。
  • 儘量在如何協助。如何關懷。

關於產品

  • 沒有停止的一天,線上服務隨時都在迭代。

關於 FB 讚擴充功能的小故事

  • 原本只有讚,本來想要「噓」
  • 但是「噓」容易讓社交變弱(反對意見),也不清楚。 我反對你文章,還是觀點,還是某一件事情?
  • 後來用「拇指」「愛心」「關懷」「驚訝」來開始互動
  • 引用賈伯斯:「所謂的專注,不是做一個好東西。而是拒絕一堆不錯的點子」。

高階主管的進階課程

  • 與下一階層主管需要部隊統一願景
  • 達成共識
  • 創造願景
  • 對於人事與流程看法一致嗎?
  • 表現不佳的主管
    • 如果有機會,是否會替換掉他?
    • 馬上反饋,設定目標
  • 努力讓自己沒工作,讓自己拉高層次。

心得

這一本書的內容蠻有條理的,也很生動符合現實狀況。 真的能感受到作者從一個獨立貢獻者變成後遇到的相關問題,也能感受到要如何領到一個設計團隊這個相當需要創意與發想的團隊。相信對於開發工程團隊也是如此,許多一對一會議的建議更是讓我受益良多,我覺得許多團隊成長的經驗談,可以讓我們在面對許多事情的時候有一個良好的處理借鏡。 更是有許多帶領團隊的心法,可以讓即將讓團隊變大的管理者好好學習。

[論文解讀][TinyLFU] A Highly Efficient Cache Admission Policy

image-20220504162659830

以前的問題

What is Memory Hierarchy: Definition, Diagram, Architecture and Advantages

不論是記憶體或是任何資料儲存體(或是大家常用的 Redis),都會使用 Cache 來存放短期會反覆使用到的資料。 因為 cache 具有讀取快速,但是容量相對小(且價格較貴)。所以無法將在 Physical memory 的資料全部存上,這時候就是需要有 Cache Replacement Policy (也就是「快取的取代策略」)

一般來說的做法有以下幾種:

  • FIFO (First-In First-Out): 透過先進先出的方式,往往這樣容易有相當大的功耗在於資料不斷的換進來與換出去。
  • LRU(Least Recently Used): 取代資料的時候,會去選擇近來最久的。 (RecentlyUsed –)
  • LFU(Least Frequency Used): 取代資料的時候,選擇最少被讀取到的。 (Read Count ++)

那麼這些聽起來好像都沒有問題,為什麼會需要有 TinyLFU ?

以前演算法有什麼問題。?

LRU 有什麼問題?

LRU(Least Recently Used):最近最久未使用。

它是優先淘汰掉最久未訪問到的數據。缺點是不能很好地應對偶然的突發流量。比如一個數據在一分鐘內的前59秒訪問很多次,而在最後1秒沒有訪問,但是有一批冷門數據在最後一秒進入緩存,那麼熱點數據就會被沖刷掉。

LFU 有什麼問題?

LFU(Least Frequently Used):

最近最少頻率使用。它是優先淘汰掉最不經常使用的數據,需要維護一個表示使用頻率的字段。

  • 操作 LFU 時間複查度是: \(O(log(n))\)
  • 由於取代方案取代方式是挑選短期(取決 cache 大小),來挑選最長使用的。 但是可能發生一個狀況是,如果某份資料短期不常使用,但是長期來說他頻率確是最高的。反而這個狀況會造成沒有效率。

主要有兩個缺點:

一、如果訪問頻率比較高的話,頻率字段會占據一定的空間;

二、無法合理更新新上的熱點數據,比如某個歌手的老歌播放歷史較多,新出的歌如果和老歌一起排序的話,就永無出頭之日。

那要如何解決這些問題呢?

什麼是 TinyLFU ? 是做什麼用?

image-20220504173929676

TinyLFU 解決 LRU 和LFU上述的缺點。W-TinyLFU 算法由論文《TinyLFU: A Highly Efficient Cache Admission Policy》提出。

它主要做兩件事:

一、採用 Count–Min Sketch 算法降低頻率信息帶來的空間耗損;

二、維護一個PK機制保障新上的熱點數據能夠緩存。

Count–Min Sketch 算法類似 Bloom filter 思想,對於頻率統計我們其實不需要一個精確值。存儲數據時,對key進行多次 hash 函數運算後,二維數組不同位置存儲頻率(Caffeine 實際實現的時候是用一維 long 型數組,每個 long 型數字切分成16份,每份4bit,默認15次為最高訪問頻率,每個key實際 hash 瞭四次,落在不同 long 型數字的16份中某個位置)。讀取某個key的訪問次數時,會比較所有位置上的頻率值,取最小值返回。對於所有key的訪問頻率之和有個最大值,當達到最大值時,會進行reset即對各個緩存key的頻率除以2。

TinyLFU藉助了數據流Sketching技術,它可以用小得多的空間存放頻次信息。TinyLFU採用了一種基於滑動窗口的 時間衰減設計機制 ,藉助於一種簡易的 reset 操作:每次添加一條記錄到Sketch的時候,都會給一個計數器上加 1,當計數器達到一個尺寸 W 的時候,把所有記錄的 Sketch 數值都除以 2,該 reset 操作可以起到衰減的作用 。

Sample Code

https://github.com/dgryski/go-tinylfu

這邊稍微列出相關程式碼:

關於 slru

有兩個跟著時間在移動的 list

// Cache is an LRU cache.  It is not safe for concurrent access.
type slruCache struct {
	data           map[string]*list.Element
	onecap, twocap int
	one, two       *list.List
}

來看一下 get 來了解兩個 list 的使用邏輯。

	item := v.Value.(*slruItem)

	// already on list two?
	if item.listid == 2 {
		slru.two.MoveToFront(v)
		return
	}

如果發現要找的資料在 list two ,根據 LRU 的邏輯,把它擺到最前面。

// is there space on the next list?
	if slru.two.Len() < slru.twocap {
		// just do the remove/add
		slru.one.Remove(v)
		item.listid = 2
		slru.data[item.key] = slru.two.PushFront(item)
		return
	}

不在 list two 代表他在 list one 裡面。 這時候把 list one 的 v (也就是我們要找的資料) 搬移到 list two 。

func (slru *slruCache) add(newitem slruItem) {

	newitem.listid = 1

	if slru.one.Len() < slru.onecap || (slru.Len() < slru.onecap+slru.twocap) {
		slru.data[newitem.key] = slru.one.PushFront(&newitem)
		return
	}

	// reuse the tail item
	e := slru.one.Back()
	item := e.Value.(*slruItem)

	delete(slru.data, item.key)

	*item = newitem

	slru.data[item.key] = e
	slru.one.MoveToFront(e)
}

add 邏輯相對簡單,只接從 list one 裡面放一個。

關於 TinyLFU 相關資料

https://github.com/dgryski/go-tinylfu/blob/fba88f4a7f91124e5cc36723834506b20b5bae80/tinylfu.go

type T struct {
	c       *cm4
	bouncer *doorkeeper
	w       int
	samples int
	lru     *lruCache
	slru    *slruCache
	data    map[string]*list.Element
}

關於資料結構:

  • 有兩個 cache 分別是 lruslru 。 ( slru 的內容請參考上面)
  • 資料存放在 data

Paper: https://arxiv.org/abs/1512.00727

TinyLFU: A Highly Efficient Cache Admission Policy

Gil Einziger, Roy Friedman, Ben Manes

This paper proposes to use a frequency based cache admission policy in order to boost the effectiveness of caches subject to skewed access distributions. Given a newly accessed item and an eviction candidate from the cache, our scheme decides, based on the recent access history, whether it is worth admitting the new item into the cache at the expense of the eviction candidate.
Realizing this concept is enabled through a novel approximate LFU structure called TinyLFU, which maintains an approximate representation of the access frequency of a large sample of recently accessed items. TinyLFU is very compact and light-weight as it builds upon Bloom filter theory.
We study the properties of TinyLFU through simulations of both synthetic workloads as well as multiple real traces from several sources. These simulations demonstrate the performance boost obtained by enhancing various replacement policies with the TinyLFU eviction policy. Also, a new combined replacement and eviction policy scheme nicknamed W-TinyLFU is presented. W-TinyLFU is demonstrated to obtain equal or better hit-ratios than other state of the art replacement policies on these traces. It is the only scheme to obtain such good results on all traces.

Redis 有哪一些 Cache Replacement Policy ?

參考: 93面試常問:Redis 記憶體滿了怎麼辦?

實際上Redis定義了幾種策略用來處理這種情況:

  • noeviction(預設策略):對於寫請求不再提供服務,直接返回錯誤(DEL請求和部分特殊請求除外)
  • allkeys-lru:從所有key中使用LRU演算法進行淘汰
  • volatile-lru:從設定了過期時間的key中使用LRU演算法進行淘汰
  • allkeys-random:從所有key中隨機淘汰資料
  • volatile-random:從設定了過期時間的key中隨機淘汰
  • volatile-ttl:在設定了過期時間的key中,根據key的過期時間進行淘汰,越早過期的越優先被淘汰

Reference