在工作過(guò)中運(yùn)用到了redis的相關(guān)知識(shí),在結(jié)合多方資料后,加深了對(duì)于redis的使用和理解,下面就是電腦語(yǔ)言Redis學(xué)習(xí)總結(jié),快來(lái)看一看吧。
最近在工作中使用到了redis的相關(guān)緩存的知識(shí),之前對(duì)redis的理解僅僅局限于“緩存數(shù)據(jù)”、“redis分布式鎖”的簡(jiǎn)單使用,了解的知識(shí)面很窄。在結(jié)合了多方資料和虛機(jī)、java代碼進(jìn)行實(shí)操后,加深了對(duì)redis的使用和理解。趁熱打鐵,對(duì)學(xué)習(xí)到的知識(shí)做一下總結(jié)。
本次學(xué)習(xí)筆記 將從以下幾個(gè)方面進(jìn)行學(xué)習(xí)總結(jié):
NoSql 簡(jiǎn)單介紹
* Redis的基本數(shù)據(jù)類型
一、NoSql 簡(jiǎn)單介紹
1、NoSql是什么?
NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫(kù),NoSQL即Not-Only SQL,它可以作為關(guān)系型數(shù)據(jù)庫(kù)的良好補(bǔ)充。
2、能解決什么?
為了解決高并發(fā)、高可擴(kuò)展、高可用、大數(shù)據(jù)存儲(chǔ)問(wèn)題而產(chǎn)生的數(shù)據(jù)庫(kù)解決方案,就是NoSql數(shù)據(jù)庫(kù)。
3、該怎么用? NoSql數(shù)據(jù)庫(kù)的4大分類 :
KV鍵值,存儲(chǔ)數(shù)據(jù)庫(kù)(memcache、Redis的存儲(chǔ)類型)--本次學(xué)習(xí)redis存儲(chǔ)數(shù)據(jù)庫(kù)文檔型數(shù)據(jù)庫(kù)(MongoDB)--之后學(xué)習(xí)
列存儲(chǔ)數(shù)據(jù)庫(kù)(HBase)--之后學(xué)習(xí)
圖形數(shù)據(jù)庫(kù)(Neo4J)--之后學(xué)習(xí)
4、分布式數(shù)據(jù)中需要遵循的CAP原理
C:Consistency(強(qiáng)一致性)
A:Availability(可用性)
P:Partition tolerance(分區(qū)容錯(cuò)性)
沒(méi)有NosQL數(shù)據(jù)庫(kù)能同時(shí)滿足這三點(diǎn)
這句話我個(gè)人的理解就是,在對(duì)于數(shù)據(jù)的強(qiáng)一直性和數(shù)據(jù)的分區(qū)容錯(cuò)性之間,系統(tǒng)更加傾向于接受“分區(qū)容錯(cuò)性”。在分布式數(shù)據(jù)庫(kù)中有個(gè)3進(jìn)2的原則,就是一個(gè)分布式系統(tǒng)中,最多只能同時(shí)滿足CA、CP、AP相互使用。
二、Redis的基本數(shù)據(jù)類型
String:
在項(xiàng)目中最常見(jiàn)的一個(gè)使用方式就是,用來(lái)緩存用戶的信息, 將用戶信息的結(jié)構(gòu)體使用JSON序列化成字符串,然后將序列化后的字符串放入reids的緩存中進(jìn)行存儲(chǔ)。從緩存中取用戶信息會(huì)經(jīng)過(guò)一次反序列化的過(guò)程。
當(dāng)字符串長(zhǎng)度小于 1M 時(shí),擴(kuò)容都是加倍現(xiàn)有的空間,如果超過(guò) 1M,擴(kuò)容時(shí)一次只會(huì)多擴(kuò) 1M 的空間。需要注意的是字符串最大長(zhǎng)度為 512M。
參考資料 操作實(shí)例
單個(gè)鍵值的存取
> set k1 v1
OK
> get k1
"v1"
> del k1
(integer) 1
> get k1
(nil)
多個(gè)鍵值的存取
> set k2 v2
OK
> mget k1 k2 k3# 返回一個(gè)列表
1) "v1"
2) "v2"
3) (nil)
> mset k1 1 k2 2 k3 v3
> mget k1 k2 k3
1) "1"
2) "2"
3) "v3"
key 值的過(guò)期策略
> set k4 v4
> get k4
"v4"
> expire k4 5 # 5s 后過(guò)期
... # wait for 5s
> get k4
(nil)
List(鏈表): redis的列表類似java的LinkedList,是鏈表而不是數(shù)據(jù),插入和刪除速度很快,O(1),索引定位很慢 O(n)。
Redis的列表結(jié)構(gòu)常用來(lái)做異步隊(duì)列使用,將需要延后處理的任務(wù)結(jié)構(gòu)體序列化成字符串塞進(jìn)redis的列表,另一個(gè)線程從這個(gè)列表中輪詢數(shù)據(jù)進(jìn)行處理。
當(dāng)列表彈出了最后一個(gè)元素之后,該數(shù)據(jù)結(jié)構(gòu)自動(dòng)被刪除,內(nèi)存被回收。
參考資料 操作實(shí)例 右進(jìn)左出(隊(duì)列)
> rpush nums 1 2 3
(integer) 3
> llen nums
(integer) 3
> lpop nums
"1"
> lpop nums
"2"
> lpop nums
"3"
> lpop nums
(nil)
右進(jìn)右出(棧)
> rpush nums 4 5 6
(integer) 3
> rpop nums
"6"
> rpop nums
"5"
> rpop nums
"4"
> rpop nums
(nil)
Hash:
相當(dāng)于hashmap,hash結(jié)構(gòu)也可以存儲(chǔ)用戶的信息,可以對(duì)用戶結(jié)構(gòu)中的每個(gè)字段單獨(dú)存儲(chǔ), 這樣當(dāng)我們需要獲取用戶信息時(shí)可以進(jìn)行部分獲取。
參考資料 操作實(shí)例
> hset books java "think in java" # 命令行的字符串如果包含空格,要用引號(hào)括起來(lái)(integer) 1
> hset books golang "concurrency in go"
(integer) 1
> hset books python "python cookbook"
(integer) 1
> hgetall books # entries(),key 和 value 間隔出現(xiàn)1) "java"
2) "think in java"
3) "golang"
4) "concurrency in go"
5) "python"
6) "python cookbook"
> hlen books
(integer) 3
> hget books java
"think in java"
> hset books golang "learning go programming" # 因?yàn)槭歉虏僮鳎苑祷?0(integer) 0
> hget books golang
"learning go programming"
> hmset books java "effective java" python "learning python" golang "modern golang programming" # 批量 setOK
Set:
相當(dāng)于Hashset,內(nèi)部的鍵值對(duì)是無(wú)序的惟一的,set結(jié)構(gòu)可以存儲(chǔ)活動(dòng)中中獎(jiǎng)的用戶ID,因?yàn)橛腥ブ氐墓δ埽梢员WC同一個(gè)用戶不會(huì)中獎(jiǎng)兩次。
參考資料 操作實(shí)例
> sadd books python
(integer) 1
> sadd books python # 重復(fù)
(integer) 0
> sadd books java golang
(integer) 2
> smembers books # 注意順序,和插入的并不一致,因?yàn)?set 是無(wú)序的1) "java"
2) "python"
3) "golang"
> sismember books java # 查詢某個(gè) value 是否存在,相當(dāng)于 contains(o)(integer) 1
> sismember books rust
(integer) 0
> scard books # 獲取長(zhǎng)度相當(dāng)于 count()
(integer) 3
> spop books # 彈出一個(gè)
"java"
zset:
類似于SortedSet和HashMap的結(jié)合體,set既可以保證value的唯一性,另一方面可以給每個(gè)value 賦予一個(gè)值,代表著排序權(quán)重 zset 可以用來(lái)存儲(chǔ)粉絲列表,value值是粉絲的用戶ID,score是關(guān)注時(shí)間,對(duì)粉絲類表按照關(guān)注時(shí)間進(jìn)行排序 參考資料 操作實(shí)例> zadd books 9.0 "think in java"
(integer) 1
> zadd books 8.9 "java concurrency"
(integer) 1
> zadd books 8.6 "java cookbook"
(integer) 1
> zrange books 0 -1 # 按 score 排序列出,參數(shù)區(qū)間為排名范圍1) "java cookbook"
2) "java concurrency"
3) "think in java"
> zrevrange books 0 -1 # 按 score 逆序列出,參數(shù)區(qū)間為排名范圍1) "think in java"
2) "java concurrency"
3) "java cookbook"
> zcard books # 相當(dāng)于 count()
(integer) 3
> zscore books "java concurrency" # 獲取指定 value 的 score"8.9000000000000004" # 內(nèi)部 score 使用 double 類型進(jìn)行存儲(chǔ),所以存在小數(shù)點(diǎn)精度問(wèn)題> zrank books "java concurrency" # 排名
(integer) 1
> zrangebyscore books 0 8.91 # 根據(jù)分值區(qū)間遍歷 zset1) "java cookbook"
2) "java concurrency"
> zrangebyscore books -inf 8.91 withscores # 根據(jù)分值區(qū)間 (-∞, 8.91] 遍歷 zset,同時(shí)返回分值。inf 代表 infinite,無(wú)窮大的意思。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
> zrem books "java concurrency" # 刪除 value(integer) 1
> zrange books 0 -1
1) "java cookbook"
來(lái)源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問(wèn)題,請(qǐng)聯(lián)系我們及時(shí)刪除。