精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

關(guān)于 緩存穿透/緩存擊穿/緩存雪崩 看這篇文章就夠了

存儲(chǔ) 存儲(chǔ)軟件
一般情況下,去查詢數(shù)據(jù)的話,緩存里面應(yīng)該都是有的,但是防不住黑客呀,如果黑客請(qǐng)求查詢的是數(shù)據(jù)庫(kù)里面根本不存在的數(shù)據(jù),數(shù)據(jù)庫(kù)里面都沒有的數(shù)據(jù),緩存里面肯定也不會(huì)有了,對(duì)吧,那么此時(shí)請(qǐng)求就會(huì)打到咱們的數(shù)據(jù)庫(kù)里面去,這就是緩存穿透。

[[345821]]

本文轉(zhuǎn)載自微信公眾號(hào)「Java極客技術(shù)」,作者鴨血粉絲 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java極客技術(shù)公眾號(hào)。  

國(guó)慶加中秋過去了,大家準(zhǔn)備好學(xué)習(xí)了么?

redis 在項(xiàng)目中用的話,主要就是用作緩存了

既然用作緩存,那就肯定會(huì)有 緩存穿透/緩存擊穿/緩存雪崩 的問題

這篇文章就來說說,遇到這種情況時(shí),該如何去處理

緩存穿透

首先咱們搞明白什么是緩存穿透?這三個(gè)詞這么像,得把概念搞清楚不是

其實(shí)只是從字面意思上來看的話,大概也能知道一點(diǎn)兒,緩存穿透嘛,就是直接穿過了緩存,將請(qǐng)求打到了數(shù)據(jù)庫(kù)上面去

一般情況下,去查詢數(shù)據(jù)的話,緩存里面應(yīng)該都是有的,但是防不住黑客呀,如果黑客請(qǐng)求查詢的是數(shù)據(jù)庫(kù)里面根本不存在的數(shù)據(jù),數(shù)據(jù)庫(kù)里面都沒有的數(shù)據(jù),緩存里面肯定也不會(huì)有了,對(duì)吧,那么此時(shí)請(qǐng)求就會(huì)打到咱們的數(shù)據(jù)庫(kù)里面去,這就是緩存穿透。

你想啊,黑客想要攻擊的話,怎么可能只請(qǐng)求一次呢,肯定是大量的請(qǐng)求過來,因?yàn)槭悄脭?shù)據(jù)庫(kù)里面不存在的 id 來請(qǐng)求的,那么這些請(qǐng)求毫無疑問直接打到了數(shù)據(jù)庫(kù)上面去,那咱們的數(shù)據(jù)庫(kù)可能就會(huì)因?yàn)檫@些大量的請(qǐng)求直接宕掉

如何解決呢?

咱們回到產(chǎn)生這個(gè)問題的場(chǎng)景中,為什么大量的請(qǐng)求會(huì)打到數(shù)據(jù)庫(kù)上面來?因?yàn)榫彺胬锩鏇]有對(duì)應(yīng)的 key 對(duì)吧,所以才會(huì)越過緩存直接到數(shù)據(jù)庫(kù)

那么問題就好解決了嘛,緩存里面沒有對(duì)應(yīng)的 key ?OK ,如果這個(gè) key 數(shù)據(jù)庫(kù)里面也沒有,那我就在 redis 里面,存上這個(gè) key ,值是 null ,這樣如果有查詢這個(gè) key 的請(qǐng)求,我直接返回 null 就完事兒了,也就不用打到數(shù)據(jù)庫(kù)上面去了

注意一下,要記得設(shè)置它的過期時(shí)間,一般三到五分鐘就夠了

但是對(duì)方是個(gè)黑客呀,可能就用一個(gè) key 去請(qǐng)求么?他可能會(huì)在短時(shí)間內(nèi)用大量的 key 來發(fā)送請(qǐng)求,那如果一個(gè) key 就在 redis 中存儲(chǔ)一個(gè) null 值的話,那么多 key 是不是就會(huì)存儲(chǔ)那么多個(gè) null 值嘞?

這樣的話, redis 里面是不是都是值為 null 的了?

所以有沒有更好的解決辦法呢?

那必須得有!布隆過濾器,你值得嘗試

什么是布隆過濾器呢?就是它能告訴你,某個(gè)值一定不存在或者可能存在( emmmm ,也不知道我有沒有說清楚

所以可以將數(shù)據(jù)庫(kù)的內(nèi)容緩存一份到布隆過濾器,這樣的話,當(dāng)大量的請(qǐng)求過來的時(shí)候, redis 里面沒有,沒關(guān)系,再去布隆過濾器過濾一下,這樣請(qǐng)求不用打到數(shù)據(jù)庫(kù)上面去,就能確定這個(gè) key 數(shù)據(jù)庫(kù)中有沒有

這樣不就降低了數(shù)據(jù)庫(kù)的壓力么,可真是個(gè)天才~

緩存擊穿

緩存擊穿說的是,在高并發(fā)情況下,如果好多個(gè)請(qǐng)求都在查詢一個(gè) key ,好巧不巧的是,這個(gè) key 因?yàn)槟承┰蚴Я?比如設(shè)置的過期時(shí)間到了,緩存服務(wù)器宕機(jī)了),這樣就會(huì)導(dǎo)致那么多的請(qǐng)求都直接打到數(shù)據(jù)庫(kù)上面去了

那如果這些請(qǐng)求的數(shù)量足夠大的話,可能直接把數(shù)據(jù)庫(kù)就干掉了

知道了造成結(jié)果的原因,那么尋找解決方案也就好辦了

不是因?yàn)楹枚鄠€(gè)請(qǐng)求打到了數(shù)據(jù)庫(kù)嘛,但是它們請(qǐng)求的都只是一個(gè) key ,所以這里可以使用排斥鎖來實(shí)現(xiàn),第一個(gè)請(qǐng)求達(dá)到請(qǐng)求 key 發(fā)現(xiàn)緩存里面沒有,允許它去數(shù)據(jù)庫(kù)查詢,同時(shí)加鎖,這樣第二個(gè)請(qǐng)求,第三個(gè)請(qǐng)求…都會(huì)被鎖阻塞到當(dāng)前,不會(huì)再打到數(shù)據(jù)庫(kù),這樣就減少了數(shù)據(jù)庫(kù)的并發(fā)壓力

緩存雪崩

緩存雪崩,雪崩雪崩嘛,就比較嚴(yán)重,擊穿說的是一個(gè) key 失效的情況,雪崩指的是大規(guī)模的緩存失效情況的發(fā)生,這是有可能發(fā)生的,比如說我的緩存服務(wù)器宕機(jī)了,那是不是直接就大規(guī)模的緩存失效了;或者說,我當(dāng)時(shí)為了圖省事,好多個(gè) key 設(shè)置的過期時(shí)間都是一樣的,然后剛好在緩存都失效的時(shí)候,好多請(qǐng)求不同的 key 過來了

解決方案的話,其實(shí)就不適合使用加鎖的方式去解決了,因?yàn)檫@是好多請(qǐng)求不同的 key ,它不是一個(gè)嘛

而且嘞,咱們是因?yàn)楹枚鄠€(gè) key 設(shè)置的過期時(shí)間都是一樣的,所以解決方案就是,咱們不設(shè)置同樣的時(shí)間讓緩存失效了,咱們給一個(gè)隨機(jī)時(shí)間,讓緩存隨機(jī)失效,這樣的話,大規(guī)模的緩存失效情況就減少很多了

那還要一種情況呢,就是如果我的緩存服務(wù)器直接宕機(jī)了,這怎么辦?也好弄,來個(gè)集群就解決了,這里只是一個(gè)解決方案,它的落地實(shí)現(xiàn)不是本文重點(diǎn)哈~

再談 布隆過濾器

OK ,你如果看到這里的話,其實(shí)這篇文章的內(nèi)容就說完了

但是我感覺布隆過濾器那塊,我沒有說清楚,所以在這里拿出來詳細(xì)說一說(我知道你一定又在默默夸阿粉是個(gè)暖男了,乖,知道就好了,不要真說出來,我會(huì)害羞的

布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),它是一種概率型的數(shù)據(jù)結(jié)構(gòu),就是它能告訴你“某樣?xùn)|西一定不存在或者可能存在”

你可能會(huì)說,這話剛剛不是說過了嘛,本來就挺拗口的,你咋還說

還不是因?yàn)檫@句話比較重要,我覺得把這句話理解透徹了,那么對(duì)布隆過濾器理解的應(yīng)該也就到位了

來,為了形象生動(dòng)一些,咱們舉個(gè)例子~ 布隆過濾器是一個(gè) bit 向量或者說 bit 數(shù)組,大概長(zhǎng)這樣:

 

現(xiàn)在,我們需要把 “AliPay” 這個(gè)字段給存儲(chǔ)進(jìn)去 大概的存儲(chǔ)過程就是:將要映射的值,使用多個(gè)不同的哈希函數(shù)生成多個(gè)哈希值,然后每個(gè)生成的哈希值指向的 bit 置為 1

以給的為例,我們現(xiàn)在將 “AliPay” 這個(gè)值,通過三個(gè)不同的哈希函數(shù)進(jìn)行映射,那么大概就是這樣了:

 

同樣,現(xiàn)在我要存儲(chǔ)另外一個(gè)值 “WechatPay” ,那么可能映射之后就是下面這樣:

 

細(xì)心的你可能就會(huì)發(fā)現(xiàn), 4 號(hào)位置的值,剛開始不是給 “AliPay” 了么,后來 “WechatPay” 也在那里,這樣的話,值不就給覆蓋掉了嘛

嗯,沒錯(cuò),是被覆蓋掉了

接下來,我們查詢 “Ali” 那么查詢之后,布隆過濾器可能會(huì)給你 “0,1,2” 的值, 結(jié)果呢 “2” 的位置是 0 ,說明沒有任何值映射到這個(gè)位置上來,所以我們就可以判定數(shù)據(jù)庫(kù)里面沒有 “Ali” 這個(gè)值

那我查詢 “AliPay” 的話,毫無疑問,肯定會(huì)返回給我 “1,4,6” ,那我們能說數(shù)據(jù)庫(kù)里面一定有 “AliPay” 么?不能,因?yàn)?“1,4,6” 的值有可能被其他的值給覆蓋到了,所以我們只能說,數(shù)據(jù)庫(kù)里可能存在 “AliPay”

這就是布隆過濾器說的"某個(gè)值一定不存在或者可能存在"

 

乖,你懂了嗎?

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2019-10-12 14:19:05

Redis數(shù)據(jù)庫(kù)緩存

2023-03-10 13:33:00

緩存穿透緩存擊穿緩存雪崩

2019-11-05 14:24:31

緩存雪崩框架

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2020-03-16 14:57:24

Redis面試雪崩

2022-03-08 00:07:51

緩存雪崩數(shù)據(jù)庫(kù)

2022-05-27 07:57:20

緩存穿透緩存雪崩緩存擊穿

2022-11-18 14:34:28

2025-06-30 01:55:00

2023-11-10 14:58:03

2024-03-12 10:44:42

2023-04-14 07:34:19

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩

2023-12-06 13:38:00

Redis緩存穿透緩存擊穿

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2020-03-05 09:09:18

緩存原因方案

2020-12-28 12:37:36

緩存擊穿穿透

2020-10-23 10:46:03

緩存雪崩擊穿

2022-07-11 07:36:36

緩存緩存雪崩緩存擊穿

2021-11-10 07:47:48

Traefik邊緣網(wǎng)關(guān)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

午夜日韩在线观看| 成人午夜电影小说| 日韩中文字幕免费看| 91极品尤物在线播放国产| 日本不卡三区| av色综合久久天堂av综合| 国产91久久婷婷一区二区| 国产传媒视频在线| 成人自拍在线| 日本精品一区二区三区高清| 男女h黄动漫啪啪无遮挡软件| 日批视频免费播放| 日本欧美韩国一区三区| 欧美激情乱人伦一区| 日本xxxxxxxxx18| 成人午夜三级| 91麻豆精品国产91久久久 | 中文字幕乱妇无码av在线| 高潮在线视频| 亚洲男同1069视频| 日韩精品伦理第一区| 狠狠躁日日躁夜夜躁av| 蜜臀av一区二区在线免费观看 | 国产亚洲精久久久久久无码77777| 牛牛影视久久网| 制服丝袜在线91| mm1313亚洲国产精品无码试看| 中文字幕资源网在线观看| 国产女同性恋一区二区| 激情视频在线观看一区二区三区| 91肉色超薄丝袜脚交一区二区| 国产精品入口| 久久久久久尹人网香蕉| 午夜激情福利网| 欧美日韩久久精品| 亚洲精品自拍第一页| 中文字幕在线观看91| 四虎影视成人精品国库在线观看 | 国产精品萝li| 久久久久久久久久久久久久久久av| 99久久免费国产精精品| 久久精品免费看| 国产精品久久久久久av福利软件 | 欧美人妻一区二区三区| 亚洲资源网你懂的| 亚洲精品成人久久久| 精品人妻二区中文字幕| 亚洲综合影院| 欧美xxxxxxxx| 五月天丁香社区| 超碰在线亚洲| 精品国产第一区二区三区观看体验| 51自拍视频在线观看| 国产一区二区久久久久| 欧美一区二区三区在线看| 三级av免费看| 日韩在线视频一区二区三区| 日韩欧美国产综合一区| 久草免费资源站| 动漫视频在线一区| 亚洲精品一区二区三区蜜桃下载| 精品伦一区二区三区| 99久久香蕉| 亚洲国内精品在线| 性欧美成人播放77777| 一区二区三区韩国免费中文网站| 精品亚洲永久免费精品| 欧美丰满少妇人妻精品| 成人黄色小视频| 色诱女教师一区二区三区| 婷婷社区五月天| 欧美日韩ab| 97久久精品人人澡人人爽缅北| 91精品国产乱码久久久张津瑜| 国产精品亚洲产品| 国产精品美乳一区二区免费| 91亚洲国产成人精品一区| 国产一区二区三区综合| 国产欧美日韩一区二区三区| 亚洲欧美综合一区二区| 国产欧美视频一区二区三区| 一区二区三区|亚洲午夜| av网站在线免费| 婷婷国产v国产偷v亚洲高清| 国产精品-区区久久久狼| 高清av一区| 日韩写真欧美这视频| 亚洲成人av免费在线观看| 国产一区二区三区四区五区| 久久亚洲精品成人| 91精品国产乱码久久久张津瑜| 奇米色一区二区三区四区| 亚洲自拍av在线| 午夜黄色小视频| 国产精品久久久久婷婷| 人妻互换免费中文字幕| 欧美aaa视频| 精品精品国产高清a毛片牛牛 | 日韩高清第一页| 国产丝袜一区| xxxxx成人.com| 欧美精品亚洲精品日韩精品| 奇米影视一区二区三区| 狠狠色综合欧美激情| 免费观看久久久久| 欧美午夜片欧美片在线观看| 亚洲热在线视频| 国产一区二区三区四区二区 | 亚洲欧美日韩不卡一区二区三区| 色黄网站在线观看| 欧美无乱码久久久免费午夜一区| 国产精品熟妇一区二区三区四区| av资源久久| 欧美伊久线香蕉线新在线| 国产毛片一区二区三区va在线| 久久免费精品国产久精品久久久久 | 亚洲欧美激情网| 第一区第二区在线| 久久国产精彩视频| 中文字幕乱码视频| 91麻豆精品视频| 99国产精品白浆在线观看免费| 欧美日韩女优| 亚洲欧美色图片| 国产在线免费视频| 国模少妇一区二区三区| 视频在线观看成人| 亚洲天堂资源| 亚洲精品国偷自产在线99热| 欧美成人一二三区| 国内精品免费**视频| 日韩不卡av| 成人影院网站| 日韩精品福利在线| 日韩精品视频免费播放| 国产成人精品亚洲777人妖| 中文字幕久久一区| 日韩免费大片| 日韩中文字幕在线免费观看| 欧美黄色一级大片| 国产亚洲欧美中文| 国产男女激情视频| 欧美极品在线观看| 国产成人在线精品| 国产中文字幕在线播放| 色悠悠久久综合| 老熟妇一区二区| 日韩电影免费一区| 午夜视频久久久| 国产精品99精品一区二区三区∴| 亚洲性日韩精品一区二区| 亚洲欧美日韩一区二区三区四区| 久久久精品综合| 青青青在线视频免费观看| 欧美久久精品一级c片| 国产精品美乳在线观看| 免费大片黄在线观看视频网站| 欧美精品1区2区3区| 国产免费一区二区三区四区| 国产伦精品一区二区三区视频青涩| 中国 免费 av| 一区二区三区四区视频免费观看| 韩国精品久久久999| 性感美女一级片| 日本高清成人免费播放| 欧日韩不卡视频| 国产一区二区三区不卡在线观看 | 欧美日韩亚洲免费| 国产在线|日韩| 久久精品一本久久99精品| av官网在线观看| 五月天亚洲精品| 黄色片网站免费| 国产在线观看免费一区| 国产一二三区在线播放| 日韩有码一区| 国产精品一区电影| 欧美一卡二卡| 亚洲欧美日韩天堂一区二区| 亚洲天堂手机版| 亚洲综合色成人| 51调教丨国产调教视频| 日韩电影在线观看电影| 久久精品在线免费视频| 欧美亚洲色图校园春色| 国产精品日韩久久久久| 3d玉蒲团在线观看| 亚洲精品视频网上网址在线观看 | 国产自产v一区二区三区c| 国产成人永久免费视频| 精品国产一区二区三区小蝌蚪| 亚洲影院在线看| jk漫画禁漫成人入口| 久久精品电影网| 午夜激情小视频| 欧美一区二区三区在线观看视频| 欧美成人aaaaⅴ片在线看| 中文一区一区三区高中清不卡| 国产伦理在线观看| 日本在线不卡视频| 亚洲人精品午夜射精日韩| 欧美3p在线观看| 久久久久久久久久久久久久一区| 亚洲伊人伊成久久人综合网| 91精品国产高清| 哥也色在线视频| 一区二区在线视频| 欧美自拍偷拍第一页| 在线不卡a资源高清| 日本免费在线观看视频| 亚洲一区免费观看| 日韩精品123区| 久久久蜜臀国产一区二区| 久久性爱视频网站| 韩日欧美一区二区三区| 国产理论在线播放| 午夜综合激情| www.av毛片| 国内揄拍国内精品久久| 一区二区三区不卡在线| 国产aⅴ精品一区二区三区久久| 国产成+人+综合+亚洲欧美| 午夜视频在线观看一区二区三区 | 午夜精品久久久久久久99| 在线国产亚洲欧美| 国产免费观看av| 亚洲第一搞黄网站| 欧美日韩中文字幕在线观看| 国产精品久久久久久久久久免费看 | 久久国产一区二区三区| 国产裸舞福利在线视频合集| 亚洲第一区在线| 亚洲精品久久久久久无码色欲四季 | 亚洲靠逼com| 91香蕉视频污在线观看| 国产三级一区二区三区| 欧美色图亚洲激情| 97国产一区二区| av黄色一级片| 白白色亚洲国产精品| 波多野结衣加勒比| 9i在线看片成人免费| 黄色a一级视频| 99re视频精品| 亚洲国产综合视频| 91论坛在线播放| 素人fc2av清纯18岁| 久久综合色鬼综合色| 亚洲欧美视频在线播放| 2021国产精品久久精品| 毛片网站免费观看| 久久精品亚洲国产奇米99 | 亚洲美女淫视频| 青青青在线免费观看| 亚洲女同女同女同女同女同69| 污软件在线观看| 亚洲夂夂婷婷色拍ww47| 国产一级免费av| 韩曰欧美视频免费观看| 国产一级淫片a视频免费观看| 91久久精品一区二区三区| 中文字幕+乱码+中文| 欧美电影一区二区三区| www.精品视频| 亚洲国产精品免费| 黄视频在线播放| 日韩视频免费大全中文字幕| 18+激情视频在线| 97久久伊人激情网| 少妇一区视频| 91亚洲精品一区| 国产精品对白久久久久粗| 欧美极品色图| 99久久久久国产精品| 国产乱子伦精品无码专区| 毛片一区二区| 蜜桃福利午夜精品一区| 成人福利视频网站| 精品人伦一区二区| 亚洲免费av高清| 久久久久久久久久久久久av| 欧美日韩一区二区在线观看 | 91免费观看在线| 国产精品酒店视频| 亚洲国产日韩a在线播放| 国产女主播喷水视频在线观看| 91麻豆精品国产91久久久久久| 婷婷丁香一区二区三区| 国产亚洲精品久久久久久牛牛| a黄色片在线观看| 啪一啪鲁一鲁2019在线视频| 精品一区二区国产| av网站导航在线观看免费| 欧美激情精品久久久久| 亚洲最新无码中文字幕久久| 国产精品网站导航| 三级黄色片在线观看| 一区二区三区产品免费精品久久75| 91浏览器在线观看| 91超碰这里只有精品国产| 在线观看xxx| 久久亚洲精品中文字幕冲田杏梨| 蜜桃视频m3u8在线观看| 91视频免费网站| 亚洲国产精品嫩草影院久久av| 樱花www成人免费视频| 亚洲一区亚洲| 免费看三级黄色片| 国产精品午夜电影| 五月婷婷视频在线| 欧美va日韩va| 黄在线免费看| 日韩免费视频在线观看| 精品一区二区男人吃奶| 午夜啪啪福利视频| 青青草国产精品97视觉盛宴| 制服丝袜第一页在线观看| 亚洲激情六月丁香| 一本色道久久综合精品婷婷| 亚洲精品一区中文| 精精国产xxxx视频在线播放| 超碰97人人在线| 亚洲最新av| 中文字幕在线综合| 国产校园另类小说区| 黄色一级片免费在线观看| 亚洲成成品网站| 美女日批视频在线观看| 91丝袜美腿美女视频网站| 日韩在线理论| 三上悠亚av一区二区三区| 久久久久久久久伊人| 国产一级片毛片| 亚洲精品国精品久久99热 | 国产精品视频观看| 日韩三级一区二区| 亚洲天堂免费在线| 97久久香蕉国产线看观看| 欧洲亚洲一区二区| 男人的天堂成人在线| 人妻丰满熟妇av无码久久洗澡| 亚洲成人综合网站| 水中色av综合| 久久久亚洲精选| 成人爽a毛片免费啪啪红桃视频| 久久久久久久久久伊人| 国产成人免费视频网站高清观看视频| 亚洲综合视频网站| 欧美一级黄色片| 羞羞视频在线免费国产| 999视频在线观看| 激情另类综合| 免费无码一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 欧美日韩国产中文字幕在线| 日韩av三级在线观看| 国产一区二区三区探花| 男人添女人下面免费视频| 国产精品国产三级国产aⅴ中文| 中文字字幕在线中文乱码| 最近2019中文字幕在线高清| 日本电影久久久| 国产又粗又长又爽视频| 波多野洁衣一区| 波多野结衣一区二区在线 | 999福利视频| 日韩一区二区三区四区五区六区| 黄色影院在线看| 久久婷婷国产综合尤物精品| 日韩精品一二三区| 一区二区国产精品精华液| 亚洲爱爱爱爱爱| 成人午夜视屏| 熟妇熟女乱妇乱女网站| 成人av网站免费| 在线免费观看av网址| 日韩中文字幕不卡视频| 深夜福利一区| 成熟老妇女视频| 日韩美女视频一区二区| 欧美性猛交 xxxx| 国产99久久久欧美黑人| 91精品一区二区三区综合在线爱| 最近日本中文字幕| 欧美日韩精品电影| 国内激情视频在线观看| 亚洲综合网中心| 成a人片国产精品| 在线免费观看日韩视频| 久久久免费高清电视剧观看| 国产精品手机在线播放 | 凹凸av导航大全精品| 色婷婷综合久久久久中文字幕| 亚洲美女区一区| 国产日韩精品在线看| 高清国产在线一区| 热久久久久久久| 中国一级特黄毛片| 久久久久999| 精品国产一区二区三区久久久蜜臀 |