您好,登錄后才能下訂單哦!
這篇文章主要講解了“Redis和NoSQL分別是什么?”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Redis和NoSQL分別是什么?”吧!
Redis 是什么
Redis是開(kāi)源的 內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),它可以用作 數(shù)據(jù)庫(kù)、 緩存和 消息中間件。 它支持多種類(lèi)型的數(shù)據(jù)結(jié)構(gòu),如 字符串strings, 散列hashes, 列表lists, 集合sets, 有序集合sorted sets與范圍查詢(xún), bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢(xún)。
Redis還內(nèi)置了 復(fù)制(replication),LUA腳本(Lua ing), LRU驅(qū)動(dòng)事件(LRU eviction),事務(wù)(transactions) 和不同級(jí)別的 磁盤(pán)持久化(persistence), 并通過(guò) Redis哨兵(Sentinel)和自動(dòng) 分區(qū)(Cluster)提供高可用性(high availability)。
嗯,沒(méi)錯(cuò)!這就是 redis中文官方網(wǎng)站上面的介紹,簡(jiǎn)潔明了。
NoSQL 是什么
我們知道 redis是一種非關(guān)系型數(shù)據(jù)庫(kù) NoSQL。而為什么出現(xiàn) NoSQL?NoSQL又是什么呢?
單機(jī)數(shù)據(jù)庫(kù)的年代
在一個(gè)網(wǎng)站訪(fǎng)問(wèn)量不大的時(shí)候,我們使用一個(gè)數(shù)據(jù)庫(kù)就足以應(yīng)對(duì)流量請(qǐng)求。
緩存 + 拆分
隨著訪(fǎng)問(wèn)量的上升,一個(gè)數(shù)據(jù)庫(kù)已經(jīng)不能滿(mǎn)足我們的需求了。為了更高的性能,我們?cè)谥虚g加上了一個(gè)緩存層并且將數(shù)據(jù)庫(kù)做了集群、結(jié)構(gòu)優(yōu)化和讀寫(xiě)分離。
而這里的緩存就是 NoSQL,當(dāng)然做緩存也只是 NoSQL的一種功能,就像 Redis并不僅僅有緩存這一種功能。比如它還能實(shí)現(xiàn) 簡(jiǎn)單的消息隊(duì)列, 解決Session共享, 計(jì)數(shù)器, 排行榜, 好友關(guān)系處理等等功能,可見(jiàn) Redis是一個(gè)非常強(qiáng)大工具,讓我們來(lái)學(xué)習(xí)它吧!
Redis 通用命令
首先我們拋開(kāi)數(shù)據(jù)類(lèi)型來(lái)講關(guān)于 Redis的通用命令。
操作 key 和 value
Redis是一種 keyvalue存儲(chǔ)的緩存數(shù)據(jù)庫(kù),所有的數(shù)據(jù)都有一個(gè)自己唯一的key。
這里為了方便演示,我使用了字符串相關(guān)的設(shè)置命令
keys [pattern] 獲取符合要求的所有key。 時(shí)間復(fù)雜度為 O(n) ,一般在生產(chǎn)環(huán)境中不使用,因?yàn)?Redis 是 單線(xiàn)程 的, 執(zhí)行耗時(shí)的任務(wù)會(huì)阻塞其他任務(wù) 。 一般會(huì)使用 scan 命令替代(非阻塞)。
dbsize 獲取當(dāng)前存儲(chǔ)數(shù)據(jù)個(gè)數(shù)。
exists key 判斷是否存在該key
del key 刪除指定數(shù)據(jù)
type key 獲取指定key的數(shù)據(jù)類(lèi)型
rename key newkey 重命名
過(guò)期時(shí)間
Redis中很多數(shù)據(jù)都是用來(lái)作為 緩存數(shù)據(jù)的,而作為緩存就需要有過(guò)期時(shí)間,在 Redis中提供了很強(qiáng)大的 過(guò)期時(shí)間設(shè)置功能。
expire key seconds 為某個(gè) key 設(shè)置過(guò)期時(shí)間。
ttl key 查看某個(gè) key 的剩余時(shí)間,返回正數(shù)代表剩余的時(shí)間,-1代表永久,-2代表已過(guò)期或不存在。
Redis 的五種基本數(shù)據(jù)類(lèi)型
在上面我說(shuō)到了很多 Redis作為緩存能實(shí)現(xiàn)的其他功能,比如計(jì)數(shù)器,排行榜,好友關(guān)系等,這些實(shí)現(xiàn)的依據(jù)就是靠著 Redis的數(shù)據(jù)結(jié)構(gòu)。在整個(gè) Redis中一共有五種基本的數(shù)據(jù)結(jié)構(gòu)(還有些高級(jí)數(shù)據(jù)結(jié)構(gòu)以后會(huì)講),他們分別是 字符串strings, 散列hashes, 列表lists,集合sets, 有序集合sorted sets。
字符串 string
在絕大部分編程語(yǔ)言中都有 String字符串類(lèi)型,對(duì)于作為數(shù)據(jù)庫(kù)的 Redis也是必不可少的。
set key value 設(shè)置值
get key 獲取某個(gè)key的值
mset key1 value1 key2 value2 批量設(shè)置并且是 原子 的,可以用來(lái)減少網(wǎng)絡(luò)時(shí)間消耗
mget key1 key2 批量獲取并且是 原子 的,可以用來(lái)減少網(wǎng)絡(luò)時(shí)間消耗
incr key 自增指定key的值
decr key 自減指定key的值
incrby key value 自增指定數(shù)值
decrby key value 自減指定數(shù)值
incrbyfloat key floatvalue 增加指定浮點(diǎn)數(shù) 前面幾個(gè)操作就可以用來(lái)實(shí)現(xiàn) 計(jì)數(shù)器 的功能。
setnx key value 如果不存在該key則可以設(shè)置成功,否則會(huì)失敗, 加上過(guò)期時(shí)間限制,則是redis實(shí)現(xiàn)分布式鎖的一種方式 (后面會(huì)提到) 。
set key value xx 與前面相反,如果存在則設(shè)置成功,否則失敗(相當(dāng)于更新操作)
getset key newvalue 設(shè)置新值并返回舊值
append key value 為原本內(nèi)容追加內(nèi)容
strlen key 獲取字符串長(zhǎng)度
getrange key start end 獲取指定范圍的內(nèi)容
setrange key index value 設(shè)置指定范圍的內(nèi)容
setex key seconds value 設(shè)置值且設(shè)置過(guò)期時(shí)間
set key value ex seconds nx 為不存在的key設(shè)置值且設(shè)置過(guò)期時(shí)間, 分布式鎖的實(shí)現(xiàn)方式 。
hash
其實(shí)我們可以理解 hash為 小型Redis, Redis在底層實(shí)現(xiàn)上和 Java中的 HashMap差不多,都是使用 數(shù)組 + 鏈表的二維結(jié)構(gòu)實(shí)現(xiàn)的。
不同的是,在 Redis中字典的值 只能是字符串,而且他們 rehash的方式不一樣,在 Redis中使用的是 漸進(jìn)式rehash。
在 rehash 的時(shí)候會(huì)保留新舊兩個(gè) hash 字典,在數(shù)據(jù)遷移的時(shí)候會(huì)將舊字典中的內(nèi)容一點(diǎn)一點(diǎn)遷移到新字典中,查詢(xún)的同時(shí)會(huì)查詢(xún)兩個(gè) hash 字典,等數(shù)據(jù)全部遷移完成才會(huì)將新字典代替就字典。
下面我們來(lái)看一下關(guān)于 hash的基本操作。
hset key field value 設(shè)置字典中某個(gè)key的值
hsetnx key field value 設(shè)置字典中某個(gè)key的值(不存在的)
hmset key field1 value1 field2 value2 ... 批量設(shè)置
hget key field 獲取字典中某個(gè)key的值
hmget key field1 field2 批量獲取
hgetall key 獲取全部
hdel key field 刪除某個(gè)key
hexists key field 判斷是否存在
hlen key 獲取指定key對(duì)應(yīng)的字典中的存儲(chǔ)個(gè)數(shù)
hvals key 返回所有的value
hkeys key 返回所有的key
hincrby key field increValue 增加某個(gè)value的值(也可以增加負(fù)數(shù))
hincrbyfloat key field floatValue 增加某個(gè)value的值(浮點(diǎn)數(shù))
list
Redis中的列表相當(dāng)于 Java中的 LinkedList(雙向鏈表) ,也就是底層是通過(guò) 鏈表來(lái)實(shí)現(xiàn)的,所以對(duì)于 list來(lái)說(shuō) 插入刪除操作很快,但 索引定位非常慢。
Redis提供了許多對(duì)于 list的操作,如 出, 入等操作,你可以充分利用它們來(lái)實(shí)現(xiàn)一個(gè) 棧或者 隊(duì)列。
下面我們來(lái)看一下關(guān)于 list的基本操作。
lpush key item1 item2 item3... 從左入棧
rpush key item1 item2 item3... 從右入棧
lpop key 從左出棧
rpop key 從右出棧
lindex key index 獲取指定索引的元素 O(n)謹(jǐn)慎使用
lrange key start end 獲取指定范圍的元素 O(n)謹(jǐn)慎使用
linsert key before|after item newitem 在指定元素的前面或者后面添加新元素
lrem key count value 刪除指定個(gè)數(shù)值為value的元素
count = 0 :刪除所有值為value的元素
count > 0 :從左到右刪除 count 個(gè)值為 value 的元素
count < 0 :從右到做刪除 |count| 個(gè)值為 value 的元素
ltrim key start end 保留指定范圍的元素
lset key index newValue 更新某個(gè)索引的值
blpop key timeout 沒(méi)有則阻塞(timeout指定阻塞時(shí)間 為0代表永久)
brpop key timeout 沒(méi)有則阻塞(timeout指定阻塞時(shí)間 為0代表永久) 這兩個(gè)可以用來(lái)實(shí)現(xiàn) 消費(fèi)者生產(chǎn)者
總結(jié)來(lái)說(shuō)我們可以使用 左入又出或者右入左出 來(lái)實(shí)現(xiàn)隊(duì)列,左入左出或者右入右出 來(lái)實(shí)現(xiàn)棧。
lpush + lpop = Stack
rpush + rpop = Stack **
lpush + rpop = Queue
rpush + lpop = Queue
lpush/rpush + ltrim = Capped List (定長(zhǎng)列表)
lpush + brpop = Message Queue (消息隊(duì)列)
rpush + blpop = Message Queue (消息隊(duì)列)
set
Redis中的 set相當(dāng)于 Java中的 HashSet(無(wú)序集合),其中里面的元素 不可以重復(fù),我們可以利用它實(shí)現(xiàn)一些去重的功能。 我們還有對(duì)幾個(gè)集合進(jìn)行 取交集, 取并集等操作,這些操作就可以獲取不同用戶(hù)之間的共同好友,共同愛(ài)好等等。
下面我們就來(lái)看一下關(guān)于 set的一些基本操作。
sadd key value 添加元素
sdel key value 刪除某個(gè)元素
sismember key value 判斷是否是集合中的元素
srandmember key count 隨機(jī)獲取指定個(gè)數(shù)的元素(不會(huì)影響集合結(jié)構(gòu))
spop key count 從集合中隨機(jī)彈出元素(會(huì)破壞結(jié)合結(jié)構(gòu))
smembers key 獲取集合所有元素 O(n)復(fù)雜度
scard key 獲取集合個(gè)數(shù)
sinter set1 set2 ... 獲取所有集合中的交集
sdiff set1 set2 ... 獲取所有集合中的差集
sunion set1 set2 ... 獲取所有集合中的并集
zset
Redis中的 zset是一個(gè) 有序集合,通過(guò)它可以實(shí)現(xiàn)很多有意思的功能,比如學(xué)生成績(jī)排行榜,視頻播放量排行榜等等。
zset中是使用 跳表來(lái)實(shí)現(xiàn)的,我們知道只有數(shù)組這種連續(xù)的空間才能使用 二分查找進(jìn)行快速的定位,而鏈表是不可以的。 跳表幫助鏈表查找的時(shí)候節(jié)省了很多時(shí)間(使用跳的方式來(lái)遍歷索引來(lái)進(jìn)行有序插入),如果不了解跳表的同學(xué)可以補(bǔ)習(xí)一下。
下面我們來(lái)看一下關(guān)于 zset的一些基本操作。
zadd key score element 添加,score用于排序,value需要唯一,由于使用的跳表,時(shí)間復(fù)雜度為 O(logn)。
zrem key element 刪除某元素 O(1)時(shí)間復(fù)雜度
zscore key element 獲取某個(gè)元素的分?jǐn)?shù)
zincrby key incrScore element 增加某個(gè)元素的分?jǐn)?shù)
zrange key start end [withscores] 獲取指定索引范圍的元素 加上 withscores 則返回分?jǐn)?shù) O(logn + m)時(shí)間復(fù)雜度
zrangebyscore key minScore maxScore [withscores] 獲取指定分?jǐn)?shù)范圍的元素 加上 withscores 則返回分?jǐn)?shù), O(logn + m)時(shí)間復(fù)雜度
zcard key 獲取有序集合長(zhǎng)度
Redis 中的事務(wù)和管道管道 Pipeline
在某些場(chǎng)景下我們?cè)?nbsp;一次操作中可能需要執(zhí)行多個(gè)命令,而如果我們只是一個(gè)命令一個(gè)命令去執(zhí)行則會(huì)浪費(fèi)很多網(wǎng)絡(luò)消耗時(shí)間,如果將命令一次性傳輸?shù)?nbsp;Redis中去再執(zhí)行,則會(huì)減少很多開(kāi)銷(xiāo)時(shí)間。但是需要注意的是 pipeline中的命令并不是原子性執(zhí)行的,也就是說(shuō)管道中的命令到達(dá) Redis服務(wù)器的時(shí)候可能會(huì)被其他的命令穿插。
事務(wù)
關(guān)系型數(shù)據(jù)庫(kù)具有 ACID特性,Redis能保證A(原子性)和I(隔離性),D(持久性)看是否有配置 RDB或者 AOF持久化操作,但無(wú)法保證一致性,因?yàn)?nbsp;Redis 事務(wù)不支持回滾 。
我們可以簡(jiǎn)單理解為 Redis中的事務(wù)只是比 Pipeline多了個(gè)原子性操作,也就是不會(huì)被其他命令給分割,如上圖。
multi 事務(wù)開(kāi)始的標(biāo)志
exec 事務(wù)執(zhí)行
discard 清除在這個(gè)事務(wù)中放入隊(duì)列的所有命令,即解除整個(gè)事務(wù)。
watch key 在事務(wù)開(kāi)始前監(jiān)控某個(gè)元素,如果在提交事務(wù)的時(shí)候發(fā)現(xiàn)這個(gè)元素的值被其他客戶(hù)端更改了則事務(wù)會(huì)運(yùn)行失敗。
unwatch key 解除監(jiān)控
Redis常用命令總結(jié)
感謝各位的閱讀,以上就是“Redis和NoSQL分別是什么?”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Redis和NoSQL分別是什么?這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。