1. 程式人生 > >redis安裝以及資料型別

redis安裝以及資料型別

一、redis安裝

1. 官網下載:     								wget http://download.redis.io/releases/redis-5.0.0.tar.gz

2. 解壓:         								tar -zxvf redis-5.0.0.tar.gz

3. 切換目錄:     								cd redis-5.0.0

4. 編譯:         								make

5. 編譯完成,進入src:							cd src

6. 進行Redis安裝:           					    make install

7. 移動常用指令檔案到目錄下 					    cp redis-cli /home/redis/redis-5.0.0
											    cp redis-server /home/redis/redis-5.0.0
											    cp redis-benchmark /home/redis/redis-5.0.0

8. reids啟動									./redis-server

9. 測試redis啟動					

    1)客戶端連線 								./redis-cli (redis-cli -h host -p port -a password)
    
    2)監聽redis服務                              ps -ef | grep redis	
    
    3)監聽特定埠                               netstat -lntp | grep 6379
    																										
10. 配置redis為後臺駐留程式         			    vim redis.conf   daemonize no 改成 daemonize yes	

11. 將Redis的命令所在目錄新增到系統引數PATH中   

    1)修改profile檔案                            vi /etc/profile
    
    2)末尾新增                                   export PATH="$PATH:/home/redis/redis-5.0.0"
    
    3)馬上應用這個檔案                           . /etc/profile

12. redis獲取所有配置資訊命令                     redis中執行:CONFIG get *    

二、redis基本概念

1. Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API
2. Redis的外圍由一個鍵、值對映的字典構成。與其他非關係型資料庫主要不同在於:Redis中值的型別 [1] 不僅限於字串,還支援其他抽象資料型別
3. redis優點
1)異常快: Redis非常快,每秒可執行大約110000次的設定(SET)操作,每秒大約可執行81000次的讀取/獲取(GET)操作

2)支援豐富的資料型別:Redis支援開發人員常用的大多數資料型別,例如列表,集合,排序集和雜湊等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些資料型別來處理解決

3)操作具有原子性:所有Redis操作都是原子操作,這確保如果兩個客戶端併發訪問,Redis伺服器能接收更新的值

4)多實用工具:Redis是一個多實用工具,可用於多種用例,如:快取,訊息佇列(Redis本地支援釋出/訂閱),應用程式中的任何短期資料,例如,web應用程式中的會話,網頁命中計數等
4. Redis的單執行緒執行模型
1)Redis對於命令的執行是序列的,也就是單執行緒的,在同一時刻只會執行一條命令

2)Redis以單執行緒執行命令,但其速度很快,原因在於

	(1)操作的資料全部儲存在記憶體中,而記憶體中的資料讀寫操作是非常快的。(主要原因)

	(2)採用非阻塞IO

	(3)單執行緒執行避免了執行緒間的切換和競態消耗

3)單執行緒執行需要注意的一些問題

	(1)Redis在同一時刻只能執行一條命令,其他命令將會進行排列等待

	(2)不要執行執行速度很慢的命令,比如keys/flushall/flushdb等命令	

三、資料型別

1. 字串(string)
1)概念

	(1)Redis中的字串是一個位元組序列。Redis中的字串是二進位制安全的,這意味著它們的長度不由任何特殊的終止字元決定。因此,可以在一個字串中儲存高達512兆位元組的任何內容

	(2)String在redis內部儲存預設就是一個字串,被redisObject所引用,當遇到incr,decr等操作時會轉成數值型進行計算,此時redisObject的encoding欄位為int

2)常見操作

	(1)set key value  					               設定key的值

	(2)get key                						   獲取key的值

3)應用場景

	(1)常規key-value快取應用。常規計數: 微博數, 粉絲數	
2. 雜湊/雜湊(hash)
1)概念

	(1)Redis雜湊/雜湊(Hashes)是鍵值對的集合。Redis雜湊/雜湊是字串欄位和字串值之間的對映。因此,它們用於表示物件

	(2)每個雜湊/雜湊可以儲存多達2^32 - 1個健-值對(超過40億個)

	(3)Redis Hash對應Value內部實際就是一個HashMap,實際這裡會有2種不同實現,這個Hash的成員比較少時Redis為了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的HashMap結構,對應的value redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht

2) 常見操作(加m表示可以羅列多個值,比如hmget)

	(1)hmset key mapkey1 value1 mapkey2 value2           設定hash物件各個欄位的值

	(2)hset key mapkey value                             設定單個欄位的值

	(3)hgetall                                           獲取整個hash物件

	(4)hget mapkey1                                      獲取指定欄位的值

	(5)havls key                                         獲取hash中的所有值(不包括mapkey) 

	(6)hdel key mapkey                                   刪除指定mapkey

	(7)hexists key mapkey                                判斷指定mapkey是否存在		

3)應用場景

	(1)儲存部分變更資料,如使用者資訊等
3. 列表(list)
1)概念

	(1)Redis列表只是字串列表,按插入順序排序。您可以向Redis列表的頭部或尾部新增元素	

	(2)列表的最大長度為2^32 - 1個元素(4294967295,每個列表可容納超過40億個元素)

	(3)Redis的list是每個子元素都是String型別的雙向連結串列,可以通過push和pop操作從列表的頭部或者尾部新增或者刪除元素,這樣List即可以作為棧,也可以作為佇列

2)常見操作

	(1)lpush key value [value2...]                        插入資料(插入的資料永遠在左邊)

	(2)lrange key begin end                               獲取指定範圍的資料

	(3)lpop  key                                          刪除並獲取列表中的第一個元素

	(4)lindex key index                                   通過其索引從列表獲取元素

3)應用場景

	(1)Redis連結串列經常會被用於訊息佇列的服務,以完成多程式之間的訊息交換。假設一個應用程式正在執行LPUSH操作向連結串列中新增新的元素,我們通常將這樣的程式稱之為"生產者(Producer)",而另外一個應用程式正在執行RPOP操作從連結串列中取出元素,我們稱這樣的程式為"消費者(Consumer)"	

	(2)比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現

	(3)使用list可以構建佇列系統,使用sorted set甚至可以構建有優先順序的佇列系統

	(4)將Redis用作日誌收集器:實際上還是一個佇列,多個端點將日誌資訊寫入Redis,然後一個worker統一將所有日誌寫到磁碟

	(5)記錄前N個最新登陸的使用者Id列表,超出的範圍可以從資料庫中獲得
4. 集合(set)
1)概念

	(1)Redis集合是唯一字串的無序集合

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

2)常見操作

	1)sadd key value                                       插入資料

	2)smembers key                                         獲取集合的資料   

3)應用場景:

	1)可以使用Redis的Set資料型別跟蹤一些唯一性資料,比如訪問某一部落格的唯一IP地址資訊。對於此場景,我們僅需在每次訪問該部落格時將訪問者的IP存入Redis中,Set資料型別會自動保證IP地址的唯一性

	2)充分利用Set型別的服務端聚合操作方便、高效的特性,可以用於維護資料物件之間的關聯關係。比如所有購買某一電子裝置的客戶ID被儲存在一個指定的Set中,而購買另外一種電子產品的客戶ID被儲存在另外一個Set中,如果此時我們想獲取有哪些客戶同時購買了這兩種商品時,Set的intersections命令就可以充分發揮它的方便和效率的優勢了	

	3)在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis還為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中

	4)獲取某段時間所有資料去重值:這個使用Redis的set資料結構最合適了,只需要不斷地將資料往set中扔就行了,set意為集合,所以會自動排重
5. 可排序集合(sorted set)
1)概念

	(1)Redis可排序集合類似於Redis集合,是不重複的字元集合。 不同之處在於,排序集合的每個成員都與分數相關聯,這個分數用於按最小分數到最大分數來排序的排序集合	

	(2)雖然成員是唯一的,但分數值可以重複

	(3)集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)

	(4)Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證資料的儲存和有序,HashMap裡放的是成員到score的對映,而跳躍表裡存放的是所有的成員,排序依據是HashMap裡存的score,使用跳躍表的結構可以獲得比較高的查詢效率,並且在實現上比較簡單

2)常見操作

	1)zadd key index value	                                 插入資料

	2)zrange key begin end withscores                       獲取指定分數值的資料	

3)應用場景:

	1)可以用於一個大型線上遊戲的積分排行榜。每當玩家的分數發生變化時,可以執行ZADD命令更新玩家的分數,此後再通過ZRANGE命令獲取積分TOP TEN的使用者資訊。當然我們也可以利用ZRANK命令通過username來獲取玩家的排行資訊。最後我們將組合使用ZRANGE和ZRANK命令快速的獲取和某個玩家積分相近的其他使用者的資訊

	2)Sorted-Sets型別還可用於構建索引資料

	3)當你需要一個有序的並且不重複的集合列表,那麼可以選擇sorted set資料結構,比如twitter 的public timeline可以以發表時間作為score來儲存,這樣獲取時就是自動按時間排好序的

	4)另外還可以用Sorted Set來做帶權重的佇列,比如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行

四、常見redis命令

1. 查詢鍵相關
1)exists key             			判斷某個鍵是否存在(存在返回1,不存在返回0)

2)keys pattern           			找指定匹配表示式的鍵(不能跨叢集)

3)type key                      	返回儲存在鍵中的值的資料型別
2. 更改鍵相關
1)del key                			刪除指定鍵(如果鍵被刪除,則命令的輸出將為(integer) 1,否則為(integer) 0)

2)rename key newKey      			修改鍵的名字
3. 時間相關(加p是毫秒級)
1)expire key seconds            	設定key的過期時間

2)expireat key timestamp        	設定在指定時間戳之後鍵到期/過期。這裡的時間是Unix時間戳格式           

3) ttl key                       	獲取key的過期時間  
4. 其他
1)randomkey                     	獲取一個隨機的key

五、redis的應用場景

1. 顯示最新的專案列表
1)比如說,我們的一個Web應用想要列出使用者貼出的最新20條評論。在最新的評論邊上我們有一個“顯示全部”的連結,點選後就可以獲得更多的評論

2)我們假設資料庫中的每條評論都有一個唯一的遞增的ID欄位

3)我們可以使用分頁來製作主頁和評論頁,使用Redis的模板,每次新評論發表時,我們會將它的ID新增到一個Redis列表:LPUSH latest.comments <ID>  

4)我們將列表裁剪為指定長度,因此Redis只需要儲存最新的5000條評論:LTRIM latest.comments 0 5000 

5)每次我們需要獲取最新評論的專案範圍時,我們呼叫一個函式來完成

	(1)先從redis裡面拿取到這5000個id加評論

	(2)如果超過5000,再從資料庫裡面拿

	(3)SQL資料庫(或是硬碟上的其他型別資料庫)只是在使用者需要獲取“很遠”的資料時才會被觸發,而主頁或第一個評論頁是不會麻煩到硬碟上的資料庫了
2. 排行榜應用,取TOP N操作
1)取最新N個數據的操作以時間為權重,這個是以某個條件為權重,比如按頂的次數排序,這時候就需要我們的sorted set出馬了,將你要排序的值設定成sorted set的score,將具體的資料設定成相應的value,每次只需要執行一條ZADD命令即可

2)熱門,排行榜應用

	zadd login:login_times 5 1
	zadd login:login_times 1 2
	zadd login:login_times 2 3								// 將登入次數和使用者統一儲存在一個sorted set裡

	ret = r.zincrby("login:login_times", 1, uid)            // 當用戶登入時,對該使用者的登入次數自增1

	ret = r.zrevrange("login:login_times", 0, N-1) 			// 那麼如何獲得登入次數最多的使用者呢,逆序排列取得排名前N的使用者

3)列出前100名高分選手	

	(1)每次獲得新得分時               ZADD leaderboard  <score>  <username>

	(2)得到前100名高分使用者很簡單      ZREVRANGE leaderboard 0 99
3. 刪除與過濾
1)我們可以使用LREM來刪除評論。如果刪除操作非常少,另一個選擇是直接跳過評論條目的入口,報告說該評論已經不存在

2)有些時候你想要給不同的列表附加上不同的過濾器。如果過濾器的數量受到限制,你可以簡單的為每個不同的過濾器使用不同的Redis列表。畢竟每個列表只有5000條專案,但Redis卻能夠使用非常少的記憶體來處理幾百萬條專案
4. 按照使用者投票和時間排序
1)新聞按照類似下面的公式根據得分來排序:score = points / time^alpha 因此使用者的投票會相應的把新聞挖出來,但時間會按照一定的指數將新聞埋下去	

2)模式是這樣的,開始時先觀察那些可能是最新的專案,例如首頁上的1000條新聞都是候選者,因此我們先忽視掉其他的,這實現起來很簡單。每次新的新聞貼上來後,我們將ID新增到列表中,使用LPUSH + LTRIM,確保只取出最新的1000條專案

3)有一項後臺任務獲取這個列表,並且持續的計算這1000條新聞中每條新聞的最終得分

4)計算結果由ZADD命令按照新的順序填充生成列表,老新聞則被清除。這裡的關鍵思路是排序工作是由後臺任務來完成的
5. 處理過期專案
1)另一種常用的專案排序是按照時間排序。我們使用unix時間作為得分即可

2)每次有新專案新增到我們的非Redis資料庫時,我們把它加入到排序集合中。這時我們用的是時間屬性,current_time和time_to_live

3)另一項後臺任務使用ZRANGE…SCORES查詢排序集合,取出最新的10個專案。如果發現unix時間已經過期,則在資料庫中刪除條目
6. 計數
1)Redis是一個很好的計數器,這要感謝INCRBY和其他相似命令

2)你可以計算出最近使用者在頁面間停頓不超過60秒的頁面瀏覽量,當計數達到比如20時,就可以顯示出某些條幅提示,或是其它你想顯示的東西
7. 特定時間內的特定專案
1)另一項對於其他資料庫很難,但Redis做起來卻輕而易舉的事就是統計在某段特點時間裡有多少特定使用者訪問了某個特定資源

2)比如我想要知道某些特定的註冊使用者或IP地址,他們到底有多少訪問了某篇文章

	(1)每次我獲得一次新的頁面瀏覽時我只需要這樣做             SADD page:day1:<page_id> <user_id> 

	(2)當然你可能想用unix時間替換day1,比如time()-(time()%3600*24)等等。 想知道特定使用者的數量嗎?只需要使用   SCARD page:day1:<page_id>

	(3)需要測試某個特定使用者是否訪問了這個頁面                 SISMEMBER page:day1:<page_id>
8. 查詢某個值所在的區間(區間無重合) :(Sorted Set) / 交集,並集,差集:(Set)

參考網址

Linux下Redis的安裝和部署

Redis學習筆記——初級

Redis 教程(菜鳥驛站)

Redis 命令參考

redis學習(八)——redis應用場景(一系列)

注:文章是經過參考其他的文章然後自己整理出來的,有可能是小部分參考,也有可能是大部分參考,但絕對不是直接轉載,覺得侵權了我會刪,我只是把這個用於自己的筆記,順便整理下知識的同時,能幫到一部分人。
ps : 有錯誤的還望各位大佬指正,小弟不勝感激