REDIS分析與思考

一. Redis的歷史

1. 什麼是nosql

    nosql=not only sql,不僅僅是sql,是區別於關係型數據庫的一種。

    關係型數據庫:具有行列組成的表格樣式的數據庫

    nosql數據庫:數據的存儲不需要指定類型、不需要過多的操作就可以橫向擴展,

2. nosql特點:

  • 方便擴展(數據之間KV存儲,沒有關係,很好擴展)
  • 大數據量高性能(官方測試一秒鐘讀取11萬,寫8萬次)
  • 數據類型是多樣的,隨取隨用,並可以設置過期
  • 關係型數據庫RDBMS和nosql數據庫區別

傳統的RDBMS:

- 結構化組織(行列組成的表關係)

- 有單獨的執行操作語法

- 嚴格的一致性

- 事務控制

nosql數據庫:

- 沒有固定的查詢語句

- 存儲形式多樣:鍵值對存儲、列存儲、文檔存儲、圖形數據庫

- 保證最終一致性

- 高性能、高可用、高擴展

- CAP定理和BASE  實現了異地多活。

3. nosql 的四大分類

①KV鍵值對

   通過KV的形式完成存儲,像Redis的KV鍵值對

②文檔型數據庫

  最經典的就是MongoDB,他是一個基於分佈式文件存儲的數據庫,主要用來處理大量的文件

  他是介於關係型數據庫和非關係型數據庫之間,並且是非關係型數據庫中最接近關係型數據庫的數據庫.

③列數據庫

  Hbase、分佈式文件系統等以列進行存儲的數據庫

④圖形數據庫(關係拓撲圖)

一般用來存儲朋友圈社交網絡、廣告產品推薦等。

------圖片來自網絡 

4. 什麼是Redis、Redis能做什麼?

  Redis(Remote Dictionary Server ),即遠程字典服務。是支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫。

Redis能做什麼:

  • 可以作爲內存存儲,並提供持久化功能(內存不持久化則斷電即失)
  • 效率高,可以用於告訴緩存
  • 發佈訂閱系統
  • 地圖信息分析
  • 計數器計時器控制

 

二.Redis安裝以及基本知識

1. Linux安裝Redis

  ①下載Redis安裝包:https://redis.io/

  ②解壓安裝包至/usr/develop/redis目錄中

  ③解壓安裝包,tar -zxvf redis-5.0.8.tar.gz

  ④安裝Redis編譯環境: yun install -y gcc-c++

  ⑤進入到Redis的路徑,make執行編譯後make install執行安裝。

  ⑥安裝完成後默認安裝目錄是在/usr/local/bin下,將安裝包中的配置文件rdis.conf複製到/usr/local/bin/wconf下:

 cp /usr/develop/redis/redis.conf /usr/local/bin/wconf

  ⑦修改配置文件:

            默認是非後臺啓動,修改爲後臺啓動:daemonize yes

            默認是本機訪問,修改爲任意終端訪問:bind 0.0.0.0

            默認是無密碼訪問,添加Redis訪問密碼:取消第502行的註釋,並修改密碼爲root

                              # use a very strong password otherwise it will be very easy to break.
                              #         requirepass root

                              # Command renaming.

  ⑧啓動Redis。指定配置文件方式啓動:在/usr/local/bin路徑下:./redis-server wconf/redis.conf,查詢到Redis進程號即代表啓動成功了。

  ⑨啓動客戶端測試ping爲pong即代表服務啓動成功

2.  redis-benchmark壓力測試工具的使用

    redis-benchmark是Redis官方的壓力測試工具,通過命令來進行測試。

   簡單測試1000個併發下請求10W個請求,每次請求100字節的壓力測試命令:

   redis-benchmark -h localhost -p 6379 -c 1000 -n 100000 -d 100

其他常用指令可自行百度

3. Redis的基本知識 

    ---redis默認有16個庫,在配置文件database 16 中表示

    ---Redis是單線程

             Redis是基於內存操作。CPU不是Redis的性能瓶頸(多線程是CPU),Redis的瓶頸是根據機器的內存和網絡帶寬。所以使用單線程來實現。

            爲什麼單線程還這麼快呢:

                 ①多線程不一定比單線程效率高,多線程會涉及到CPU的上下文切換,這是一個耗時的操作。Redis是完全放在內存操作的,讀寫都是在同一個CPU上操作的。同時也不存在併發時的加鎖釋放鎖的問題。當訪問量多時,單線程能夠節省多線程CPU的上下文切換。所以說單線程是最快。

                ②才用多路IO複用模型,屬於非阻塞IO

4. redis的常用命令

不會的命令可以查看官網

* select 6 #切換數據庫

* dbsize  #查看數據庫大小

         

三. Redis的五大數據類型

1. redis-key的命令

*  keys *  # 查看所有key

*  flushdb  #清空當前庫   flushall  #清空所有數據庫

* exists key  #查詢某個key是否存在,1存在/0不存在

* move key 1 #移除key值,1代表當前庫

* expire key 30   #設置key值30秒過期

* ttl key   #查詢key的剩餘過期時間 單位是S

* type  key   #查看key的數據類型

2. String(字符串)

字符串類型的KV數據,使用場景:value一般是字符串或者數字。可以用來做計數器、統計數量等

* set key hello  #設置值

* get key   #獲取值

* mset k1 v1 k2 v2    # 批量設置kv值,同時set了k1、k2

mget k1 k2    # 批量獲取值,同時獲取k1、k2的值

* append key "append"  # 給key值後面追加字符串append,如果key值不存在,則會新創建

* strlen key  #獲取字符串的長度

* incr key  #將key值+1,可以用來記錄網站的瀏覽量 每次執行就會+1,操作非數字的key會報錯

* incrby key 10  #將key值每次+10,即可以設置步長

* decr key  #將key值-1。

* decrby key 10  #將key值每次-10

* getrange key 0 3    #截取字符串,相當於java中substring, getrange key start end  ,從0開始,本例爲從0截取到3---->[0,3]字符

       GETRANGE key1 4 -1   #從4截取到最後,-1爲最後。

* setrange key 1 xx  #替換,把key中從第1個開始,替換成xx。指定位置的替換。可替換一個或多個

* setex(set with expire)     #設置一個key值,並設置過期時間  : setex key 30 "hello", 設置key值爲hello並30秒過去

setnx(set if no exist)     #設置一個key值,當他不存在時,如果該key值已經存在,則會設置失敗,直接set如果存在則會覆蓋

           setnx key "hello"   如果存在返回0,set失敗,如果不存在返回1,set成功。 在分佈式鎖中常常會被使用。

* msetnx k1 v1 k4 v4        #setnx是一個原子性操作,如果k1已經存在了,k4不存在,同樣k4也不會添加成功。

   技巧:通過巧妙的key值,方便工作 例如,設置ID爲1的用戶登錄次數+1   set user:1:login 0   以後再每次給該用戶+1時,可以動態的根據ID來給該value值進行操作,不用直接存儲user對象解析後再+1了。

* getset key hello   # 如果不存在值,返回null,並設置新值,如果存在,返回原來值,並設置新的值。可用來更新操作。

3. list(列表)

在Redis裏,可以把list作爲棧、隊列、阻塞隊列來使用。list中的值是可以重複的。

所有list命令都是用l開頭的。

list的存儲順序是: lpush list one, lpush list two, lpush list three。則獲取第0個位three,獲取第1個位two,獲取第2個爲one.順序爲先進後出。倒着來的。

list 實際上是一個鏈表,存在node,node 有before和after, 在left和right都可以進行插入值。

在兩邊執行操作,效率最高,但是在中間元素操作,效率會低一點。

* lpush list one  lpush list two   lpush list three      #將一個值或者多個值放入列表的頭部,push的順序是往左邊(頭部)放,存放順序是從右至左

* lrange list 0 -1   #獲取全部的list值,   lrange  list  0 1 ,獲取0-1的值, 順序是從左到右取值。

* rpush list four   #將一個多個值放在列表的尾部。push的順序是往右邊(尾部)放,存放順序爲從左往右。

* lpop list    #將list的值最左邊的值移除,並返回該值。即第一個

* rpop list   #將list的最右邊的值移除,並返回該值。即最後一個

lrem list 2 one    #從左到右移除list中指定的兩個one值,並指定移除個數

* lindex list 1   # 通過下標獲取list中的某個值。從0開始

* LLEN list   #獲取list的長度

* ltrim list 1 2     #將list中的1-2位置上的值進行截取,list中其餘的就沒有了。通過下標截取指定長度。

* rpoplpush list otherList    #移動操作。將list中的最後一個(rpop)移動到(lpush) otherList中去,otherlist中就是list被移除的最後一個值

* lset  list 0 value    #將列表中已經存在的指定下標的值更新爲另一個值,如果list不存在/或者下標越界,則報錯。

* linsert list before/after "hello" "other"   #在list中指定的元素前/後  插入一個指定的value值。hello是list中存在的指定元素, other 是需要插入的值,此時執行結果就是 list中多了一個元素,在hello的前面

 

 

 

 

 

 

 

 

 

三. Redis配置以及持久化

四. Redis事務、訂閱發佈

五. Redis的主從複製以及哨兵模式

六. 緩存穿透雪崩解決方案

七. API使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章