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