1. 程式人生 > >redis學習筆記01 — 基本介紹、安裝配置及常用命令

redis學習筆記01 — 基本介紹、安裝配置及常用命令

redis——NoSQL的一種

為了解決高併發、高可用、高擴充套件、大資料儲存等一系列問題而產生的資料庫解決方案,就是NoSQL

  • NoSQL,非關係型資料庫,全名:Not Only Sql,它不能代替關係型資料庫,只能作為關係型資料庫的一個良好補充。

redis 簡介

是使用c語言開發的一個高效能鍵值資料庫,redis可以通過一些鍵值型別來儲存資料。

redis 資料型別

  • String:字串型別
  • map:雜湊型別
  • list:列表型別
  • set:集合型別
  • sortedset:有序集合型別

redis的安裝

方法一:

  • 點選執行Redis-x64-3.2.100.msi,正常安裝。
  • 解壓redis-5.0.3.tar.gz檔案,將其中的內容都拷貝到安裝目錄下

方法二:

  • 把redis-5.0.3.tar.gz解壓到redis資料夾。
  • 解壓Redis-x64-3.2.100.zip檔案,將其中內容都拷貝到上一步的redis資料夾中
  • 將redis資料夾放到自己的安裝目錄

redis 啟動

服務端啟動

  • 通過cmd終端命令,進入redis資料夾
  • 執行命令:
    • redis-server.exe redis.windows.conf
    • 或redis-server.exe redis.conf

客戶端啟動

  • 通過cmd終端命令,進入redis資料夾
  • 執行命令:redis-cli.exe
  • 帶引數命令:redis-cli -h 主機名 -p 埠號(預設6379) -a 密碼 -n 0(指定幾號資料庫,預設0號資料庫)

redis 常用命令

  • 服務端啟動:redis-server.exe redis.windows.conf
  • 客戶端啟動:redis-cli.exe
  • 賦值命令
    • 語法:set key value
    • 示例:

      127.0.0.1:6379> set test 1234
      OK
  • 取值命令
    • 語法:get key
    • 示例:

      127.0.0.1:6379> set test 1234
      OK
  • 取值並賦值
    • 語法:getset key value
    • 示例:

      127.0.0.1:6379> getset test 222
      "1234"
      127.0.0.1:6379> get test
      "222"
  • 設定多個鍵值對
    • 語法:mset key1 value1 key2 value2 key3 value3
    • 示例:

      127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
      OK
  • 獲取多個鍵值對
    • 語法:mget key1 key2 key3
    • 示例:

      127.0.0.1:6379> mget k1 k3
      1) "v1"
      2) "v3"
  • 刪除資料
    • 語法:del key
    • 示例:

      127.0.0.1:6379> del test
      (integer) 1
  • 數值增減
    • 作用:當儲存的字串是整數時,redis提供了一個使用的命令incr,其作用是讓當前的鍵值遞增,並返回遞增後的值
    • 語法1_增加1:incr key
    • 示例1:

      127.0.0.1:6379> set k4 2
      OK
      127.0.0.1:6379> incr k4
      (integer) 3
      127.0.0.1:6379> get k4
      "3"
      127.0.0.1:6379>
    • 語法2_增加increment:incrby key increment
    • 示例2:

      127.0.0.1:6379> incrby k4 3
      (integer) 6
    • 語法3_減少1:decr key
    • 語法4_減少increment:decrby key increment

  • 向尾部追加值
    • 語法:append key value
    • 作用:向鍵值的尾部追加value,如果鍵值不存在,則將該鍵的值設定為當前value,相當於set key value。返回的是追加後字串的長度。
  • 獲取字串長度
    • 語法:strlen str
    • 作用:返回鍵值的長度,如果鍵不存在則返回0
  • 主鍵自增
    • 商品編號、訂單號採用string的遞增數字特性生成
    • 示例:
      • 定義商品編號:key:items:id
      • 自增:incr items:id
  • 把java物件儲存到redis中
    • 假設有User物件以JSON序列化的形式儲存到redis中,User物件有id,username,password,age,name等屬性,儲存過程為:User物件--->json(string)--->redis
    • 如果在業務上只是更新age屬性,其他屬性不做更新,應該使用hash方式解決該問題。
  • hset命令:不區分插入和更新操作,執行插入操作時hset命令返回1,執行更新時返回0;
    • 語法:hset key field value
    • 示例:
        127.0.0.1:6379> hset user username zs
        (integer) 1
        127.0.0.1:6379> hset user username ls
        (integer) 0
    • 一次設定多個欄位值
    • 語法:hmset key field1 value1 field2 value2
  • hsetnx命令:當欄位不存在時賦值,類似於hset,區別在於如果欄位存在,不執行任何操作。
    • 語法:hsetnx key field value
    • 如果user中沒有age欄位,則設定age值為value,否則不做任何操作
    • 示例:

      127.0.0.1:6379> hsetnx user sex 1
      (integer) 1
      127.0.0.1:6379> hsetnx user age 30
      (integer) 0
      127.0.0.1:6379> hget user age
      "23"
  • 獲取一個欄位的值
    • 語法:hget key field
  • 獲取一個欄位的值
    • 語法:hmget key field1 field2
  • 一次獲取物件的所有欄位
    • hgetall key
  • 刪除欄位
    • 可以刪除一個或多個欄位,返回值是被刪除欄位的個數
    • hdel key field1 field2 ...
  • 判斷欄位是否存在
    • 語法:hexists key field
    • 作用:若存在,返回"1",反之返回"0"
    • 示例:

      127.0.0.1:6379> hexists user age
      (integer) 0
      127.0.0.1:6379> hexists user username
      (integer) 1
  • 只獲取欄位名或欄位值
    • 欄位名語法:hkeys key
    • 示例:

      127.0.0.1:6379> hkeys user
      1) "username"
    • 欄位值語法:hvals key
    • 示例:

      127.0.0.1:6379> hget user username
      "fdfs"
  • 檢視一個key中的欄位數量
    • 語法:hlen key
  • hash方式儲存的完整示例:儲存商品資訊
    • 商品欄位:【商品id,商品名稱,商品描述,商品庫存,商品評價】
    • 定義商品資訊key
      • 語法:hmset items:主鍵值 key1 value1 key2 value2
      • 程式碼:hmset items:1001 id 3 name apple price 999.99
    • 獲取部分商品資訊
      • 語法:hget items:主鍵值 key1 key2
      • 程式碼:hget items:1001 id name
    • 獲取全部商品資訊
      • 語法:hgetall items:主鍵值
      • 程式碼:hgetall items:1001
  • 向連結串列兩端增加元素
    • 向列表左邊增加元素(最後新增的元素在最上邊)
      • 語法:LPUSH list:key v1 v2 v3
    • 向列表右邊增加元素(最後新增的元素在最下邊)
      • 語法:RPUSH list:key v1 v2 v3
    • 示例:

      127.0.0.1:6379> lpush list:1 2 3 4 5
      (integer) 4
      127.0.0.1:6379> lpush list:2 2 3 4 5
      (integer) 4
      127.0.0.1:6379> rpush list:3 2 3 4 5
      (integer) 4
  • 檢視列表:
    • 語法:lrange key start stop
    • 作用:LRANGE命令是列表型別最常用的命令之一,獲取列表中的某一片段,key為'list:連結串列名',返回start、stop之間的所有元素(報刊兩端元素),索引從0開始,所以也可以是負數。例如:“-1”代表最後邊的一個元素,"-2"代表倒數第二的元素
    • 示例:

      127.0.0.1:6379> lrange list:1 0 2
      1) "5"
      2) "4"
      3) "3"
      127.0.0.1:6379> lrange list:2 1 2
      1) "4"
      2) "3"
      127.0.0.1:6379> lrange list:1 0 -1
      1) "5"
      2) "4"
      3) "3"
      4) "2"
  • 從列表兩端彈出元素
    • 從左側彈出:
      • 語法:lpop key
      • 作用:lpop命令是從左側彈出一個元素,將列表左側的元素移除並返回被移除的元素值。
    • 從右側彈出:
      • 語法:rpop key
      • 作用:rpop命令是從右側彈出一個元素,將列表右側的元素移除並返回被移除的元素值。
    • 示例:

      127.0.0.1:6379> lpop list:1
      "5"
      127.0.0.1:6379> rpop list:1
      "2"
      127.0.0.1:6379>
  • 獲取列表中元素個數
    • 語法:llen key
    • 示例:

      127.0.0.1:6379> llen list:1
      (integer) 2
  • 刪除列表中指定的值

    • 語法:
      • LREM key count value (注意:沒有RREM命令)
    • 作用:LREM命令會刪除列表中前count個值為value的元素,返回實際刪除元素個數。根據count值得不同,該命令執行的方式也會有所不同:
      • 當count>0時,LREM會從列表左側開始刪除(根據count值進行元素刪除)
      • 當count=0時,LREM刪除列表中所有符合條件的元素
      • 當count<0時,LREM會從列表右邊(後邊)開始刪除(根據count值進行元素刪除)
    • 示例:建立一個帶重複元素的列表c,刪除其中兩個字母c,檢視剩餘的元素

      127.0.0.1:6379> lpush list:c a b c d d b c b s d c
      (integer) 11
      127.0.0.1:6379> lrem list:c 2 c
      (integer) 2
      127.0.0.1:6379> lrange list:c 0 -1
      1) "d"
      2) "s"
      3) "b"
      4) "b"
      5) "d"
      6) "d"
      7) "c"
      8) "b"
      9) "a"      
  • 檢視列表下標對應的元素值
    • 語法:LINDEX key value
    • 示例:

      127.0.0.1:6379> lindex list:c 3
      "b"
  • 在集合set中新增、刪除元素
    • 新增語法:sadd key member ..
    • 刪除語法:srem key member ..
    • 示例:

      127.0.0.1:6379> sadd set:a a b c
      (integer) 3
      127.0.0.1:6379> sadd set:a a
      (integer) 0
      127.0.0.1:6379> srem set:a b
      (integer) 1
  • 查詢集合中的所有元素
    • 語法:smembers key
    • 示例:

      127.0.0.1:6379> smembers set:a
      1) "b"
      2) "a"
      3) "c"
  • 判斷集合中是否存在
    • sismember key member
    • 若存在返回“1”,不存在返回“0”
    • 示例:

      127.0.0.1:6379> sismember set:a b
      (integer) 1
  • 集合的差集運算(A-B=屬於A不屬於B的集合)
    • 語法:sdiff key key ...
    • 示例:

      127.0.0.1:6379> sadd setA 1 2 3 4 5
      (integer) 5
      127.0.0.1:6379> sadd setB 3 4 5 6 7
      (integer) 5
      127.0.0.1:6379> sdiff setA setB
      1) "1"
      2) "2"
      127.0.0.1:6379> sadd setC 4 5 6 7 8
      (integer) 5
      127.0.0.1:6379> sdiff setC setB set A
      1) "8"
  • 集合的交集運算(屬於A且屬於B的元素的集合)
    • 語法:sinter key key ...
    • 示例:

      127.0.0.1:6379> sinter setA setB
      1) "3"
      2) "4"
      3) "5"
  • 集合的並集運算(屬於A或屬於B的元素的集合)
    • 語法:sunion key key ...
    • 示例:

      127.0.0.1:6379> sunion setA setC
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      5) "5"
      6) "6"
      7) "7"
      8) "8"

其他知識點

java中和redis中列表儲存方式對比

  • 在java中ArrayList和LinkedList的區別:
    • ArrayList是使用陣列來儲存資料,特點是:查詢塊、增刪慢
    • LinkedList是使用雙向連結串列儲存資料,特點是:增刪塊,查詢慢。如果查詢的是連結串列兩端的資料也比較塊。
  • 在redis中:
    • list是採用連結串列儲存的,所以對於redis的list資料型別的操作,是操作list的兩端資料進行的。

集合型別set和列表型別list的區別:

  • 集合型別set:無序、不可重複
  • 列表型別list:有序、可重複