redis學習筆記01 — 基本介紹、安裝配置及常用命令
阿新 • • 發佈:2019-01-06
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:有序、可重複