第一部分 初始、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)遇到incr、decr等操作時(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)型