姓名:穆培婷
學(xué)號:17101223414
專業(yè):軟件工程
本文轉(zhuǎn)載自:http://blog.csdn.net/mengxianhua/article/details/8961713
【嵌牛導(dǎo)讀】:Redis是一個開源的使用ANSIC語言編寫绵咱、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型绊袋、Key-Value數(shù)據(jù)庫樱哼,并提供多種語言的API洁墙。從2010年3月15日起,Redis的開發(fā)工作由VMware主持掉弛。從2013年5月開始症见,Redis的開發(fā)由Pivotal贊助。
【嵌牛鼻子】:Redis? 緩存? 負(fù)載均衡
【嵌牛提問】:redis是什么殃饿?redis有什么用谋作?
【嵌牛正文】:
一、什么是redis乎芳?
Redis是Remote?Dictionary?Server(遠(yuǎn)程數(shù)據(jù)服務(wù))的縮寫遵蚜,由意大利人?antirez(Salvatore?Sanfilippo)開發(fā)的一款 內(nèi)存高速緩存數(shù)據(jù)庫逻翁,該軟件使用C語言編寫,它的數(shù)據(jù)模型為 key-value蹋肮,它支持豐富的數(shù)據(jù)結(jié)構(gòu),比如 String list? hash?? set? sorted set理郑。肴甸,可持久化寂殉,保證了數(shù)據(jù)安全。
1雷滋、為什么要用redis
1) 是一款數(shù)據(jù)庫產(chǎn)品不撑,有數(shù)據(jù)存儲功能文兢;
2) 可以高速讀取數(shù)據(jù)(in-memory)晤斩;
3) 可以減輕數(shù)據(jù)庫負(fù)擔(dān)
4) 有集合計(jì)算功能(優(yōu)于普通數(shù)據(jù)庫合同類別產(chǎn)品)
5) 多種數(shù)據(jù)結(jié)構(gòu)支持
2焕檬、什么場合適合使用redis?
1)【sort set】排行榜應(yīng)用澳泵,取top n操作实愚,列入sina微博熱門話題
2)【list】獲得最新N個數(shù)據(jù)或某個分類的最新數(shù)據(jù)
3)計(jì)數(shù)器應(yīng)用
4)【set】sns(social network site)獲得共同的好友
5)【set】防攻擊系統(tǒng)(IP判斷)等等
3、redis其他信息
1) 作者是意大利的Salvatore Sanfilippo(antirez),又是VMWare大善人聘請了他專心寫Redis
2) 默認(rèn)端口號?6379兔辅,是手機(jī)按鍵上的MERZ對應(yīng)的號碼腊敲,意大利歌女(Alessia Merz)梅爾茲的代名詞
4、拓展補(bǔ)充
緩存:
有兩種類型 數(shù)據(jù)緩存维苔、頁面緩存(smarty)
使用緩存減輕數(shù)據(jù)庫的負(fù)載碰辅。
在開發(fā)網(wǎng)站的時候如果有一些數(shù)據(jù)在短時間之內(nèi)不會發(fā)生變化,而它們還要被頻繁訪問介时,為了提高用戶的請求速度/降低網(wǎng)站的負(fù)載没宾,就把這些數(shù)據(jù)放到一個讀取速度更快的介質(zhì)上,該行為就稱作對該數(shù)據(jù)的緩存動作沸柔。
該介質(zhì)可以是文件循衰、數(shù)據(jù)庫、內(nèi)存褐澎,內(nèi)存經(jīng)常用于數(shù)據(jù)緩存会钝。
頁面緩存經(jīng)常用在CMS內(nèi)存管理系統(tǒng)里邊
數(shù)據(jù)緩存經(jīng)常會用在頁面的具體數(shù)據(jù)里邊
二、與memcached比較
1) Redis不僅僅支持簡單的k/v類型的數(shù)據(jù)工三,同時還提供list迁酸,set,zset俭正,hash等數(shù)據(jù)結(jié)構(gòu)的存儲胁出。
2) Redis支持master-slave(主—從)模式應(yīng)用。
3) Redis支持?jǐn)?shù)據(jù)的持久化段审,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中全蝶,重啟的時候可以再次加載進(jìn)行使用。
4) Redis單個value的最大限制是1GB寺枉, memcached只能保存1MB的數(shù)據(jù)
相關(guān)資源:Redis手冊網(wǎng)址:http://www.redisdoc.com/en/latest/index.html
三抑淫、Redis安裝
Windows下安裝:redis-server.exe? redis.conf(或者redis-server.exe redis.windows.conf)
客戶端redis-cli.exe -h 127.0.0.1 -p 6379
Linux下安裝:redis-3.2.8.tar.gz
tar zxvf redis-3.2.8.tar.gz
cd redis-3.2.8
make PREFIX=/usr/local/redis
cd src
啟動服務(wù):service redis start
新開終端:cd /usr/local/redis
客戶端:./redis-cli
四、具體使用
1姥闪、Key
Key 可以是任意類型,最后都存成byte[]
Key 不能太長始苇,比如1024字節(jié),但作者也不追求太短筐喳,要表達(dá)清楚意思才好催式,作者建議用":"分隔表名函喉,用"."作為單詞間的連接。
KEYS顯示所有的key荣月,支持通配符 "KEYS a*" , "keys a?c"管呵,但不建議在生產(chǎn)環(huán)境大數(shù)據(jù)量下使用。
SORT哺窄,對集合按數(shù)字或字母順序排序后返回捐下,或者存到另一個List,還可以關(guān)聯(lián)到外部Key等坷襟。因?yàn)闀挠肅PU婴程,有時會安排到slave上執(zhí)行授段。
EXPIRE/EXPREAT/PERSIST/TTL/届搁,關(guān)于Key超時的操作,默認(rèn)以秒為單位,也有p字頭的以毫秒為單位的版本瞬逊。
其他命令: EXISTS范删,DEL旨巷,RENAME/RENAMENX(僅當(dāng)new key不存在時)若锁,MOVE/MIGRATE(實(shí)例內(nèi)從此db到彼db/從此實(shí)例到彼實(shí)例)会通,RANDOMKEY煤辨,TYPE/Object(Key的類型/對象編碼類型,空置時間),DUMP/RESTORE(value值的持久化)
2、String
最普通的key-value谨履,除了支持最基本的get/set欢摄, Redis也很喜歡添加一些簡便的指令,在服務(wù)端做起來是舉手之勞笋粟,客戶端便方便很多怀挠。
incr/decr/incrby/incrbyfloat, 如果key還不存在時創(chuàng)建key并設(shè)原值為0害捕。
setEx/pSetEx绿淋, Set + Expire 的簡便寫法,p字頭以毫秒為單位。
setNx吨艇, key不存在時才put進(jìn)去躬它。
getset, 設(shè)置新值东涡,返回舊值冯吓。
mget/mset/msetex倘待, 一次get/set多個key。
getbit/setbit/bitop/bitcount bitmap玩法组贺,比如統(tǒng)計(jì)今天的訪問用戶凸舵,每個用戶有一個offset,今天進(jìn)來的話就把那個位為1失尖。
append/setrange/getrange啊奄,只對特定的數(shù)據(jù)格式比如字段定長的有用,json格式就沒用掀潮。
3菇夸、Hash
Key-HashMap結(jié)構(gòu),相比2.2中的JSON格式Value仪吧,可以只讀取/更新對象的某些屬性庄新,有些屬性超長就讓它一邊呆著不動。薯鼠。
另一個用法是用來建索引择诈。比如User對象,除了id有時還要按name來查詢出皇,可以建一個Key為user:index:name的Hash羞芍,在插入U(xiǎn)ser對象時(set user:101 {"id":101,"name":"calvin"}), 順便往這個hash插入一條(hset user:index:name calvin 101)郊艘,這時calvin作為hash里的一個key荷科,值為101。按name查詢的時候暇仲,用hget user:index:name calvin 就能從名為calvin的key里取出id步做。
4、List
Redis里可以當(dāng)雙向鏈表來用奈附,還提供blocking版本的pop函數(shù)全度,可以當(dāng)Message Queue來用。
不過List并沒有JMS的ack機(jī)制斥滤,如果消費(fèi)者把job給Pop走了又沒處理完就死機(jī)了怎么辦? 解決方法之一是加多一個sorted set将鸵,以分發(fā)時間為score,用戶把job做完了之后要去消掉它佑颇。
除了List標(biāo)準(zhǔn)的雙向POP/PUSH外顶掉,還支持對隊(duì)列內(nèi)容的直接操作,比如LREM/LSET/LINSERT/LINDEX挑胸。
另外經(jīng)常用LTRIM限制List的大小痒筒,比如只保留最新的20條消息。LRANGE不同于POP直接彈走元素,只是返回列表內(nèi)一段下標(biāo)的元素簿透。LLEN獲取列表的長度移袍。
5、Set
Set就是Set老充,還提供一些交集葡盗,并集,差集的集合操作啡浊。
6觅够、Sorted Set
有序集,元素放入集合的時候要同時提供該元素的分?jǐn)?shù)巷嚣。
ZRANGE/ZREVRANGE 按排名的上下限返回元素喘先,正數(shù)與倒數(shù)。
ZRANGEBYSCORE/ZREVRANGEBYSCORE 按分?jǐn)?shù)的上下限返回元素涂籽,正數(shù)與倒數(shù)苹祟。
ZREMRANGEBYRANK/ZREMRANGEBYSCORE 按排名/按分?jǐn)?shù)刪除元素砸抛。
ZCOUNT 統(tǒng)計(jì)分?jǐn)?shù)上下限之間的元素個數(shù)评雌。
ZRANK/ZREVRANK 顯示某個元素的正倒序的排名。
ZSCORE/ZINCRBY 顯示元素的分?jǐn)?shù)/增加元素的分?jǐn)?shù)直焙。
ZADD/ZREM/ZCARD/ZINTERSTORE/ZUNIONSTORE 集合操作與SET相同景东,少了個差集的操作。
7奔誓、事務(wù)
用Multi/Exec/Discard實(shí)現(xiàn)斤吐, 隔離級別是這邊事務(wù)一天不提交,那邊另一個事務(wù)還是看到舊的值厨喂。 還有個Watch指令和措,起到CAS的效果,如果事務(wù)提交時蜕煌,Key的值已被別的事務(wù)改變派阱,事務(wù)會被打斷。
8斜纪、Lua Script
Redis2.6內(nèi)置的Lua Script支持贫母,可以在Redis的Server端一次過運(yùn)行大量邏輯。
整個Script默認(rèn)是在一個事務(wù)里的盒刚。
Script里涉及的所有Key盡量用變量腺劣,從外面?zhèn)魅耄筊edis一開始就知道你要改變哪些key因块。
EVAL每次傳輸一整段Script比較費(fèi)帶寬橘原,可以先用SCRIPT LOAD載入script,返回哈希值。然后用EVALHASH執(zhí)行趾断。
內(nèi)置的LUA庫里還很貼心的帶了CJSON寨辩,可以處理JSON字符串。
五歼冰、Redis的主從模式
前提:針對數(shù)據(jù)庫的增刪改查操作靡狞,在進(jìn)行數(shù)據(jù)庫的select操作是最耗費(fèi)負(fù)載的,為了更好的優(yōu)化mysql數(shù)據(jù)庫隔嫡,減輕mysql的負(fù)載甸怕,我們可以設(shè)置兩臺mysql數(shù)據(jù)庫,一臺主要負(fù)責(zé)數(shù)據(jù)的寫入腮恩,一臺負(fù)責(zé)數(shù)據(jù)的讀取梢杭,這樣相對可以減輕數(shù)據(jù)庫的壓力。同樣這種方案也可以應(yīng)用在redis中秸滴。設(shè)置主從redis.從服務(wù)器在連接到主服務(wù)器后武契,可以讀取主服務(wù)器上的數(shù)據(jù)。
注意:從服務(wù)器在連接主服務(wù)器后荡含,自身是不可以進(jìn)行寫數(shù)據(jù)的操作咒唆,所以在進(jìn)行自身操作的時候,必須要斷開于主服務(wù)器的連接释液。(殺死操作全释,重新啟動)