1. 程式人生 > >最詳細完整的redis學習日記

最詳細完整的redis學習日記

一、redis是什麼?

1 .  開源框架; 2 . 多種資料結構; 3. 基於鍵值對的儲存服務系統; 4. 高效能、功能豐富。

二、redis的特性

1. 速度快:

         最關鍵的就是直接儲存在計算機記憶體中; 第二使用的執行緒模型是單執行緒模型; 第三redis使用c語言編寫(50000行左右)。

2. 持久化:

         資料雖然都是儲存在記憶體中的,但是redis會非同步的將資料儲存到硬碟中。

         作業系統也有這種特性,在計算機藍屏是會將記憶體資料dump到硬碟,下次開機時從硬碟重新讀取到記憶體。

3. 支援多種資料結構:

        基於鍵值對的儲存,key使用string儲存,value有5種基礎的資料結構:(1)String;(2)有序列連結串列List;(3)無序列集合set;(4)無序散列表;(5)有序排序集合zset

4. 支援多種程式語言:

        redis協議為簡單的tcp協議,所以他支援非常多的客戶端語言

5. 功能豐富:

       註冊、訂閱實現訊息佇列; 支援事物; lua指令碼; pipeline

6. 簡單:

      這裡的簡單從片面上說最初的程式碼長度才23000行,現在的不止了;當然它的簡單還指它不依賴其他外部庫; 同時它的執行緒模型都是單執行緒,所以無論服務端還是客戶端都方便開發。

7. 主從複製:

     redis提供了主伺服器和從伺服器的模式,主從伺服器間進行同步資料。

8. 高可用,分散式:

    redis2.8 之後提供了redis-sentinel 支援高可用;

    redis3.0之後提供了redis-cluster 支援分散式;

三、reidis使用場景

   1 . 簡單的訊息佇列 (利用redis 的註冊和訂閱服務)

   2 . 分散式鎖, session共享池, 計數器(利用redis單執行緒的唯一性);

   3 . 快取中介軟體(適配服務與資料庫之間的訪問量);

四、redis的啟動方式

1 .  安裝redis    參考官方文件

$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz
$ tar xzf redis-5.0.0.tar.gz
$ cd redis-5.0.0
$ make

2 . redis src下的可執行檔案:

  • redis-server                   Redis伺服器
  • redis-cli                         Redis命令列客戶端
  • redis-benchmark           Redis效能測試工具
  • redis-check-aof             AOF檔案修改工具(持久化方式恢復之一)
  • redis-check-dump         RDB檔案檢查工具(持久化方式恢復之二)
  • redis-sentinel                Sentinel伺服器(2.8之後)

3 . 啟動方式

   (a) 直接啟動redis-server , 採用預設配置(直接就是redis-server);

   (b) 動態引數配置,可指配埠號等(如 redis-server --port 6380);

   (c) 採用配置檔案啟動,也是最常用的啟動方式(生產環境下推薦,如 redis-server conf/redis6380.conf, 即用同目錄下的conf下的redis6380.conf配置啟動redis服務);

4 . 連線方式

     (1) redis-cli (直接連線)

     (2)redis-cli -h 127.0.0.1 -p 6380 (連線本地6380埠的redis)

五 、 redis的API使用

1 . 通用命令

      a 、通用命令(6個)

                ①  keys : 得到redis中所有的key, 一般結合正則表示式來使用,即 keys 【pattern】, 如keys * 得到所有的key,keys he? 得到以he開頭的第三個字元任意的三位字元的key,它的時間複雜度為O(n),所以線上環境不推薦使用。

                ②  dbsize :得到redis中key的個數。它的時間複雜度為O(1),原因是redis中維護了這個計數器,不是遍歷得到的。

                ③  exists 【key】:判斷key在redis中是否存在,存在為1,不存在為0,時間複雜度為O(1)

                ④  del 【key ...】 : 刪除key,刪除成功為1,key不存在為0,時間複雜度為O(1)

                ⑤  expire 【key】【seconds】:設定key的過期時間(秒級別),時間複雜度為O(1);

                     ttl 【key】:檢視這個key剩餘多久的過期時間,不過期的key返回 -1,key不存在為 -2,時間複雜度為O(1);

                     persist 【key】 : 清除這個key的過期時間,這個key就不過期,時間複雜度為O(1);

                ⑥  type 【key】:返回這個key的型別,有string,set, zset, list,hash,null(key不存在時),時間複雜度為O(1)

     b、資料結構和內部編碼

                               這裡上兩張圖,圖一是redis的資料結構和內部編碼結構,通過這個圖我們知道在外看來hash結構在內部實際有兩種內部編碼格式,一個是hashtable,另一個是ziplist。那這個的好處是什麼?學過java的可以聯想面向介面程式設計,對內擴充套件,對外統一原則,什麼時候用什麼內部編碼就相當於到底選擇用時間換空間還是用空間換時間,因為不同的內部編碼會有不同的空間儲存方式和不同的時間效率。

          圖二是redis內部的一個數據結構叫redisObject,這裡舉出了幾個關鍵的屬性,第一個屬性就是資料型別,第二個是編碼方式。

    c、單執行緒

       redis在處理客戶端的命令是採用的是單執行緒模型,用一個執行緒處理多個客戶端的請求命令

      那為什麼redis的處理速度很快呢? 其實也就是它的儲存介質是記憶體(最關鍵),第二是它採用的是非堵塞式的處理請求,第三因為是單執行緒所以避免了執行緒間的資料切換和競爭。

     因為單執行緒,所以如果單條命令處理時間過長的話會造成堵塞,因此redis要避免長命令,如keys, flushall等。

2 . Redis API的理解和使用

      a . 字串

          ①  結構和命令

           key value 結構,key都是字串,value有上圖說的5種類型,雖說value存的是字串(實際儲存的都是二進位制),但是value可以儲存多種,如字串(world),數字(1, 2.2), 序列化資料(如json資料)等。

          get, set:專門針對字串的命令,得到和設定key的值。

          incr, decr,incrby,decrby:第一個是自增1(incr count),第二個為自減1(decr count),第三個是自增自定義的數(incrby count 2),第四個是自減自定義的數(decrby count 2)

          setnx:key不存在則設定值為value,存在則失敗。(n為null的意思,setnx可以理解為為add操作)

          set key value xx : key存在則設定value覆蓋原來的值,不存在則失敗。(set key value xx 可以理解為update操作)

          mget key1 key2  key3 :批量得到多個key的值,原子操作,O(n),效率比多次獲取快了 n-1 次網路時間。

          mset key1 value1 key2 value2 key3 value3 :批量設定多個值,O(n)。

          ②  內部編碼

          ③   快速實戰

          記錄網站每個使用者頁面的訪問量:incr userid:pageView     ---->(key用userid + 頁面名稱的字串來記錄)

          快取視訊網站的熱門視訊資訊: set vid vedioInfo  (key用vid表示,值是視訊的二進位制序列化檔案)

          ④   查漏補缺

           getset key value: 設定key為value,返回oldvalue。

           append key value: 追加value

           strlen key : 計算key的長度,O(1),和dbsize類似,有專門存長度的屬性。

           incrbyfloat key value: 給浮點數自增自定義的數(incrbyfloat count 1.2)

           getrange key a b: 得到key中value的第a個到第b個字元,從0開始算。

           setrange key position newValue : 將position位置的value用newValue設定。

b . hash

          ①  特點,結構

          相當於Mapmap,在一箇中還有一個map,一個hash也可以理解成資料庫一張表的一行資料,一行資料有很多屬性和值,但是每個hash中的屬性可以不同。

             這裡的user:1 , user:2 就是一個hash

          ②  命令

所有命令以h開頭

         hget,hset,hdel:和string的操作一致,如 hget key field ,hset key field value,hdel key field

         hexists,hlen :判斷是否存在欄位和判斷hash有多少個欄位, 如hexists key field, hlen key 時間複雜度為O(n) (這裡不知道怎麼獲取hash中某個欄位的長度

         hmget,hmset : 一次返回 / 設定一個hash中的多個field的值 , 如hmget key field1 field2 field3, hmset key field1 value1 field2 value2 field3 value3 ,時間複雜度 O(n)

         hincrby key field count : 給key中field增加count值, 這個count可以是負數(一個命令代替了string的incr,decr,incrby,decrby)

         hgetall key : 返回key的所有field和value, O(n),在hash field和value很多的時候要注意,可以用hmget代替

         hvals key,hkeys key : 得到key的所有value值, 得到所有key的field值。

          ③   快速實戰

          記錄每個使用者個人主頁的訪問量: hincrby user:1 pageView 1  (這個和上面直接用string記錄count不一樣的是這是用一個user的一個pageView欄位來記錄訪問量,key為user:1, field為頁面名,每次新增量為1)

          ④   查漏補缺

hsetnx key field, hincrbyfloat key field float : 用法和string用法一致。

c . list

          ①  特點

               有序(遍歷的時候按照插入順序打出),可以重複,左右兩邊都可以插入彈出。

               這裡放一張list內部編碼為linkedlist 結構的圖

          ②  命令API (從增刪改查4個方面來講述)

                  增加

               rpush key value1  value2  value3 :從右邊插入value,最後結果就是 value1,value2, value3, 時間複雜度為O(n)

               lpush key value1  value2  value3 : 從左邊插入value,最後結果是value3,value2, value1,時間複雜度為O(n)

               linsert key before | after value newValue :在value before | after 插入newValue,時間複雜度為O(n)

                 刪除

lpop key : 彈出左邊的第一個值,O(1)

               rpop key : 彈出右邊的第一個值,O(1)

               lrem key count value : 刪除key中count數量的value值,count>0 時從左到右刪,count<0 時從右到左刪count絕對值的數,=0 時刪除所有value值。

               ltrim key start end : 保留 [start, end]  的值,O(n),適合對大表的修建,比如每次保留90%

                 查詢

lrange key start end : 查詢  [start, end] 範圍內的數, 時間複雜度O(n),-1為最後一位數,[0, -1] 即查詢所有的值

               lindex key index : 查詢下標為index的值,時間複雜度O(n), lindex key -2 , 即查詢倒數第二個數

               llen key : 獲取list的長度, 時間複雜度為O(1)

                 修改

lset key index newValue : 修改下標為index的值為newValue,時間複雜度為O(n)

          ③   快速實戰

時間軸微博展示: 微博關注的人發了新微博展示在時間軸最前面(用列表的lpush),並且得到範圍內的資料做分頁(用range)

          ④   查漏補缺

blpop,brpop key timeout:阻塞彈出,等待 timeout時間去彈出,超出timeout則失敗,timeout=0為永不等待。

                       

d . set(集合)

          ①  特點 

               無序,不重複,支援集合間的操作

          ②  集合內API

               sadd key element : 新增元素,element 可以為多個, 時間複雜度和新增的元素相關

               srem key element: 刪除元素,element可以為多個,時間複雜度和新增的元素相關

               scard key : 得到key中的元素個數,O(1)

               sismember key element :判斷element是否在集合中。

               srandmember key count : 隨機得到集合中count個數的值,就是隨機查詢,不刪除。

               smembers key : 得到集合中的所有元素, 返回結果無序,小心,集合中的資料太大時會造成redis堵塞。在生產環境可以用sscan代替。

              spop key : 隨機彈出一個元素 。 實戰中可以用來當做抽獎系統選中獎使用者,所有使用者是一個集合,隨機彈出中獎使用者。

          ③  集合間API

              sdiff set1 set2 : 差集,set1 - set2

              sinner set1 set2 : 交集,set1  set2 相同元素的集合

              sunion set1 set2 : 並集,set1 + set2

              sdiffstore | sinnerstore | sunionstore newSet set1 set2 :將set1 set2 的集合在進行交,並,差之後儲存到一個newSet的集合。 

          ④   實戰

               抽象池中選中獎使用者(spop)。

               微博或者qq的共同好友,共同關注等(sinner).

e . zset(有序集合)

          ①  特點,結構和命令

               用分值(store)來進行排序。

         

          ②  重要API

              命令基本都以 ‘Z’ 開頭

              zadd  key score element: 新增元素,score element 可以有多對,O(logN)

              zrem key element : 刪除元素,  score element 可以有多對

              zscore key element :得到element的score 

              zincrby key count element : 給element的score增加count值(count可以為負)

              zcard key :得到集合中的個數。 O(1)

              zrank | zrevrank key element: 得到element在集合中的排名,前者按照分值從小到大排名,後者按照分值從大到小排名。

              zrange key start end [withscores] : 按照排名(從小到大遞增)得到範圍內的元素(後面的withscores表示分值是不是一起列印) , 把zrange 換成zrevrange 則是按照從大到小遞減來排名取值。

              zrangebyscore start end [withscores] :按照分值排序(從小到大)得到分值在start到end內的元素。

              zcount key scoreStart scoreEnd : 按照分值得到start到end之間的元素個數。 O(logN + m)  ==> N為集合中的元素個數,m為start到end間的個數

             zremrangebyrank key start end : 按照排名排序刪除排名在start到end之間的值。

             zremrangebystore key start end : 按照分數排序刪除分值在start到end之間的值。

          ③   快速實戰

                 可以應用於排行榜,音樂排行榜,點贊數榜等。最核心的是zset中的score儲存的內容,可以為音樂聽歌次數,時間戳用於按時間排序等。

(接下來會學習redis結合java 的使用,redis的持久化,高可用和分散式等內容)

相關推薦

詳細完整redis學習日記

一、redis是什麼? 1 .  開源框架; 2 . 多種資料結構; 3. 基於鍵值對的儲存服務系統; 4. 高效能、功能豐富。 二、redis的特性 1. 速度快:          最關鍵的就是直接儲存在計算機記憶體中; 第二使用的執行緒模型是單執行緒模型;

XX-NET史上詳細完整教程

偽造 不用 app 分享圖片 AS 版本 firefox 配置過程 自動切換 前言   XX-NET,系GAE類代理,即通過可用Google ip連接Google App Engine項目,然後把所有tcp請求發送給Google App Engine,最終實現科學式網絡的

史上全、詳細的Docker學習資料

一、Docker 簡介 Docker 兩個主要部件: Docker: 開源的容器虛擬化平臺 Docker Hub: 用於分享、管理 Docker 容器的 Docker SaaS 平臺 – Docker Hub Docker 使用客戶端-伺服器 (C/S) 架構

史上全、詳細的 kafka 學習筆記!

一、為什麼需要訊息系統 1.解耦:允許你獨立的擴充套件或修改兩邊的處理過程,只要確保它們遵守同樣的介面約束。 2.冗餘:訊息佇列把資料進行持久化直到它們已經被完全處理,通過這一方式規避了資料丟失風險。許多訊息佇列所採用的"插入-獲取-刪除"正規化中,在把一個訊息從佇列中刪除之前,需要你的處理系

詳細的java學習路線圖

對於Java程式設計師而言,紮實的基礎是不可或缺的,基礎的牢固程度決定了Java這條路你能走多遠,所以要掌握並精通Java基礎知識。無論你是通過自學走上Java道路的還是通過培訓來進行轉型的,對於Java程式設計師而言技術和好的程式設計習慣都是很重要的!   在Java中,面向物件思

vuex詳細完整的使用用法 vuex詳細完整的使用用法

原 vuex最詳細完整的使用用法 2018年03月01日 15:05:10 飛歌Fly 閱讀數:1228

詳細redis學習(1)-入門篇

什麼是Redis 基本概念 redis是一個開源的、使用C語言編寫的、支援網路互動的、可基於記憶體也可持久化的Key-Value資料庫(非關係性資料庫)。 redis的優勢 速度快,因為資料存在

Redis學習日記--redis持久化

1.什麼是持久化 將資料從掉電易失的記憶體存放到能夠永久儲存的裝置上 2.Redis持久化方式 RDB(Redis DB)             AOF(AppendOnlyF Redis持久化-RDB 在預設情況下,Redis 將資料庫快照儲存在名字為 du

這可能是詳細的iOS學習入門指南(含書目/文件/學習資料)

零基礎小白如何進行iOS系統學習?入門後如何進階,進而成為資深的iOS專家?iOS開發者的能力圖譜是怎麼樣的?想要走向專家級別,需要怎樣的知識體系?網易阿里等網際網路公司需要怎樣的iOS人才?……這些問題恐怕是想要入行iOS或者初入行1-3年的開發同學經常碰到的,今天我們邀

面試 詳細的Nginx學習教程

upstream backend { server backend1.example.com; server backend2.example.com; server.backend3.example.com; } server { location / {

這絕對是有史以來詳細的web前端學習路線

動畫 bsp run 新的 流式 中心 四階 web服務器 express路由 第一階段: HTML+CSS: HTML進階、CSS進階、div+css布局、HTML+css整站開發、 JavaScript基礎: Js基礎教程、js內置對象常用方法、常見DOM樹操作大全、E

Disconf 學習系列之全網詳細的最新穩定Disconf 搭建部署(基於Ubuntu14.04 / 16.04)(圖文詳解)

class 6.0 conf ubuntu14 穩定 div ubun 搭建 學習   不多說直接上幹貨! https://www.cnblogs.com/wuxiaofeng/p/6882596.html (ubuntu16.04) https

Disconf 學習系列之全網詳細的最新穩定Disconf 搭建部署(基於Windows7 / 8 / 10)(圖文詳解)

分享 study str www windows 最新 1.8 環境 text   不多說,直接上幹貨! 工作環境以及安裝依賴軟件 Zookeeper-3.4.8 Disconf 2.6.36 Nginx 1.9.9(見如下博文的phpstu

java知識分享網|java學習路線詳細的路線

下載 html jquery 地址 href wpf -h elastic bat java知識分享網|java學習路線最詳細的路線 來源【www.51dali.cn】【51dali資料分享網-免費資料下載】 下載說明-獲取以下資料密碼請訪問:http://www.51da

Redis學習總結(1)——Redis記憶體資料庫詳細教程

1.Redis是什麼 2.redis的作者何許人也 3.誰在使用redis 4.學會安裝redis 5.學會啟動redis 6.使用redis客戶端 7.redis資料結構 – 簡介 8.redis資料結構 – strings 9.redis資料結構 – lists 10.redis

一起學大資料|詳細的大資料學習資源教程,嘔心瀝血全部分享

跟大家已經分享了這麼長時間的大資料文章了,我們的一起來學大資料系列已經將Java和Linux全部做了一次基礎的分享。 今天,我把我整理的全套大資料資源分享給大家,一起共同學習,記得關注呦。   很多初學者,對大資料的概念都是模糊不清的,大資料是什麼,能做什麼,學的時候,該按照什

【轉】Hadoop學習--第二篇:史上詳細的Hadoop環境搭建

GitChat 作者:鳴宇淳 原文: 史上最詳細的Hadoop環境搭建 前言 Hadoop在大資料技術體系中的地位至關重要,Hadoop是大資料技術的基礎,對Hadoop基礎知識的掌握的紮實程度,會決定在大資料技術道路上走多遠。 這是一篇入門文章,Hadoop的學

Hadoop學習之shuffle過程詳細講解

hadoop1.x和hadoop2.x的區別: Hadoop1.x版本: 核心主要由Hdfs和Mapreduce兩個系統組成,其中Mapreduce是一個離線分散式計算框架,由一個JobTracker和多個TaskTracker組成。 JobTracker的主要作用:JobTracker

詳細的web前端學習路線,不看後悔

訪問 svg 需求 特征 jquer quest 技術 jqueryui node.js 第一階段: HTML+CSS: HTML進階、CSS進階、div+css布局、HTML+css整站開發、 JavaScript基礎: Js基礎教程、js內置對象常用方法、常見DOM樹操

適合程式設計零基礎詳細的大資料學習線路

要說當下IT行業什麼最火?ABC無出其右。所謂ABC者,AI + Big Data + Cloud也,即人工智慧、大資料和雲端計算(雲平臺)。每個領域目前都有行業領袖在引領前行,今天我們來討論下大資料Big Data這個方向。 二,大資料裡面的角色 角色一:大資料工程 想學習的同學歡迎加