redis入門(mén)與應(yīng)用

第一部分 初始、redis

redis概念

redis客戶端和服務(wù)端可以再不同的設(shè)備上

redis是遠(yuǎn)程的

redis是基于內(nèi)存的

所有東西都是放在內(nèi)存的,這就代表redis的操作非常高速,它的速度遠(yuǎn)遠(yuǎn)高于基于硬盤(pán)的MySQL,但是所有數(shù)據(jù)都是放在內(nèi)存中,它也是一個(gè)比較吃?xún)?nèi)存的

redis是非關(guān)系型數(shù)據(jù)庫(kù),關(guān)系型數(shù)據(jù)庫(kù)需要之前定義數(shù)據(jù)字典,而redis則不需要。

redis的應(yīng)用場(chǎng)景

緩存,當(dāng)我們的系統(tǒng)接口比較慢的時(shí)候,我們可以把接口的某些數(shù)據(jù)緩存起來(lái)。當(dāng)下次進(jìn)行請(qǐng)求的時(shí)候,我們就不需要在MySQL中做比較耗時(shí)的sql操作了。而是直接去redis緩存中將所需要的MySQL數(shù)據(jù)讀取出來(lái)。這是提升系統(tǒng)性能最常用的方法之一。

其次是隊(duì)列結(jié)構(gòu)買(mǎi)這個(gè)結(jié)構(gòu)提供了push和pop操作。我們可以把redis當(dāng)做隊(duì)列來(lái)使用。

我們可以吧redis當(dāng)做數(shù)據(jù)庫(kù)存儲(chǔ)來(lái)使用,所有的增刪改查都在redis中操作。不需要借助MySQL來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)。這個(gè)做的原因是redis有非常完備的硬盤(pán)持久化機(jī)制


redis安裝

Linux+CentOS

redis2.8.13



redis server

make

redis cli

sudo make install

redis的數(shù)據(jù)類(lèi)型



常用命令:set/get/decr/incr/mget等;

應(yīng)用場(chǎng)景:String是最常用的一種數(shù)據(jù)類(lèi)型,普通的key/value存儲(chǔ)都可以歸為此類(lèi);

實(shí)現(xiàn)方式:String在redis內(nèi)部存儲(chǔ)默認(rèn)就是一個(gè)字符串,被redisObject所引用,當(dāng)遇到incrdecr等操作時(shí)會(huì)轉(zhuǎn)成數(shù)值型進(jìn)行計(jì)算,此時(shí)redisObject的encoding字段為int


set string1 yejianfeng

get string1

set string2 4

get string2

4

incr string2

5

decrby string2 2

get string2

3

list類(lèi)型


常用命令:lpush/rpush/lpop/rpop/lrange等;

應(yīng)用場(chǎng)景:Redis list的應(yīng)用場(chǎng)景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來(lái)實(shí)現(xiàn);

實(shí)現(xiàn)方式:Redis list的實(shí)現(xiàn)為一個(gè)雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過(guò)帶來(lái)了部分額外的內(nèi)存開(kāi)銷(xiāo),Redis內(nèi)部的很多實(shí)現(xiàn),包括發(fā)送緩沖隊(duì)列等也都是用的這個(gè)數(shù)據(jù)結(jié)構(gòu)。


可以從左邊或右邊推入

pop push

lpush list1 12

lpush list2 13

rpop list1

12

并不要求數(shù)據(jù)唯一

lpush list2 12

lpush list2 13

lpush list2 13

llen list2

3 (有三個(gè)數(shù),,不要求數(shù)據(jù)元素是唯一的)


set類(lèi)型

常用命令:sadd/spop/smembers/sunion等;

應(yīng)用場(chǎng)景:Redis set對(duì)外提供的功能與list類(lèi)似是一個(gè)列表的功能,特殊之處在于set是可以自動(dòng)排重的,當(dāng)你需要存儲(chǔ)一個(gè)列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時(shí),set是一個(gè)很好的選擇,并且set提供了判斷某個(gè)成員是否在一個(gè)set集合內(nèi)的重要接口,這個(gè)也是list所不能提供的;

實(shí)現(xiàn)方式:set 的內(nèi)部實(shí)現(xiàn)是一個(gè) value永遠(yuǎn)為null的HashMap,實(shí)際就是通過(guò)計(jì)算hash的方式來(lái)快速排重的,這也是set能提供判斷一個(gè)成員是否在集合內(nèi)的原因。


提供一種無(wú)序的數(shù)據(jù)

sadd set1 12

scard set1

1

sadd set1 13

sadd set1 13

(第二次插入是唯一的)

sismember set1 13


srem set1 13 刪除13

sismember set1 13


值都不一樣,,,沒(méi)有相同的項(xiàng)

sadd set1 12

scard set1

1

sadd set1 13

sadd set1 13

12 13.

sismember set1 13

1

srem set1 13;

sismember set1 13


hash類(lèi)型


常用命令:hget/hset/hgetall等

應(yīng)用場(chǎng)景:我們要存儲(chǔ)一個(gè)用戶信息對(duì)象數(shù)據(jù),其中包括用戶ID、用戶姓名、年齡和生日,通過(guò)用戶ID我們希望獲取該用戶的姓名或者年齡或者生日;

實(shí)現(xiàn)方式:Redis的Hash實(shí)際是內(nèi)部存儲(chǔ)的Value為一個(gè)HashMap,并提供了直接存取這個(gè)Map成員的接口。如圖所示,Key是用戶ID, value是一個(gè)Map。這個(gè)Map的key是成員的屬性名,value是屬性值。這樣對(duì)數(shù)據(jù)的修改和存取都可以直接通過(guò)其內(nèi)部Map的Key(Redis里稱(chēng)內(nèi)部Map的key為field), 也就是通過(guò) key(用戶ID) + field(屬性標(biāo)簽) 就可以操作對(duì)應(yīng)屬性數(shù)據(jù)。當(dāng)前HashMap的實(shí)現(xiàn)有兩種方式:當(dāng)HashMap的成員比較少時(shí)Redis為了節(jié)省內(nèi)存會(huì)采用類(lèi)似一維數(shù)組的方式來(lái)緊湊存儲(chǔ),而不會(huì)采用真正的HashMap結(jié)構(gòu),這時(shí)對(duì)應(yīng)的value的redisObject的encoding為zipmap,當(dāng)成員數(shù)量增大時(shí)會(huì)自動(dòng)轉(zhuǎn)成真正的HashMap,此時(shí)encoding為ht。


hset hash1 key1 12

hget hash1 key1

"12"

hset hash1 key2 12

hset hash1 key3 13

hlen hash1

3

hset hash1 key3 14

hget hash1 key3

"14"


hmget hash1 key1 key2 ?//這是插入多個(gè)吧

"12"

"13"


sort set類(lèi)型


常用命令:zadd/zrange/zrem/zcard等;

應(yīng)用場(chǎng)景:Redis sorted set的使用場(chǎng)景與set類(lèi)似,區(qū)別是set不是自動(dòng)有序的,而sorted set可以通過(guò)用戶額外提供一個(gè)優(yōu)先級(jí)(score)的參數(shù)來(lái)為成員排序,并且是插入有序的,即自動(dòng)排序。當(dāng)你需要一個(gè)有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu),比如twitter 的public timeline可以以發(fā)表時(shí)間作為score來(lái)存儲(chǔ),這樣獲取時(shí)就是自動(dòng)按時(shí)間排好序的。

實(shí)現(xiàn)方式:Redis sorted set的內(nèi)部使用HashMap和跳躍表(SkipList)來(lái)保證數(shù)據(jù)的存儲(chǔ)和有序,HashMap里放的是成員到score的映射,而跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score,使用跳躍表的結(jié)構(gòu)可以獲得比較高的查找效率,并且在實(shí)現(xiàn)上比較簡(jiǎn)單。


可以看成排行榜。。

數(shù)值是唯一的。。。。


zadd zset1 10.1 val1

zadd zset1 11.2 val2

zadd zset1 9.2 val3

zcard zset1

3


zrange zset1 0 2 withscores


zrank zset1 val2

2


zadd zset1 12.2 val3

0

zrange zet1 0 2 withscores




如果score相同的情況下,是按val的字母排序

第二部分 操作redis

PHP的redis擴(kuò)展安裝


-v 版本 -m是版本。







php --ini






PHP操作redis的五種類(lèi)型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,466評(píng)論 0 82
  • 本文將從Redis的基本特性入手,通過(guò)講述Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對(duì)Redis的基本能力進(jìn)行直觀介紹。之后概...
    kelgon閱讀 61,271評(píng)論 23 625
  • 本周我們開(kāi)始學(xué)習(xí)掌握自己的生活。不過(guò),也會(huì)有崩盤(pán)的時(shí)候。崩盤(pán)的原因有很多,其中一個(gè)就是我們大多數(shù)人感同身受的拖延癥...
    Jean_zz閱讀 5,805評(píng)論 2 36
  • 每天一鼓勵(lì) 第4天 給貝 寶貝,今天爸爸和媽媽意見(jiàn)不統(tǒng)一的時(shí)候,你沖過(guò)去想制止爸爸,保護(hù)媽媽?zhuān)駛€(gè)小男子漢!謝...
    藝凌老師閱讀 432評(píng)論 0 1
  • 看著人群圍住的大巴,我扭過(guò)頭獨(dú)自離開(kāi)了。 一夜幾乎沒(méi)睡,怕誤了錯(cuò)過(guò)就不會(huì)再有的道別機(jī)會(huì)。 ...
    浪蕊閱讀 511評(píng)論 0 0