欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Redis應用場(chǎng)景


1.  MySql+Memcached架構的問(wèn)題

  實(shí)際MySQL是適合進(jìn)行海量數據存儲的,通過(guò)Memcached將熱點(diǎn)數據加載到cache,加速訪(fǎng)問(wèn),很多公司都曾經(jīng)使用過(guò)這樣的架構,但隨著(zhù)業(yè)務(wù)數據量的不斷增加,和訪(fǎng)問(wèn)量的持續增長(cháng),我們遇到了很多問(wèn)題:

  1.MySQL需要不斷進(jìn)行拆庫拆表,Memcached也需不斷跟著(zhù)擴容,擴容和維護工作占據大量開(kāi)發(fā)時(shí)間。

  2.Memcached與MySQL數據庫數據一致性問(wèn)題。

  3.Memcached數據命中率低或down機,大量訪(fǎng)問(wèn)直接穿透到DB,MySQL無(wú)法支撐。

  4.跨機房cache同步問(wèn)題。

  眾多NoSQL百花齊放,如何選擇

  最近幾年,業(yè)界不斷涌現出很多各種各樣的NoSQL產(chǎn)品,那么如何才能正確地使用好這些產(chǎn)品,最大化地發(fā)揮其長(cháng)處,是我們需要深入研究和思考的問(wèn)題,實(shí)際歸根結底最重要的是了解這些產(chǎn)品的定位,并且了解到每款產(chǎn)品的tradeoffs,在實(shí)際應用中做到揚長(cháng)避短,總體上這些NoSQL主要用于解決以下幾種問(wèn)題

  1.少量數據存儲,高速讀寫(xiě)訪(fǎng)問(wèn)。此類(lèi)產(chǎn)品通過(guò)數據全部in-momery 的方式來(lái)保證高速訪(fǎng)問(wèn),同時(shí)提供數據落地的功能,實(shí)際這正是Redis最主要的適用場(chǎng)景。

  2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點(diǎn)添加/刪除。

  3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個(gè)完全無(wú)中心的設計,節點(diǎn)之間通過(guò)gossip方式傳遞集群信息,數據保證最終一致性,后者是一個(gè)中心化的方案設計,通過(guò)類(lèi)似一個(gè)分布式鎖服務(wù)來(lái)保證強一致性,數據寫(xiě)入先寫(xiě)內存和redo log,然后定期compat歸并到磁盤(pán)上,將隨機寫(xiě)優(yōu)化為順序寫(xiě),提高寫(xiě)入性能。

  4.Schema free,auto-sharding等。比如目前常見(jiàn)的一些文檔數據庫都是支持schema-free的,直接存儲json格式數據,并且支持auto-sharding等功能,比如mongodb。

  面對這些不同類(lèi)型的NoSQL產(chǎn)品,我們需要根據我們的業(yè)務(wù)場(chǎng)景選擇最合適的產(chǎn)品。

       Redis最適合所有數據in-momory的場(chǎng)景,雖然Redis也提供持久化功能,但實(shí)際更多的是一個(gè)disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那么可能大家就會(huì )有疑問(wèn),似乎Redis更像一個(gè)加強版的Memcached,那么何時(shí)使用Memcached,何時(shí)使用Redis呢?

       如果簡(jiǎn)單地比較Redis與Memcached的區別,大多數都會(huì )得到以下觀(guān)點(diǎn):

     1 、Redis不僅僅支持簡(jiǎn)單的k/v類(lèi)型的數據,同時(shí)還提供list,set,zset,hash等數據結構的存儲。
     2 、Redis支持數據的備份,即master-slave模式的數據備份。
     3 、Redis支持數據的持久化,可以將內存中的數據保持在磁盤(pán)中,重啟的時(shí)候可以再次加載進(jìn)行使用。

2.  Redis常用數據類(lèi)型

Redis最為常用的數據類(lèi)型主要有以下:

  • String
  • Hash
  • List
  • Set
  • Sorted set
  • pub/sub
  • Transactions

在具體描述這幾種數據類(lèi)型之前,我們先通過(guò)一張圖了解下Redis內部?jì)却婀芾碇惺侨绾蚊枋鲞@些不同數據類(lèi)型的:

         首先Redis內部使用一個(gè)redisObject對象來(lái)表示所有的key和value,redisObject最主要的信息如上圖所示:

         type代表一個(gè)value對象具體是何種數據類(lèi)型,

         encoding是不同數據類(lèi)型在redis內部的存儲方式,

         比如:type=string代表value存儲的是一個(gè)普通字符串,那么對應的encoding可以是raw或者是int,如果是int則代表實(shí)際redis內部是按數值型類(lèi)存儲和表示這個(gè)字符串的,當然前提是這個(gè)字符串本身可以用數值表示,比如:"123" "456"這樣的字符串。

       這里需要特殊說(shuō)明一下vm字段,只有打開(kāi)了Redis的虛擬內存功能,此字段才會(huì )真正的分配內存,該功能默認是關(guān)閉狀態(tài)的,該功能會(huì )在后面具體描述。通過(guò)上圖我們可以發(fā)現Redis使用redisObject來(lái)表示所有的key/value數據是比較浪費內存的,當然這些內存管理成本的付出主要也是為了給Redis不同數據類(lèi)型提供一個(gè)統一的管理接口,實(shí)際作者也提供了多種方法幫助我們盡量節省內存使用,我們隨后會(huì )具體討論。



3.  各種數據類(lèi)型應用和實(shí)現方式

下面我們先來(lái)逐一的分析下這7種數據類(lèi)型的使用和內部實(shí)現方式:

  • String:

Strings 數據結構是簡(jiǎn)單的key-value類(lèi)型,value其實(shí)不僅是String,也可以是數字.

常用命令:  set,get,decr,incr,mget 等。

應用場(chǎng)景:String是最常用的一種數據類(lèi)型,普通的key/ value 存儲都可以歸為此類(lèi).即可以完全實(shí)現目前 Memcached 的功能,并且效率更高。還可以享受Redis的定時(shí)持久化,操作日志及 Replication等功能。除了提供與 Memcached 一樣的get、set、incr、decr 等操作外,Redis還提供了下面一些操作:

    • 獲取字符串長(cháng)度
    • 往字符串a(chǎn)ppend內容
    • 設置和獲取字符串的某一段內容
    • 設置及獲取字符串的某一位(bit)
    • 批量設置一系列字符串的內容

實(shí)現方式:String在redis內部存儲默認就是一個(gè)字符串,被redisObject所引用,當遇到incr,decr等操作時(shí)會(huì )轉成數值型進(jìn)行計算,此時(shí)redisObject的encoding字段為int。


  • Hash

常用命令:hget,hset,hgetall 等。

應用場(chǎng)景:在Memcached中,我們經(jīng)常將一些結構化的信息打包成HashMap,在客戶(hù)端序列化后存儲為一個(gè)字符串的值,比如用戶(hù)的昵稱(chēng)、年齡、性別、積分等,這時(shí)候在需要修改其中某一項時(shí),通常需要將所有值取出反序列化后,修改某一項的值,再序列化存儲回去。這樣不僅增大了開(kāi)銷(xiāo),也不適用于一些可能并發(fā)操作的場(chǎng)合(比如兩個(gè)并發(fā)的操作都需要修改積分)。而Redis的Hash結構可以使你像在數據庫中Update一個(gè)屬性一樣只修改某一項屬性值。

        我們簡(jiǎn)單舉個(gè)實(shí)例來(lái)描述下Hash的應用場(chǎng)景,比如我們要存儲一個(gè)用戶(hù)信息對象數據,包含以下信息:

用戶(hù)ID為查找的key,存儲的value用戶(hù)對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來(lái)存儲,主要有以下2種存儲方式:


第一種方式將用戶(hù)ID作為查找key,把其他信息封裝成一個(gè)對象以序列化的方式存儲,這種方式的缺點(diǎn)是,增加了序列化/反序列化的開(kāi)銷(xiāo),并且在需要修改其中一項信息時(shí),需要把整個(gè)對象取回,并且修改操作需要對并發(fā)進(jìn)行保護,引入CAS等復雜問(wèn)題。

第二種方法是這個(gè)用戶(hù)信息對象有多少成員就存成多少個(gè)key-value對兒,用用戶(hù)ID+對應屬性的名稱(chēng)作為唯一標識來(lái)取得對應屬性的值,雖然省去了序列化開(kāi)銷(xiāo)和并發(fā)問(wèn)題,但是用戶(hù)ID為重復存儲,如果存在大量這樣的數據,內存浪費還是非??捎^(guān)的。

那么Redis提供的Hash很好的解決了這個(gè)問(wèn)題,Redis的Hash實(shí)際是內部存儲的Value為一個(gè)HashMap,并提供了直接存取這個(gè)Map成員的接口,如下圖:

也就是說(shuō),Key仍然是用戶(hù)ID, value是一個(gè)Map,這個(gè)Map的key是成員的屬性名,value是屬性值,這樣對數據的修改和存取都可以直接通過(guò)其內部Map的Key(Redis里稱(chēng)內部Map的key為field), 也就是通過(guò) key(用戶(hù)ID) + field(屬性標簽) 就可以操作對應屬性數據了,既不需要重復存儲數據,也不會(huì )帶來(lái)序列化和并發(fā)修改控制的問(wèn)題。很好的解決了問(wèn)題。

這里同時(shí)需要注意,Redis提供了接口(hgetall)可以直接取到全部的屬性數據,但是如果內部Map的成員很多,那么涉及到遍歷整個(gè)內部Map的操作,由于Redis單線(xiàn)程模型的緣故,這個(gè)遍歷操作可能會(huì )比較耗時(shí),而另其它客戶(hù)端的請求完全不響應,這點(diǎn)需要格外注意。

實(shí)現方式:

上面已經(jīng)說(shuō)到Redis Hash對應Value內部實(shí)際就是一個(gè)HashMap,實(shí)際這里會(huì )有2種不同實(shí)現,這個(gè)Hash的成員比較少時(shí)Redis為了節省內存會(huì )采用類(lèi)似一維數組的方式來(lái)緊湊存儲,而不會(huì )采用真正的HashMap結構,對應的value redisObject的encoding為zipmap,當成員數量增大時(shí)會(huì )自動(dòng)轉成真正的HashMap,此時(shí)encoding為ht。

  • List

常用命令:lpush,rpush,lpop,rpop,lrange等。

應用場(chǎng)景:

Redis list的應用場(chǎng)景非常多,也是Redis最重要的數據結構之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結構來(lái)實(shí)現。

Lists 就是鏈表,相信略有數據結構知識的人都應該能理解其結構。使用Lists結構,我們可以輕松地實(shí)現最新消息排行等功能。Lists的另一個(gè)應用就是消息隊列,
可以利用Lists的PUSH操作,將任務(wù)存在Lists中,然后工作線(xiàn)程再用POP操作將任務(wù)取出進(jìn)行執行。Redis還提供了操作Lists中某一段的api,你可以直接查詢(xún),刪除Lists中某一段的元素。

實(shí)現方式:

Redis list的實(shí)現為一個(gè)雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過(guò)帶來(lái)了部分額外的內存開(kāi)銷(xiāo),Redis內部的很多實(shí)現,包括發(fā)送緩沖隊列等也都是用的這個(gè)數據結構。

  • Set

常用命令:

sadd,spop,smembers,sunion 等。

應用場(chǎng)景:

Redis set對外提供的功能與list類(lèi)似是一個(gè)列表的功能,特殊之處在于set是可以自動(dòng)排重的,當你需要存儲一個(gè)列表數據,又不希望出現重復數據時(shí),set是一個(gè)很好的選擇,并且set提供了判斷某個(gè)成員是否在一個(gè)set集合內的重要接口,這個(gè)也是list所不能提供的。

Sets 集合的概念就是一堆不重復值的組合。利用Redis提供的Sets數據結構,可以存儲一些集合性的數據,比如在微博應用中,可以將一個(gè)用戶(hù)所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。Redis還為集合提供了求交集、并集、差集等操作,可以非常方便的實(shí)現如共同關(guān)注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶(hù)端還是存集到一個(gè)新的集合中。

實(shí)現方式:

set 的內部實(shí)現是一個(gè) value永遠為null的HashMap,實(shí)際就是通過(guò)計算hash的方式來(lái)快速排重的,這也是set能提供判斷一個(gè)成員是否在集合內的原因。

  • Sorted Set

常用命令:

zadd,zrange,zrem,zcard等

使用場(chǎng)景:

Redis sorted set的使用場(chǎng)景與set類(lèi)似,區別是set不是自動(dòng)有序的,而sorted set可以通過(guò)用戶(hù)額外提供一個(gè)優(yōu)先級(score)的參數來(lái)為成員排序,并且是插入有序的,即自動(dòng)排序。當你需要一個(gè)有序的并且不重復的集合列表,那么可以選擇sorted set數據結構,比如twitter 的public timeline可以以發(fā)表時(shí)間作為score來(lái)存儲,這樣獲取時(shí)就是自動(dòng)按時(shí)間排好序的。

另外還可以用Sorted Sets來(lái)做帶權重的隊列,比如普通消息的score為1,重要消息的score為2,然后工作線(xiàn)程可以選擇按score的倒序來(lái)獲取工作任務(wù)。讓重要的任務(wù)優(yōu)先執行。

實(shí)現方式:

Redis sorted set的內部使用HashMap和跳躍表(SkipList)來(lái)保證數據的存儲和有序,HashMap里放的是成員到score的映射,而跳躍表里存放的是所有的成員,排序依據是HashMap里存的score,使用跳躍表的結構可以獲得比較高的查找效率,并且在實(shí)現上比較簡(jiǎn)單。

  • Pub/Sub

Pub/Sub 從字面上理解就是發(fā)布(Publish)與訂閱(Subscribe),在Redis中,你可以設定對某一個(gè)key值進(jìn)行消息發(fā)布及消息訂閱,當一個(gè)key值上進(jìn)行了消息發(fā)布后,所有訂閱它的客戶(hù)端都會(huì )收到相應的消息。這一功能最明顯的用法就是用作實(shí)時(shí)消息系統,比如普通的即時(shí)聊天,群聊等功能。

  • Transactions

誰(shuí)說(shuō)NoSQL都不支持事務(wù),雖然Redis的Transactions提供的并不是嚴格的ACID的事務(wù)(比如一串用EXEC提交執行的命令,在執行中服務(wù)器宕機,那么會(huì )有一部分命令執行了,剩下的沒(méi)執行),但是這個(gè)Transactions還是提供了基本的命令打包執行的功能(在服務(wù)器不出問(wèn)題的情況下,可以保證一連串的命令是順序在一起執行的,中間有會(huì )有其它客戶(hù)端命令插進(jìn)來(lái)執行)。Redis還提供了一個(gè)Watch功能,你可以對一個(gè)key進(jìn)行Watch,然后再執行Transactions,在這過(guò)程中,如果這個(gè)Watched的值進(jìn)行了修改,那么這個(gè)Transactions會(huì )發(fā)現并拒絕執行。


4.  Redis實(shí)際應用場(chǎng)景

        Redis在很多方面與其他數據庫解決方案不同:它使用內存提供主存儲支持,而僅使用硬盤(pán)做持久性的存儲;它的數據模型非常獨特,用的是單線(xiàn)程。另一個(gè)大區別在于,你可以在開(kāi)發(fā)環(huán)境中使用Redis的功能,但卻不需要轉到Redis。

轉向Redis當然也是可取的,許多開(kāi)發(fā)者從一開(kāi)始就把Redis作為首選數據庫;但設想如果你的開(kāi)發(fā)環(huán)境已經(jīng)搭建好,應用已經(jīng)在上面運行了,那么更換數據庫框架顯然不那么容易。另外在一些需要大容量數據集的應用,Redis也并不適合,因為它的數據集不會(huì )超過(guò)系統可用的內存。所以如果你有大數據應用,而且主要是讀取訪(fǎng)問(wèn)模式,那么Redis并不是正確的選擇。

        然而我喜歡Redis的一點(diǎn)就是你可以把它融入到你的系統中來(lái),這就能夠解決很多問(wèn)題,比如那些你現有的數據庫處理起來(lái)感到緩慢的任務(wù)。這些你就可以通過(guò)Redis來(lái)進(jìn)行優(yōu)化,或者為應用創(chuàng )建些新的功能。在本文中,我就想探討一些怎樣將Redis加入到現有的環(huán)境中,并利用它的原語(yǔ)命令等功能來(lái)解決 傳統環(huán)境中碰到的一些常見(jiàn)問(wèn)題。在這些例子中,Redis都不是作為首選數據庫。

1、顯示最新的項目列表

下面這個(gè)語(yǔ)句常用來(lái)顯示最新項目,隨著(zhù)數據多了,查詢(xún)毫無(wú)疑問(wèn)會(huì )越來(lái)越慢。

  1. SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT 10   

        在Web應用中,“列出最新的回復”之類(lèi)的查詢(xún)非常普遍,這通常會(huì )帶來(lái)可擴展性問(wèn)題。這令人沮喪,因為項目本來(lái)就是按這個(gè)順序被創(chuàng )建的,但要輸出這個(gè)順序卻不得不進(jìn)行排序操作。

        類(lèi)似的問(wèn)題就可以用Redis來(lái)解決。比如說(shuō),我們的一個(gè)Web應用想要列出用戶(hù)貼出的最新20條評論。在最新的評論邊上我們有一個(gè)“顯示全部”的鏈接,點(diǎn)擊后就可以獲得更多的評論。

        我們假設數據庫中的每條評論都有一個(gè)唯一的遞增的ID字段。

        我們可以使用分頁(yè)來(lái)制作主頁(yè)和評論頁(yè),使用Redis的模板,每次新評論發(fā)表時(shí),我們會(huì )將它的ID添加到一個(gè)Redis列表:

  1. LPUSH latest.comments <ID>   

       我們將列表裁剪為指定長(cháng)度,因此Redis只需要保存最新的5000條評論:

       LTRIM latest.comments 0 5000 

      每次我們需要獲取最新評論的項目范圍時(shí),我們調用一個(gè)函數來(lái)完成(使用偽代碼):

  1. FUNCTION get_latest_comments(start, num_items):  
  2.     id_list = redis.lrange("latest.comments",start,start+num_items - 1)  
  3.     IF id_list.length < num_items  
  4.         id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")  
  5.     END  
  6.     RETURN id_list  
  7. END  

      這里我們做的很簡(jiǎn)單。在Redis中我們的最新ID使用了常駐緩存,這是一直更新的。但是我們做了限制不能超過(guò)5000個(gè)ID,因此我們的獲取ID函數會(huì )一直詢(xún)問(wèn)Redis。只有在start/count參數超出了這個(gè)范圍的時(shí)候,才需要去訪(fǎng)問(wèn)數據庫。

        我們的系統不會(huì )像傳統方式那樣“刷新”緩存,Redis實(shí)例中的信息永遠是一致的。SQL數據庫(或是硬盤(pán)上的其他類(lèi)型數據庫)只是在用戶(hù)需要獲取“很遠”的數據時(shí)才會(huì )被觸發(fā),而主頁(yè)或第一個(gè)評論頁(yè)是不會(huì )麻煩到硬盤(pán)上的數據庫了。

2、刪除與過(guò)濾

      我們可以使用LREM來(lái)刪除評論。如果刪除操作非常少,另一個(gè)選擇是直接跳過(guò)評論條目的入口,報告說(shuō)該評論已經(jīng)不存在。

       有些時(shí)候你想要給不同的列表附加上不同的過(guò)濾器。如果過(guò)濾器的數量受到限制,你可以簡(jiǎn)單的為每個(gè)不同的過(guò)濾器使用不同的Redis列表。畢竟每個(gè)列表只有5000條項目,但Redis卻能夠使用非常少的內存來(lái)處理幾百萬(wàn)條項目。

3、排行榜相關(guān)

      另一個(gè)很普遍的需求是各種數據庫的數據并非存儲在內存中,因此在按得分排序以及實(shí)時(shí)更新這些幾乎每秒鐘都需要更新的功能上數據庫的性能不夠理想。

      典型的比如那些在線(xiàn)游戲的排行榜,比如一個(gè)Facebook的游戲,根據得分你通常想要:

         - 列出前100名高分選手

         - 列出某用戶(hù)當前的全球排名

      這些操作對于Redis來(lái)說(shuō)小菜一碟,即使你有幾百萬(wàn)個(gè)用戶(hù),每分鐘都會(huì )有幾百萬(wàn)個(gè)新的得分。

      模式是這樣的,每次獲得新得分時(shí),我們用這樣的代碼:

      ZADD leaderboard  <score>  <username> 

     你可能用userID來(lái)取代username,這取決于你是怎么設計的。

      得到前100名高分用戶(hù)很簡(jiǎn)單:ZREVRANGE leaderboard 0 99。

      用戶(hù)的全球排名也相似,只需要:ZRANK leaderboard <username>。


4、按照用戶(hù)投票和時(shí)間排序

      排行榜的一種常見(jiàn)變體模式就像Reddit或Hacker News用的那樣,新聞按照類(lèi)似下面的公式根據得分來(lái)排序:

       score = points / time^alpha 

      因此用戶(hù)的投票會(huì )相應的把新聞挖出來(lái),但時(shí)間會(huì )按照一定的指數將新聞埋下去。下面是我們的模式,當然算法由你決定。

      模式是這樣的,開(kāi)始時(shí)先觀(guān)察那些可能是最新的項目,例如首頁(yè)上的1000條新聞都是候選者,因此我們先忽視掉其他的,這實(shí)現起來(lái)很簡(jiǎn)單。

      每次新的新聞貼上來(lái)后,我們將ID添加到列表中,使用LPUSH + LTRIM,確保只取出最新的1000條項目。

      有一項后臺任務(wù)獲取這個(gè)列表,并且持續的計算這1000條新聞中每條新聞的最終得分。計算結果由ZADD命令按照新的順序填充生成列表,老新聞則被清除。這里的關(guān)鍵思路是排序工作是由后臺任務(wù)來(lái)完成的。


5、處理過(guò)期項目

      另一種常用的項目排序是按照時(shí)間排序。我們使用unix時(shí)間作為得分即可。

      模式如下:

       - 每次有新項目添加到我們的非Redis數據庫時(shí),我們把它加入到排序集合中。這時(shí)我們用的是時(shí)間屬性,current_time和time_to_live。

       - 另一項后臺任務(wù)使用ZRANGE…SCORES查詢(xún)排序集合,取出最新的10個(gè)項目。如果發(fā)現unix時(shí)間已經(jīng)過(guò)期,則在數據庫中刪除條目。


6、計數

       Redis是一個(gè)很好的計數器,這要感謝INCRBY和其他相似命令。

       我相信你曾許多次想要給數據庫加上新的計數器,用來(lái)獲取統計或顯示新信息,但是最后卻由于寫(xiě)入敏感而不得不放棄它們。

       好了,現在使用Redis就不需要再擔心了。有了原子遞增(atomic increment),你可以放心的加上各種計數,用GETSET重置,或者是讓它們過(guò)期。

       例如這樣操作:

         INCR user:<id> EXPIRE 

         user:<id> 60 

       你可以計算出最近用戶(hù)在頁(yè)面間停頓不超過(guò)60秒的頁(yè)面瀏覽量,當計數達到比如20時(shí),就可以顯示出某些條幅提示,或是其它你想顯示的東西。

7、特定時(shí)間內的特定項目

        另一項對于其他數據庫很難,但Redis做起來(lái)卻輕而易舉的事就是統計在某段特點(diǎn)時(shí)間里有多少特定用戶(hù)訪(fǎng)問(wèn)了某個(gè)特定資源。比如我想要知道某些特定的注冊用戶(hù)或IP地址,他們到底有多少訪(fǎng)問(wèn)了某篇文章。

      每次我獲得一次新的頁(yè)面瀏覽時(shí)我只需要這樣做:

       SADD page:day1:<page_id> <user_id> 

      當然你可能想用unix時(shí)間替換day1,比如time()-(time()%3600*24)等等。

      想知道特定用戶(hù)的數量嗎?只需要使用SCARD page:day1:<page_id>。

       需要測試某個(gè)特定用戶(hù)是否訪(fǎng)問(wèn)了這個(gè)頁(yè)面?SISMEMBER page:day1:<page_id>。


8、實(shí)時(shí)分析正在發(fā)生的情況,用于數據統計與防止垃圾郵件等

        我們只做了幾個(gè)例子,但如果你研究Redis的命令集,并且組合一下,就能獲得大量的實(shí)時(shí)分析方法,有效而且非常省力。使用Redis原語(yǔ)命令,更容易實(shí)施垃圾郵件過(guò)濾系統或其他實(shí)時(shí)跟蹤系統。


9、Pub/Sub

       Redis的Pub/Sub非常非常簡(jiǎn)單,運行穩定并且快速。支持模式匹配,能夠實(shí)時(shí)訂閱與取消頻道。

10、隊列

        你應該已經(jīng)注意到像list push和list pop這樣的Redis命令能夠很方便的執行隊列操作了,但能做的可不止這些:比如Redis還有list pop的變體命令,能夠在列表為空時(shí)阻塞隊列。

       現代的互聯(lián)網(wǎng)應用大量地使用了消息隊列(Messaging)。消息隊列不僅被用于系統內部組件之間的通信,同時(shí)也被用于系統跟其它服務(wù)之間的交互。消息隊列的使用可以增加系統的可擴展性、靈活性和用戶(hù)體驗。非基于消息隊列的系統,其運行速度取決于系統中最慢的組件的速度(注:短板效應)。而基于消息隊列可以將系統中各組件解除耦合,這樣系統就不再受最慢組件的束縛,各組件可以異步運行從而得以更快的速度完成各自的工作。

    此外,當服務(wù)器處在高并發(fā)操作的時(shí)候,比如頻繁地寫(xiě)入日志文件??梢岳孟㈥犃袑?shí)現異步處理。從而實(shí)現高性能的并發(fā)操作。


11、緩存

        Redis的緩存部分值得寫(xiě)一篇新文章,我這里只是簡(jiǎn)單的說(shuō)一下。Redis能夠替代memcached,讓你的緩存從只能存儲數據變得能夠更新數據,因此你不再需要每次都重新生成數據了。

此部分內容的原文地址:http://antirez.com/post/take-advantage-of-redis-adding-it-to-your-stack.html

 

5.  國內外三個(gè)不同領(lǐng)域巨頭分享的Redis實(shí)戰經(jīng)驗及使用場(chǎng)景

   

     隨著(zhù)應用對高性能需求的增加,NoSQL逐漸在各大名企的系統架構中生根發(fā)芽。這里我們將為大家分享社交巨頭新浪微博、傳媒巨頭Viacom及圖片分享領(lǐng)域佼佼者Pinterest帶來(lái)的Redis實(shí)踐,首先我們看新浪微博 @啟盼cobain的Redis實(shí)戰經(jīng)驗分享:

一、新浪微博:史上最大的Redis集群

Tape is Dead,Disk is Tape,Flash is Disk,RAM Locality is King. — Jim Gray

Redis不是比較成熟的memcache或者M(jìn)ysql的替代品,是對于大型互聯(lián)網(wǎng)類(lèi)應用在架構上很好的補充?,F在有越來(lái)越多的應用也在紛紛基于Redis做架構的改造。首先簡(jiǎn)單公布一下Redis平臺實(shí)際情況:

  • 2200+億 commands/day 5000億Read/day 500億Write/day
  • 18TB+ Memory
  • 500+ Servers in 6 IDC 2000+instances

應該是國內外比較大的Redis使用平臺,今天主要從應用角度談?wù)凴edis服務(wù)平臺。

Redis使用場(chǎng)景

1.Counting(計數)

計數的應用在另外一篇文章里較詳細的描述,計數場(chǎng)景的優(yōu)化 http://www.xdata.me/?p=262這里就不多加描述了。

可以預見(jiàn)的是,有很多同學(xué)認為把計數全部存在內存中成本非常高,我在這里用個(gè)圖表來(lái)表達下我的觀(guān)點(diǎn):

很多情況大家都會(huì )設想純使用內存的方案會(huì )很有很高成本,但實(shí)際情況往往會(huì )有一些不一樣:

  • COST,對于有一定吞吐需求的應用來(lái)說(shuō),肯定會(huì )單獨申請DB、Cache資源,很多擔心DB寫(xiě)入性能的同學(xué)還會(huì )主動(dòng)將DB更新記入異步隊列,而這三塊的資源的利用率一般都不會(huì )太高。資源算下來(lái),你驚異的發(fā)現:反而純內存的方案會(huì )更精簡(jiǎn)!
  • KISS原則,這對于開(kāi)發(fā)是非常友好的,我只需要建立一套連接池,不用擔心數據一致性的維護,不用維護異步隊列。
  • Cache穿透風(fēng)險,如果后端使用DB,肯定不會(huì )提供很高的吞吐能力,cache宕機如果沒(méi)有妥善處理,那就悲劇了。
  • 大多數的起始存儲需求,容量較小。

2.Reverse cache(反向cache)

面對微博常常出現的熱點(diǎn),如最近出現了較為火爆的短鏈,短時(shí)間有數以萬(wàn)計的人點(diǎn)擊、跳轉,而這里會(huì )常常涌現一些需求,比如我們向快速在跳轉時(shí)判定用戶(hù)等級,是否有一些賬號綁定,性別愛(ài)好什么的,已給其展示不同的內容或者信息。

普通采用memcache+Mysql的解決方案,當調用id合法的情況下,可支撐較大的吞吐。但當調用id不可控,有較多垃圾用戶(hù)調用時(shí),由于memcache未有命中,會(huì )大量的穿透至Mysql服務(wù)器,瞬間造成連接數瘋長(cháng),整體吞吐量降低,響應時(shí)間變慢。

這里我們可以用redis記錄全量的用戶(hù)判定信息,如string key:uid int:type,做一次反向的cache,當用戶(hù)在redis快速獲取自己等級等信息后,再去Mc+Mysql層去獲取全量信息。如圖:

當然這也不是最優(yōu)化的場(chǎng)景,如用Redis做bloomfilter,可能更加省用內存。

3.Top 10 list

產(chǎn)品運營(yíng)總會(huì )讓你展示最近、最熱、點(diǎn)擊率最高、活躍度最高等等條件的top list。很多更新較頻繁的列表如果使用MC+MySQL維護的話(huà)緩存失效的可能性會(huì )比較大,鑒于占用內存較小的情況,使用Redis做存儲也是相當不錯的。

4.Last Index

用戶(hù)最近訪(fǎng)問(wèn)記錄也是redis list的很好應用場(chǎng)景,lpush lpop自動(dòng)過(guò)期老的登陸記錄,對于開(kāi)發(fā)來(lái)說(shuō)還是非常友好的。

5.Relation List/Message Queue

這里把兩個(gè)功能放在最后,因為這兩個(gè)功能在現實(shí)問(wèn)題當中遇到了一些困難,但在一定階段也確實(shí)解決了我們很多的問(wèn)題,故在這里只做說(shuō)明。

Message Queue就是通過(guò)list的lpop及l(fā)push接口進(jìn)行隊列的寫(xiě)入和消費,由于本身性能較好也能解決大部分問(wèn)題。

6.Fast transaction with Lua

Redis 的Lua的功能擴展實(shí)際給Redis帶來(lái)了更多的應用場(chǎng)景,你可以編寫(xiě)若干command組合作為一個(gè)小型的非阻塞事務(wù)或者更新邏輯,如:在收到message推送時(shí),同時(shí)1.給自己的增加一個(gè)未讀的對話(huà) 2.給自己的私信增加一個(gè)未讀消息 3.最后給發(fā)送人回執一個(gè)完成推送消息,這一層邏輯完全可以在Redis Server端實(shí)現。

但是,需要注意的是Redis會(huì )將lua script的全部?jì)热萦涗浽赼of和傳送給slave,這也將是對磁盤(pán),網(wǎng)卡一個(gè)不小的開(kāi)銷(xiāo)。

7.Instead of Memcache

  1. 很多測試和應用均已證明,
  2. 在性能方面Redis并沒(méi)有落后memcache多少,而單線(xiàn)程的模型給Redis反而帶來(lái)了很強的擴展性。
  3. 在很多場(chǎng)景下,Redis對同一份數據的內存開(kāi)銷(xiāo)是小于memcache的slab分配的。
  4. Redis提供的數據同步功能,其實(shí)是對cache的一個(gè)強有力功能擴展。

Redis使用的重要點(diǎn)

1.rdb/aof Backup!

我們線(xiàn)上的Redis 95%以上是承擔后端存儲功能的,我們不僅用作cache,而更為一種k-v存儲,他完全替代了后端的存儲服務(wù)(MySQL),故其數據是非常重要的,如果出現數據污染和丟失,誤操作等情況,將是難以恢復的。所以備份是非常必要的!為此,我們有共享的hdfs資源作為我們的備份池,希望能隨時(shí)可以還原業(yè)務(wù)所需數據。

2.Small item & Small instance!

由于Redis單線(xiàn)程(嚴格意義上不是單線(xiàn)程,但認為對request的處理是單線(xiàn)程的)的模型,大的數據結構list,sorted set,hash set的批量處理就意味著(zhù)其他請求的等待,故使用Redis的復雜數據結構一定要控制其單key-struct的大小。

另外,Redis單實(shí)例的內存容量也應該有嚴格的限制。單實(shí)例內存容量較大后,直接帶來(lái)的問(wèn)題就是故障恢復或者Rebuild從庫的時(shí)候時(shí)間較長(cháng),而更糟糕的是,Redis rewrite aof和save rdb時(shí),將會(huì )帶來(lái)非常大且長(cháng)的系統壓力,并占用額外內存,很可能導致系統內存不足等嚴重影響性能的線(xiàn)上故障。我們線(xiàn)上96G/128G內存服務(wù)器不建議單實(shí)例容量大于20/30G。

3.Been Available!

業(yè)界資料和使用比較多的是Redis sentinel(哨兵)

http://www.huangz.me/en/latest/storage/redis_code_analysis/sentinel.html

http://qiita.com/wellflat/items/8935016fdee25d4866d9

2000行C實(shí)現了服務(wù)器狀態(tài)檢測,自動(dòng)故障轉移等功能。

但由于自身實(shí)際架構往往會(huì )復雜,或者考慮的角度比較多,為此 @許琦eryk和我一同做了hypnos項目。

hypnos是神話(huà)中的睡神,字面意思也是希望我們工程師無(wú)需在休息時(shí)間處理任何故障。:-)

其工作原理示意如下:

Talk is cheap, show me your code! 稍后將單獨寫(xiě)篇博客細致講下Hypnos的實(shí)現。

4.In Memory or not?

發(fā)現一種情況,開(kāi)發(fā)在溝通后端資源設計的時(shí)候,常常因為習慣使用和錯誤了解產(chǎn)品定位等原因,而忽視了對真實(shí)使用用戶(hù)的評估。也許這是一份歷史數據,只有最近一天的數據才有人進(jìn)行訪(fǎng)問(wèn),而把歷史數據的容量和最近一天請求量都拋給內存類(lèi)的存儲現實(shí)是非常不合理的。

所以當你在究竟使用什么樣的數據結構存儲的時(shí)候,請務(wù)必先進(jìn)行成本衡量,有多少數據是需要存儲在內存中的?有多少數據是對用戶(hù)真正有意義的。因為這其實(shí)對后端資源的設計是至關(guān)重要的,1G的數據容量和1T的數據容量對于設計思路是完全不一樣的

Plans in future?

1.slave sync改造

全部改造線(xiàn)上master-slave數據同步機制,這一點(diǎn)我們借鑒了MySQL Replication的思路,使用rdb+aof+pos作為數據同步的依據,這里簡(jiǎn)要說(shuō)明為什么官方提供的psync沒(méi)有很好的滿(mǎn)足我們的需求:

假設A有兩個(gè)從庫B及C,及 A `— B&C,這時(shí)我們發(fā)現master A服務(wù)器有宕機隱患需要重啟或者A節點(diǎn)直接宕機,需要切換B為新的主庫,如果A、B、C不共享rdb及aof信息,C在作為B的從庫時(shí),仍會(huì )清除自身數據,因為C節點(diǎn)只記錄了和A節點(diǎn)的同步狀況。

故我們需要有一種將A`–B&C 結構切換切換為A`–B`–C結構的同步機制,psync雖然支持斷點(diǎn)續傳,但仍無(wú)法支持master故障的平滑切換。

實(shí)際上我們已經(jīng)在我們定制的Redis計數服務(wù)上使用了如上功能的同步,效果非常好,解決了運維負擔,但仍需向所有Redis服務(wù)推廣,如果可能我們也會(huì )向官方Redis提出相關(guān)sync slave的改進(jìn)。

2.更適合redis的name-system Or proxy

細心的同學(xué)發(fā)現我們除了使用DNS作為命名系統,也在zookeeper中有一份記錄,為什么不讓用戶(hù)直接訪(fǎng)問(wèn)一個(gè)系統,zk或者DNS選擇其一呢?

其實(shí)還是很簡(jiǎn)單,命名系統是個(gè)非常重要的組件,而dns是一套比較完善的命名系統,我們?yōu)榇俗隽撕芏喔倪M(jìn)和試錯,zk的實(shí)現還是相對復雜,我們還沒(méi)有較強的把控粒度。我們也在思考用什么做命名系統更符合我們需求。

3.后端數據存儲

大內存的使用肯定是一個(gè)重要的成本優(yōu)化方向,flash盤(pán)及分布式的存儲也在我們未來(lái)計劃之中。(原文鏈接: Largest Redis Clusters Ever

二、Pinterest:Reids維護上百億的相關(guān)性

      Pinterest已經(jīng)成為硅谷最瘋故事之一,在2012年,他們基于PC的業(yè)務(wù)增加1047%,移動(dòng)端采用增加1698%, 該年3月其獨立訪(fǎng)問(wèn)數量更飆升至533億。在Pinterest,人們關(guān)注的事物以百億記——每個(gè)用戶(hù)界面都會(huì )查詢(xún)某個(gè)board或者是用戶(hù)是否關(guān)注的行為促成了異常復雜的工程問(wèn)題。這也讓Redis獲得了用武之地。經(jīng)過(guò)數年的發(fā)展,Pinterest已經(jīng)成為媒體、社交等多個(gè)領(lǐng)域的佼佼者,其輝煌戰績(jì)如下:

  • 獲得的推薦流量高于Google+、YouTube及LinkedIn三者的總和
  • 與Facebook及Twitter一起成為最流行的三大社交網(wǎng)絡(luò )
  • 參考Pinterest進(jìn)行購買(mǎi)的用戶(hù)比其它網(wǎng)站更高( 更多詳情

如您所想,基于其獨立訪(fǎng)問(wèn)數,Pinterest的高規模促成了一個(gè)非常高的IT基礎設施需求。

 

通過(guò)緩存來(lái)優(yōu)化用戶(hù)體驗

近日,Pinterest工程經(jīng)理Abhi Khune對其公司的用戶(hù)體驗需求及Redis的使用經(jīng)驗 進(jìn)行了分享。即使是滋生的應用程序打造者,在分析網(wǎng)站的細節之前也不會(huì )理解這些特性,因此先大致的理解一下使用場(chǎng)景:首先,為每個(gè)粉絲進(jìn)行提及到的預檢查;其次,UI將準確的顯示用戶(hù)的粉絲及關(guān)注列表分頁(yè)。高效的執行這些操作,每次點(diǎn)擊都需要非常高的性能架構。

不能免俗,Pinterest的軟件工程師及架構師已經(jīng)使用了MySQL及memcache,但是緩存解決方案仍然達到了他們的瓶頸;因此為了擁有更好的用戶(hù)體驗,緩存必須被擴充。而在實(shí)際操作過(guò)程中,工程團隊已然發(fā)現緩存只有當用戶(hù)sub-graph已經(jīng)在緩存中時(shí)才會(huì )起到作用。因此。任何使用這個(gè)系統的人都需要被緩存,這就導致了整個(gè)圖的緩存。同時(shí),最常見(jiàn)的查詢(xún)“用戶(hù)A是否關(guān)注了用戶(hù)B”的答案經(jīng)常是否定的,然而這卻被作為了緩存丟失,從而促成一個(gè)數據庫查詢(xún),因此他們需要一個(gè)新的方法來(lái)擴展緩存。最終,他們團隊決定使用Redis來(lái)存儲整個(gè)圖,用以服務(wù)眾多的列表。

使用Redis存儲大量的Pinterest列表

Pinterest使用了Redis作為解決方案,并將性能推至了內存數據庫等級,為用戶(hù)保存多種類(lèi)型列表:

  • 關(guān)注者列表
  • 你所關(guān)注的board列表
  • 粉絲列表
  • 關(guān)注你board的用戶(hù)列表
  • 某個(gè)用戶(hù)中board中你沒(méi)有關(guān)注的列表
  • 每個(gè)board的關(guān)注者及非關(guān)注者

Redis為其7000萬(wàn)用戶(hù)存儲了以上的所有列表,本質(zhì)上講可以說(shuō)是儲存了所有粉絲圖,通過(guò)用戶(hù)ID分片。鑒于你可以通過(guò)類(lèi)型來(lái)查看以上列表的數據,分析概要信息被用看起來(lái)更像事務(wù)的系統儲存及訪(fǎng)問(wèn)。Pinterest當下的用戶(hù)like被限制為10萬(wàn),初略進(jìn)行統計:如果每個(gè)用戶(hù)關(guān)注25個(gè)board,將會(huì )在用戶(hù)及board間產(chǎn)生17.5億的關(guān)系。同時(shí)更加重要的是,這些關(guān)系隨著(zhù)系統的使用每天都會(huì )增加。

Pinterest的Reids架構及運營(yíng)

通過(guò)Pinterest的一個(gè)創(chuàng )始人了解到,Pinterest開(kāi)始使用Python及訂制的Django編寫(xiě)應用程序,并一直持續到其擁有1800萬(wàn)用戶(hù)級日410TB用戶(hù)數據的時(shí)候。雖然使用了多個(gè)存儲對數據進(jìn)行儲存,工程師根據用戶(hù)id使用了8192個(gè)虛擬分片,每個(gè)分片都運行在一個(gè)Redis DB之上,同時(shí)1個(gè)Redis實(shí)例將運行多個(gè)Redis DB。為了對CPU核心的充分使用,同一臺主機上同時(shí)使用多線(xiàn)程和單線(xiàn)程Redis實(shí)例。

鑒于整個(gè)數據集運行在內存當中,Redis在A(yíng)mazon EBS上對每秒傳輸進(jìn)來(lái)的寫(xiě)入都會(huì )進(jìn)行持久化。擴展主要通過(guò)兩個(gè)方面進(jìn)行:第一,保持50%的利用率,通過(guò)主從轉換,機器上運行的Redis實(shí)例一半會(huì )轉譯到一個(gè)新機器上;第二,擴展節點(diǎn)和分片。整個(gè)Redis集群都會(huì )使用一個(gè)主從配置,從部分將被當做一個(gè)熱備份。一旦主節點(diǎn)失敗,從部分會(huì )立刻完成主的轉換,同時(shí)一個(gè)新的從部分將會(huì )被添加,ZooKeeper將完成整個(gè)過(guò)程。同時(shí)他們每個(gè)小時(shí)都會(huì )在A(yíng)mazon S3上運行BGsave做更持久的儲存——這項Reids操作會(huì )在后端進(jìn)行,之后Pinterest會(huì )使用這些數據做MapReduce和分析作業(yè)。(更多內容見(jiàn)原文)

三、Viacom:Redis在系統中的用例盤(pán)點(diǎn)

Viacom是全球最大的傳媒集體之一,同時(shí)也遭遇了當下最大的數據難題之一:如何處理日益劇增的動(dòng)態(tài)視頻內容。

著(zhù)眼這一挑戰的上升趨勢,我們會(huì )發(fā)現:2010年世界上所有數據體積達到ZB級,而單單2012這一年,互聯(lián)網(wǎng)產(chǎn)生的數據就增加了2.8個(gè)ZB,其中大部分的數據都是非結構化的,包括了視頻和圖片。

覆蓋MVN(以前稱(chēng)為MTV Networks、Paramount及BET),Viacom是個(gè)名副其實(shí)的傳媒巨頭,支持眾多人氣站點(diǎn),其中包括The Daily Show、osh.0、South Park Studios、GameTrailers.com等。作為媒體公司,這些網(wǎng)站上的文檔、圖片、視頻短片都在無(wú)時(shí)無(wú)刻的更新。長(cháng)話(huà)短說(shuō),下面就進(jìn)入Viacom高級架構師Michael Venezia 分享的Redis實(shí)踐:

Viacom的網(wǎng)站架構背景

對于Viacom,橫跨多個(gè)站點(diǎn)傳播內容讓必須專(zhuān)注于規模的需求,同時(shí)為了將內容竟可能快的傳播到相應用戶(hù),他們還必須聚焦內容之間的關(guān)系。然而即使The Daily Show、Nickelodeon、Spike或者是VH1 這些單獨的網(wǎng)站上,日平均PV都可以達到千萬(wàn),峰值時(shí)流量更會(huì )達到平均值的20-30倍。同時(shí)基于對實(shí)時(shí)的需求,動(dòng)態(tài)的規模及速度已成為架構的基礎之一。

除去動(dòng)態(tài)規模之外,服務(wù)還必須基于用戶(hù)正在瀏覽的視頻或者是地理位置來(lái)推測用戶(hù)的喜好。比如說(shuō),某個(gè)頁(yè)面可能會(huì )將一個(gè)獨立的視頻片段與本地的促銷(xiāo),視頻系列的額外部分,甚至是相關(guān)視頻聯(lián)系起來(lái)。為了能讓用戶(hù)能在網(wǎng)站上停留更長(cháng)的時(shí)間,他們建立了一個(gè)能基于詳細元數據自動(dòng)建立頁(yè)面的軟件引擎,這個(gè)引擎可以根據用戶(hù)當下興趣推薦額外的內容。鑒于用于興趣的隨時(shí)改變,數據的類(lèi)型非常廣泛——類(lèi)似graph-like,實(shí)際上做的是大量的join。

這樣做有利于減少類(lèi)似視頻的大體積文件副本數,比如數據存儲中一個(gè)獨立的記錄是Southpark片段“Cartman gets an Anal Probe”,這個(gè)片段可能也會(huì )出現在德語(yǔ)的網(wǎng)站上。雖然視頻是一樣的,但是英語(yǔ)用戶(hù)搜索的可能就是另一個(gè)不同的詞語(yǔ)。元數據的副本轉換成搜索結果,并指向相同的視頻。因此在美國用戶(hù)搜索真實(shí)標題的情況下,德國瀏覽者可能會(huì )使用轉譯的標題——德國網(wǎng)站上的“Cartman und die Analsonde”。

這些元數據覆蓋了其它記錄或者是對象,同時(shí)還可以根據使用環(huán)境來(lái)改變內容,通過(guò)不同的規則集來(lái)限制不同地理位置或者是設備請求的內容。

Viacom的實(shí)現方法

盡管許多機構通過(guò)使用ORM及傳統關(guān)系型數據庫來(lái)解決這個(gè)問(wèn)題,Viacom卻使用了一個(gè)迥然不同的方法。

本質(zhì)上,他們完全承擔不了對數據庫的直接訪(fǎng)問(wèn)。首先,他們處理的大部分都是流數據,他們偏向于使用Akamai從地理上來(lái)分配內容。其次,基于頁(yè)面的復雜性可能會(huì )取上萬(wàn)個(gè)對象。取如此多的數據顯然會(huì )影響到性能,因此JSON在1個(gè)數據服務(wù)中投入了使用。當然,這些JSON對象的緩存將直接影響到網(wǎng)站性能。同時(shí),當內容或者是內容之間的關(guān)系發(fā)生改變時(shí),緩存還需要動(dòng)態(tài)的進(jìn)行更新。

Viacom依靠對象基元和超類(lèi)解決這個(gè)問(wèn)題,繼續以South Park為例:一個(gè)私有的“episode”類(lèi)包含了所有該片段相關(guān)信息,一個(gè)“super object”將有助于發(fā)現實(shí)際的視頻對象。超類(lèi)這個(gè)思想確實(shí)非常有益于建設低延遲頁(yè)面的自動(dòng)建設,這些超類(lèi)可以幫助到基元對象到緩存的映射及保存。

Viacom為什么要使用Redis

每當Viacom上傳一個(gè)視頻片段,系統將建立一個(gè)私有的對象,并于1個(gè)超類(lèi)關(guān)聯(lián)。每一次修改,他們都需要重估私有對象的每個(gè)改變,并更新所有復合對象。同時(shí),系統還需要無(wú)效Akamail中的URL請求。系統現有架構的組合及更敏捷的管理方法需求將Viacom推向了Redis。

基于Viacom主要基于PHP,所以這個(gè)解決方案必須支持PHP。他們首先選擇了memcached做對象存儲,但是它并不能很好的支持hashmap;同時(shí)他們還需要一個(gè)更有效的進(jìn)行無(wú)效步驟的重估,即更好的理解內容的依賴(lài)性。本質(zhì)上說(shuō),他們需要時(shí)刻跟進(jìn)無(wú)效步驟中的依賴(lài)性改變。因此他們選擇了Redis及Predis的組合來(lái)解決這個(gè)問(wèn)題。

他們團隊使用Redis給southparkstudios.com和thedailyshow.com兩個(gè)網(wǎng)站建設依賴(lài)性圖,在取得了很大的成功后他們開(kāi)始著(zhù)眼Redis其它適合場(chǎng)景。

Redis的其它使用場(chǎng)景

顯而易見(jiàn),如果有人使用Redis來(lái)建設依賴(lài)性圖,那么使用它來(lái)做對象處理也是說(shuō)得通的。同樣,這也成了架構團隊為Redis選擇的第二使用場(chǎng)景。Redis的復制及持久化特性同時(shí)也征服了Viacom的運營(yíng)團隊,因此在幾個(gè)開(kāi)發(fā)周期后,Redis成為他們網(wǎng)站的主要數據及依賴(lài)性?xún)Υ妗?/p>

后兩個(gè)用例則是行為追蹤及瀏覽計數的緩沖,改變后的架構是Redis每幾分鐘向MySQL中儲存一次,而瀏覽計數則通過(guò)Redis進(jìn)行存儲及計數。同時(shí)Redis還被用來(lái)做人氣的計算,一個(gè)基于訪(fǎng)問(wèn)數及訪(fǎng)問(wèn)時(shí)間的得分系統——如果某個(gè)視頻最近被訪(fǎng)問(wèn)的次數越多,它的人氣就越高。在如此多內容上每隔10-15分鐘做一次計算絕對不是類(lèi)似MySQL這樣傳統關(guān)系型數據庫的強項,Viacom使用Redis的理由也非常簡(jiǎn)單——在1個(gè)存儲瀏覽信息的Redis實(shí)例上運行Lua批處理作業(yè),計算出所有的得分表。信息被拷貝到另一個(gè)Redis實(shí)例上,用以支持相關(guān)的產(chǎn)品查詢(xún)。同時(shí)還在MySQL上做了另一個(gè)備份,用以以后的分析,這種組合會(huì )將這個(gè)過(guò)程耗費的時(shí)間降低60倍。

Viacom還使用Redis存儲一步作業(yè)信息,這些信息被插入一個(gè)列表中,工作人員則使用BLPOP命令行在隊列中抓取頂端的任務(wù)。同時(shí)zsets被用于從眾多社交網(wǎng)絡(luò )(比如Twitter及Tumblr)上綜合內容,Viacom通過(guò)Brightcove視頻播放器來(lái)同步多個(gè)內容管理系統。

橫跨這些用例,幾乎所有的Redis命令都被使用——sets、lists、zlists、hashmaps、scripts、counters等。同時(shí),Redis也成為Viacom可擴展架構中不可或缺的一環(huán)。



本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
精選 21道 Redis 最常問(wèn)面試題!收藏一波 !
Redis部分面試題
NoSQL - Redis應用場(chǎng)景
緩存有那么多種,分別是干什么的?
一文讀懂內存數據庫
redis常見(jiàn)使用場(chǎng)景總結
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久