溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Redis和NoSQL分別是什么?

發(fā)布時(shí)間:2021-06-22 17:28:09 來(lái)源:億速云 閱讀:602 作者:chen 欄目:編程語(yǔ)言

這篇文章主要講解了“RedisNoSQL分別是什么?”,文中的講解內(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)求。

Redis和NoSQL分別是什么?

緩存 + 拆分

隨著訪(fǎng)問(wèn)量的上升,一個(gè)數(shù)據(jù)庫(kù)已經(jīng)不能滿(mǎn)足我們的需求了。為了更高的性能,我們?cè)谥虚g加上了一個(gè)緩存層并且將數(shù)據(jù)庫(kù)做了集群、結(jié)構(gòu)優(yōu)化和讀寫(xiě)分離。

Redis和NoSQL分別是什么?

而這里的緩存就是 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的通用命令。

Redis和NoSQL分別是什么?

操作 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 命令替代(非阻塞)。

Redis和NoSQL分別是什么?

  • 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 重命名

Redis和NoSQL分別是什么?

過(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和NoSQL分別是什么?

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也是必不可少的。

Redis和NoSQL分別是什么?

  • 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

Redis和NoSQL分別是什么?

其實(shí)我們可以理解 hash為 小型Redis, Redis在底層實(shí)現(xiàn)上和 Java中的 HashMap差不多,都是使用 數(shù)組 + 鏈表的二維結(jié)構(gòu)實(shí)現(xiàn)的。

Redis和NoSQL分別是什么?

不同的是,在 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和NoSQL分別是什么?

Redis提供了許多對(duì)于 list的操作,如 , 等操作,你可以充分利用它們來(lái)實(shí)現(xiàn)一個(gè) 或者 隊(duì)列。

Redis和NoSQL分別是什么?

下面我們來(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)好等等。

Redis和NoSQL分別是什么?

下面我們就來(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ī)排行榜,視頻播放量排行榜等等。

Redis和NoSQL分別是什么?

zset中是使用 跳表來(lái)實(shí)現(xiàn)的,我們知道只有數(shù)組這種連續(xù)的空間才能使用 二分查找進(jìn)行快速的定位,而鏈表是不可以的。 跳表幫助鏈表查找的時(shí)候節(jié)省了很多時(shí)間(使用跳的方式來(lái)遍歷索引來(lái)進(jìn)行有序插入),如果不了解跳表的同學(xué)可以補(bǔ)習(xí)一下。

Redis和NoSQL分別是什么?

下面我們來(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ì)被其他的命令穿插。

Redis和NoSQL分別是什么?

Redis和NoSQL分別是什么?

事務(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分別是什么?

感謝各位的閱讀,以上就是“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)注!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI