国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

什么是redis

2017-11-03 00:59:28 2026

1.Redis并不是簡(jiǎn)單的key-value存儲(chǔ),實(shí)際上他是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器,支持不同類(lèi)型的值。也就是說(shuō),不必僅僅把字符串當(dāng)作鍵所指向的值。下列這些數(shù)據(jù)類(lèi)型都可作為值類(lèi)型。

二進(jìn)制安全的 字符串 string

二進(jìn)制安全的 字符串列表 list of string

二進(jìn)制安全的 字符串集合 set of string,換言之:它是一組無(wú)重復(fù)未排序的element??梢园阉闯蒖uby中的 hash–其key等于element,value都等于’true‘。

有序集合sorted set of string,類(lèi)似于集合set,但其中每個(gè)元素都和一個(gè)浮點(diǎn)數(shù)score(評(píng)分)關(guān)聯(lián)。element根據(jù)score排序??梢园阉闯蒖uby中的 hash–其key等于element,value等于score,但元素總是按score的順序排列,無(wú)需額外的排序操作。

Redis

Redis key值是二進(jìn)制安全的,這意味著可以用任何二進(jìn)制序列作為key值,從形如”foo”的簡(jiǎn)單字符串到一個(gè)JPEG文件的內(nèi)容都可以。空字符串也是有效key值。

2.關(guān)于key的幾條規(guī)則:

太長(zhǎng)的鍵值不是個(gè)好主意,例如1024字節(jié)的鍵值就不是個(gè)好主意,不僅因?yàn)橄膬?nèi)存,而且在數(shù)據(jù)中查找這類(lèi)鍵值的計(jì)算成本很高。

太短的鍵值通常也不是好主意,如果你要用”u:1000:pwd”來(lái)代替”user:1000:password”,這沒(méi)有什么問(wèn)題,但后者更易閱讀,并且由此增加的空間消耗相對(duì)于key object和value object本身來(lái)說(shuō)很小。當(dāng)然,沒(méi)人阻止您一定要用更短的鍵值節(jié)省一丁點(diǎn)兒空間。

最好堅(jiān)持一種模式。例如:”object-type:id:field”就是個(gè)不錯(cuò)的注意,像這樣”user:1000:password”。我喜歡對(duì)多單詞的字段名中加上一個(gè)點(diǎn),就像這樣:”comment:1234:reply.to”。

3.字符串類(lèi)型

這是最簡(jiǎn)單Redis類(lèi)型。如果你只用這種類(lèi)型,Redis就像一個(gè)可以持久化的memcached服務(wù)器(注:memcache的數(shù)據(jù)僅保存在內(nèi)存中,服務(wù)器重啟后,數(shù)據(jù)將丟失)。

我們來(lái)玩兒一下字符串類(lèi)型:

$ redis-cli set mykey "my binary safe value"

OK

$ redis-cli get mykey

my binary safe value正如你所見(jiàn)到的,通常用SET command 和 GET command來(lái)設(shè)置和獲取字符串值。

 

值可以是任何種類(lèi)的字符串(包括二進(jìn)制數(shù)據(jù)),例如你可以在一個(gè)鍵下保存一副jpeg圖片。值的長(zhǎng)度不能超過(guò)1GB。

雖然字符串是Redis的基本值類(lèi)型,但你仍然能通過(guò)它完成一些有趣的操作。例如:原子遞增:

 

$ redis-cli set counter 100

OK $ redis-cli incr counter

(integer) 101

$ redis-cli incr counter

(integer) 102

$ redis-cli incrby counter 10

(integer) 112INCR 命令將字符串值解析成整型,將其加一,最后將結(jié)果保存為新的字符串值,類(lèi)似的命令有INCRBY, DECR and DECRBY。實(shí)際上他們?cè)趦?nèi)部就是同一個(gè)命令,只是看上去有點(diǎn)兒不同。

INCR是原子操作意味著什么呢?

就是說(shuō)即使多個(gè)客戶端對(duì)同一個(gè)key發(fā)出INCR命令,也決不會(huì)導(dǎo)致競(jìng)爭(zhēng)的情況。例如如下情況永遠(yuǎn)不可能發(fā)生:『客戶端1和客戶端2同時(shí)讀出“10”,他們倆都對(duì)其加到11,然后將新值設(shè)置為11』。最終的值一定是12,read-increment-set操作完成時(shí),其他客戶端不會(huì)在同一時(shí)間執(zhí)行任何命令。

對(duì)字符串,另一個(gè)的令人感興趣的操作是GETSET命令,行如其名:他為key設(shè)置新值并且返回原值。這有什么用處呢?例如:你的系統(tǒng)每當(dāng)有新用戶訪問(wèn)時(shí)就用INCR命令操作一個(gè)Redis key。你希望每小時(shí)對(duì)這個(gè)信息收集一次。你就可以GETSET這個(gè)key并給其賦值0并讀取原值。

列表類(lèi)型

要說(shuō)清楚列表數(shù)據(jù)類(lèi)型,最好先講一點(diǎn)兒理論背景,在信息技術(shù)界List這個(gè)詞常常被使用不當(dāng)。例如”P(pán)ython Lists”就名不副實(shí)(名為L(zhǎng)inked Lists),但他們實(shí)際上是數(shù)組(同樣的數(shù)據(jù)類(lèi)型在Ruby中叫數(shù)組)

一般意義上講,列表就是有序元素的序列:10,20,1,2,3就是一個(gè)列表。但用數(shù)組實(shí)現(xiàn)的List和用Linked List實(shí)現(xiàn)的List,在屬性方面大不相同。

Redis lists基于Linked Lists實(shí)現(xiàn)。這意味著即使在一個(gè)list中有數(shù)百萬(wàn)個(gè)元素,在頭部或尾部添加一個(gè)元素的操作,其時(shí)間復(fù)雜度也是常數(shù)級(jí)別的。用LPUSH 命令在十個(gè)元素的list頭部添加新元素,和在千萬(wàn)元素list頭部添加新元素的速度相同。

那么,壞消息是什么?在數(shù)組實(shí)現(xiàn)的list中利用索引訪問(wèn)元素的速度極快,而同樣的操作在linked list實(shí)現(xiàn)的list上沒(méi)有那么快。

Redis Lists are implemented with linked lists because for a database system it is crucial to be able to add elements to a very long list in a very fast way. Another strong advantage is, as you’ll see in a moment, that Redis Lists can be taken at constant length in constant time.

Redis Lists用linked list實(shí)現(xiàn)的原因是:對(duì)于數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),至關(guān)重要的特性是:能非常快的在很大的列表上添加元素。另一個(gè)重要因素是,正如你將要看到的:Redis lists能在常數(shù)時(shí)間取得常數(shù)長(zhǎng)度。

提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題: