Redis入門到精通day02
一、Redis簡介
Redis(remote dictionary server) 遠端字典伺服器
1.特點
redis和其他KV緩存産品有以下三個特點:
1.持久化,重新開機後可以再次家在使用
2.資料類型豐富,同時提供list,set,zset,hash等資料結構存儲
3.支援資料備份,即master-slave(主從模式)資料備份
2.作用
1.記憶體存儲和持久化,支援異步寫入同時不影響服務
2.支援取n個資料的操作
3.模拟類似于HTTPSession這種類型的設定過期時間的功能
4.釋出,訂閱消息系統
5.定時器,計數器
二、linux安裝redis
這裡使用docker安裝redis
具體步驟見部落格
挂載+進入容器運作
預設裝載16個資料庫
三、操作redis
1.進入redis
docker exec -it redis redis-cli
2.更換資料庫編号
編号是0~資料庫個數-1
127.0.0.1:6379> select 7 #選擇6号資料庫
OK
127.0.0.1:6379[7]>
3.入門指令
127.0.0.1:6379> DBSIZE #查詢目前庫的所有kv數量
(integer) 4
127.0.0.1:6379> keys * #查詢目前庫所有鍵
1) "backup3"
2) "backup2"
3) "backup4"
4) "backup1"
127.0.0.1:6379> set k1 v1 #存儲k1-v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys k? #模糊查詢k?
1) "k1"
2) "k2"
127.0.0.1:6379> FLUSHDB #删除目前庫資料
127.0.0.1:6379> FLUSHALL #删除所有庫資料
四、常用五大資料類型
String,Hash,List,Set,Zset
1.String
是最基本的類型,一個K對應一個V
String類型是二進制安全的,可以包含任意資料比如jpg或者序列化對象,V最多可以是512M
2.Hash
hash是一個鍵值對集合,特别适合存儲對象,類型與Map<String,Object>
3.List
清單是簡單的字元串清單,可以在頭部或者尾部添加,底層實作是連結清單
4.Set
是String的無序集合,底層使用HashTable實作
5.Zset
Zset是有序集合,也是String類型的集合,不允許存在重複的成員,每個元素都會關聯一個double類型的分數,通過這個分數進行從小到大排序。
Zset的成員是唯一的,分數是可以重複的
五、常用指令
1.redis鍵(key)
keys * 查詢所有key
exists key的名字 判斷某個key是否存在
move key db 從目前庫移動到db庫
expire key 秒鐘 為給定的key設定過期時間
ttl key 檢視還有多少秒過期,-1表示永不過期,-2表示已過期
type key 檢視你的key是什麼類型
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> EXISTS k1 #是否存在k1,存在1,不存在0
(integer) 1
127.0.0.1:6379> EXISTS k5
(integer) 0
127.0.0.1:6379> MOVE k1 1 #将k1移動到第二個庫
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
127.0.0.1:6379> EXPIRE k2 10 #設定k2過期時間為10秒
(integer) 1
127.0.0.1:6379> TTL k2 #查詢過期時間,如果已經過期就是-2,-1表示永不過期
(integer) 7
127.0.0.1:6379> keys *
1) "k3"
127.0.0.1:6379> TYPE k3 #查詢k3類型為String
string
2.redis字元串(String)
set/get/del/append/strlen 設定/擷取/删除/追加/字元串長度
Incr/decr/incrby/decrby 在value是數字的前提下操作,加1/減1/加上一個值/減去一個值
getrange/setrange 擷取範圍/設定範圍
setex(set with expire)鍵秒值/setnx(set if not exist) 設定過期時間/如果不存在則設定
mset/mget/msetnx 同時設定多個kv/擷取多個kv/同時設定多個kv,并要求所有要設定的kv都不存在
getset(先get再set) 擷取舊值設定新值
127.0.0.1:6379> set k1 v1 #設定k1
OK
127.0.0.1:6379> get k1 #擷取k1的值
"v1"
127.0.0.1:6379> del k1 #删除k1的值
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> APPEND k1 123 #v1後面追加123
(integer) 5
127.0.0.1:6379> STRLEN k1 #查詢k1的長度
(integer) 5
127.0.0.1:6379> GET k1
"v1123"
127.0.0.1:6379> set k1 1 #v必須是數字
OK
127.0.0.1:6379> INCR k1 #自增1
(integer) 2
127.0.0.1:6379> INCR k1
(integer) 3
127.0.0.1:6379> INCR k1
(integer) 4
127.0.0.1:6379> INCR k1
(integer) 5
127.0.0.1:6379> DECR k1 #自減1
(integer) 4
127.0.0.1:6379>
127.0.0.1:6379> DECR k1
(integer) 3
127.0.0.1:6379> DECR k1
(integer) 2
127.0.0.1:6379> DECR k1
(integer) 1
127.0.0.1:6379> INCRBY k1 2 #增加2
(integer) 3
127.0.0.1:6379> INCRBY k1 2
(integer) 5
127.0.0.1:6379> INCRBY k1 2
(integer) 7
127.0.0.1:6379> DECRBY k1 2 #減去2
(integer) 5
127.0.0.1:6379> DECRBY k1 2
(integer) 3
127.0.0.1:6379> DECRBY k1 2
(integer) 1
127.0.0.1:6379> set k2 v1234
OK
127.0.0.1:6379> GETRANGE k2 0 -1 #GETRANGE 鍵 0 -1 查詢整個v1
"v1234"
127.0.0.1:6379> GETRANGE k2 0 1 #GETRANGE 鍵 n m 查詢v1的n-m索引值
"v1"
127.0.0.1:6379> SETRANGE k2 0 xxx #SETRANGE 鍵 n xxx 修改從n索引後面為xxx
(integer) 5
127.0.0.1:6379> get k2
"xxx34"
127.0.0.1:6379> SETEX k2 5 10 #設定一個值為10的k2,過期時間為5秒
OK
127.0.0.1:6379> SETNX k1 5 #如果存在k1則設定成功否則設定失敗
(integer) 0
127.0.0.1:6379> SETNX k2 5
(integer) 1
127.0.0.1:6379> get k2
"5"
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 #儲存k1=v1 k2=v2 k3=v3
OK
127.0.0.1:6379> MGET k1 k2 k3 #擷取k1,k2,k3的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> MSETNX k1 111 k4 112 #具有原子性,如果有一個不能加,其他都不行
(integer) 0
127.0.0.1:6379> MSETNX k5 111 k4 112
(integer) 1
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> getset k1 new #擷取舊值并将新值傳入
"v1"
127.0.0.1:6379> get k1
"new"
3.redis清單(list)
lpush/rpush/lrange 從左邊壓入資料/從右邊壓入資料/從左邊範圍
lpop/rpop 從左邊出棧/從右邊出棧
lindex 按照索引下标獲得元素(從上到下)
llen 隊列長度
lrem key 删N個value
ltrim key 開始index 結束index,截取指定範圍的值後再指派給key
rpoplpush 右邊出棧加載左邊
lset key index value
linsert key before/after 值1 值2 在key值前/後插入值
127.0.0.1:6379> LPUSH list1 1 2 3 4 5 #從左邊壓入資料
(integer) 5
127.0.0.1:6379> LRANGE list1 0 -1 #擷取list1全部資料
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> RPUSH list2 1 2 3 4 5 #從右邊壓入資料
(integer) 5
127.0.0.1:6379> LRANGE list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lpop list1 #左邊出棧
"5"
127.0.0.1:6379> rpop list1 #右邊出棧
"1"
127.0.0.1:6379> lpop list2
"1"
127.0.0.1:6379> rpop list2
"5"
127.0.0.1:6379> LINDEX list1 0 #LINDEX list1 n 擷取索引n處的值
"4"
127.0.0.1:6379> LINDEX list2 0
"2"
127.0.0.1:6379> LLEN list1 #擷取清單元素數量
(integer) 3
127.0.0.1:6379> RPUSH list1 1 2 3 4 5 5 5 6 7
(integer) 9
127.0.0.1:6379> LREM list1 2 5 #删除List1中從左往右的2個5
(integer) 2
127.0.0.1:6379> LRANGE list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> LRANGE list2 0 -1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> RPOPLPUSH list1 list2 #将List1的右邊第一個元素出棧壓入到List2的左邊
"7"
127.0.0.1:6379> LRANGE list2 0 -1
1) "7"
2) "2"
3) "3"
4) "4"
4.redis集合(Set)
sadd/smembers/sismember 添加集合/列出集合資料/看是不是集合的資料
scard 擷取集合裡面的元素個數
srem key value 删除集合中元素
srandmember key 某個整數(随機出幾個數)
spop key 随機出棧
smove key1 key2 在key1裡某個值 作用是将key1裡的某個值賦給key2
差集:sdiff
交集:sinter
并集:sunion
127.0.0.1:6379> SADD set1 1 2 3 4 5 #建立set1将12345添加進去
(integer) 5
127.0.0.1:6379> SMEMBERS set1 #set1的所有資料
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SISMEMBER set1 3
(integer) 1
127.0.0.1:6379> SCARD set1 #顯示set1個數
(integer) 5
127.0.0.1:6379> SREM set1 3
(integer) 1
127.0.0.1:6379> SRANDMEMBER set1 #随機出一個數,不删除
"5"
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "4"
4) "5"
127.0.0.1:6379> spop set1 #随機出棧一個數
"1"
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "4"
3) "5"
127.0.0.1:6379> SADD set2 2 3
(integer) 2
127.0.0.1:6379> SMOVE set1 set2 5 #将set1的5移到set2
(integer) 1
127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SADD set2 1 2 3 7 8
(integer) 5
127.0.0.1:6379> SDIFF set1 set2 #取set1為主,找出兩個集合的差集
1) "4"
2) "5"
127.0.0.1:6379> SINTER set1 set2 #找出兩個集合的交集
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SUNION set1 set2 #找出兩個集合的并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "8"
5.redis哈希(hash)
以kv形式存儲,但是v存儲的是kv形式
hset/hget/hmset/hmget/hgetall/hdel
hlen
hexists key 在key裡面的某個值的key
hkeys/hvals
hincrby/hincrbyfloat
hsetnx
127.0.0.1:6379> hset hash1 age 10 #添加age=10的hash表
(integer) 1
127.0.0.1:6379> HGET hash1 age #查找hash1中的age值
"10"
127.0.0.1:6379> HMSET hash2 name zhangsan age 18 #多kv添加
OK
127.0.0.1:6379> hmget hash2 name age #擷取多屬性name,age的值
1) "zhangsan"
2) "18"
127.0.0.1:6379> HGETALL hash2 #擷取hash2的所有kv對
1) "name"
2) "zhangsan"
3) "age"
4) "18"
127.0.0.1:6379> HDEL hash2 name #删除hash2的name鍵值對
(integer) 1
127.0.0.1:6379> HGETALL hash2
1) "age"
2) "18"
127.0.0.1:6379> HLEN hash2 #hash2的長度
(integer) 1
127.0.0.1:6379> HEXISTS hash2 age #hash2是否存在age屬性
(integer) 1
127.0.0.1:6379> HSET hash3 name lisi age 20 sex nan
(integer) 3
127.0.0.1:6379> hgetall hash3
1) "name"
2) "lisi"
3) "age"
4) "20"
5) "sex"
6) "nan"
127.0.0.1:6379> hkeys hash3 #擷取hash3的所有keys
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS hash3 #擷取hash3的所有values
1) "lisi"
2) "20"
3) "nan"
127.0.0.1:6379> HINCRBY hash3 age 2 #hash3的age加2
(integer) 22
127.0.0.1:6379> HINCRBYFLOAT hash3 age 0.5 #hash3的age加0.5
"22.5"
127.0.0.1:6379> hsetnx hash3 age 50 #如果存在則不加,如果不存在則添加
(integer) 0
127.0.0.1:6379> hsetnx hash3 money 50
(integer) 1
6.redis有序集合(Zset)
集合方式是 key score value
zadd/zrange 添加/範圍
zrangebyscore key 開始score 結束score
zrem key 某score下對應的value值,作用是删除元素
zcard/zcount key score區間/zrank key values值,作用是獲得下标值/zscore key 對應值,獲得分數
zrevrank key values值,作用是逆序獲得下标值
zrevrange
zrevrangebyscore key 結束score 開始score
127.0.0.1:6379> ZADD zset1 10 v1 20 v2 40 v3 30 v4 #按照key score value添加
(integer) 4
127.0.0.1:6379> ZRANGE zset1 0 -1 #查詢所有zset1
1) "v1"
2) "v2"
3) "v4"
4) "v3"
127.0.0.1:6379> ZRANGE zset1 0 1 #查詢0-1位置的zset1
1) "v1"
2) "v2"
127.0.0.1:6379> ZRANGEBYSCORE zset1 10 30 #按10-30分數排列zset,加上(表示不含
1) "v1"
2) "v2"
3) "v4"
127.0.0.1:6379> ZREM zset1 v3 #删除v3
(integer) 1
127.0.0.1:6379> ZCARD zset1 #zset1的元素個數
(integer) 3
127.0.0.1:6379> ZCOUNT zset1 10 20 #擷取分數為10-20的zset1集合中個數
(integer) 2
127.0.0.1:6379> ZRANK zset1 v4 #擷取value為v4的值的下标
(integer) 2
127.0.0.1:6379> ZSCORE zset1 v4 #擷取v4的分數
"30"
127.0.0.1:6379> ZREVRANK zset1 v4 #擷取v4的逆序下标
(integer) 0
127.0.0.1:6379> ZREVRANGE zset1 0 -1 #擷取zset1所有逆序元素
1) "v4"
2) "v2"
3) "v1"
127.0.0.1:6379> ZREVRANGEBYSCORE zset1 40 10 #分數從大到小擷取40-10的逆序元素
1) "v4"
2) "v2"
3) "v1"