摘要:取消命令對所有的監(jiān)視?;蛘哌@樣登錄打印字符串查看服務(wù)是否運(yùn)行關(guān)閉當(dāng)前連接切換到指定的數(shù)據(jù)庫數(shù)據(jù)持久化是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫,需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤來保證持久化。
前言
Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)的服務(wù)),是一種NoSQL技術(shù),是一個(gè)基于key-value的高速緩存系統(tǒng),是目前應(yīng)用面最廣的緩存系統(tǒng)之一。
Redis實(shí)戰(zhàn) 第一部分 基本概念和注意事項(xiàng) 1.1 Redis是什么?Redis:Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)的服務(wù)),是一種NoSQL技術(shù),是一個(gè)基于key-value的高速緩存系統(tǒng),Redis是一個(gè)開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。類似于Memcache,但是支持更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)List,Set,SortedSet等,并且有持久化[1]的功能。
Redis有以下特點(diǎn):
Redis支持?jǐn)?shù)據(jù)的持久化,可以講內(nèi)存中數(shù)據(jù)曹村在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
Redis不僅僅是支持簡單的key-value類型的數(shù)據(jù),同事還提供List,Set,Hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
Redis支持?jǐn)?shù)據(jù)的備份,即master-salve模式的數(shù)據(jù)備份。
1.2 Redis緩存的原理一般場景就是數(shù)據(jù)緩存服務(wù)器,與Memcache的角色保持一致;實(shí)質(zhì)上Redis緩存數(shù)據(jù)庫服務(wù)器在提供的緩存的基礎(chǔ)上,同時(shí)提供數(shù)據(jù)持久化(復(fù)制),也就是提供數(shù)據(jù)庫層面的功能。
實(shí)現(xiàn)機(jī)制:操作時(shí),操作的內(nèi)存允許設(shè)置同步到磁盤上。
1.3 Redis和Memcache的區(qū)別?1.存儲方式:
Memcache吧數(shù)據(jù)全部存在內(nèi)存中,斷電或者重啟服務(wù)器會掛掉,不可以恢復(fù)數(shù)據(jù),數(shù)據(jù)大小不能草果內(nèi)存大小。
Redis有部分?jǐn)?shù)據(jù)在磁盤上,這樣能保證數(shù)據(jù)的持久化??梢远ㄆ诒4娴酱疟P(持久化),內(nèi)存上的數(shù)據(jù)丟失后可以通過aof恢復(fù)。
2.數(shù)據(jù)支持類型:
Redis在數(shù)據(jù)支持上要比Memcache多的多。Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還支持List,Set,Hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
Redis的value最大支持512M,Memcache的value最大支持1M。
3.使用底層模型不同
新版本的Redis直接構(gòu)建了自己的VM機(jī)制,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)需要耗費(fèi)一定的時(shí)間去移動和請求,有了自己的VM機(jī)制就節(jié)省了時(shí)間。
Redis是單核運(yùn)行的,Memcache是多喝運(yùn)行的。
讀寫速度:Redis的寫速度與Memcache差不多,讀速度Memcache比Redis快。
4.運(yùn)行的環(huán)境不同
RedisRedis只支持Linux上執(zhí)行,這樣省去了對其他操作系統(tǒng)的支持,可以更好的用于本系統(tǒng)環(huán)境的優(yōu)化。
5.對于兩者的選擇具體看應(yīng)用場景
如果需要緩存的數(shù)據(jù)只是key-value這樣簡單的結(jié)構(gòu)時(shí)首先考慮Memcache,它是足夠穩(wěn)定可靠。
如果涉及到存儲,排序等一系列復(fù)雜操作時(shí),毫無疑問選擇Redis。
1.4 Redis.conf配置文件說明1.Redis默認(rèn)不是以守護(hù)進(jìn)程的方式運(yùn)行,可以通過該配置項(xiàng)修改,使用yes啟用守護(hù)進(jìn)程:daemonize no。
2.當(dāng)Redis以守護(hù)進(jìn)程方式運(yùn)行時(shí),Redis默認(rèn)會把pid寫入/var/run/redis.pid文件,可以通過pidfile制定存儲位置:pidfile /var/run/redis.pid。
3.指定Redis監(jiān)聽端口,默認(rèn)端口為6379.
4.綁定的主機(jī)地址:bind 127.0.0.1
5.當(dāng)客戶端閑置多長時(shí)間后關(guān)閉連接,如果制定為0,表示關(guān)閉該功能。timeout 300。
6.指定日志記錄級別,Redis總共支持你四個(gè)級別debug、verbose、notice、warning、默認(rèn)是verbose:loglevel verbose。
7.設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)數(shù)據(jù)庫為0,可以使用SELECT
8.指定在多長時(shí)間內(nèi),有多少次更新數(shù)據(jù),就將數(shù)據(jù)同步到數(shù)據(jù)文件,可以多個(gè)條件配合:
save//Redis 默認(rèn)配置文件提供了三個(gè)條件 save 900 1 save 300 10 save 60 10000
分別表示900秒(15分鐘)內(nèi)有1個(gè)更改,300秒(5分鐘)內(nèi)有10個(gè)更高,60秒內(nèi)有10000個(gè)更改。
9.指定本地?cái)?shù)據(jù)文件名,默認(rèn)值為dump.rdb:dbfilename dump.rdb
10.指定本地?cái)?shù)據(jù)庫存放目錄:dir ./
11.設(shè)置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時(shí)需要通過AUTH
12.登錄服務(wù)器的狀態(tài):info
1.5 Redis數(shù)據(jù)備份與恢復(fù)備份原理和過程:緩存數(shù)據(jù)庫服務(wù)器 =>緩存數(shù)據(jù)存儲在內(nèi)存 =>數(shù)據(jù)庫存儲在磁盤上 =>執(zhí)行指令,都是在自動在內(nèi)存中增加數(shù)據(jù),數(shù)據(jù)備份到指定文件位置 => Redis SAVE 命令用于創(chuàng)建當(dāng)前數(shù)據(jù)庫的備份。
save:立即存儲快照(內(nèi)存數(shù)據(jù)保存到磁盤中)
bgsave:后臺立即存儲快照(內(nèi)存數(shù)據(jù)保存到磁盤中)
1.6 Redis事務(wù)處理Redis的事務(wù)處理比較簡單。只能保證client發(fā)起的事務(wù)中的命令可以連續(xù)的執(zhí)行,而且不會插入其他的client命令,當(dāng)一個(gè)client在連接中發(fā)出multi命令時(shí),這個(gè)連接就進(jìn)入一個(gè)事務(wù)的上下文,該連接后續(xù)的命令不會執(zhí)行,而是存放到一個(gè)隊(duì)列中,當(dāng)執(zhí)行exec命令時(shí),redis會順序的執(zhí)行隊(duì)列中的所有命令。如果其中執(zhí)行出現(xiàn)錯(cuò)誤,執(zhí)行正確的不會回滾,不同于關(guān)系型數(shù)據(jù)庫的事務(wù)。
1.MULTI標(biāo)記一個(gè)事務(wù)塊的開始(開啟)。
2.EXEC執(zhí)行所以事務(wù)塊內(nèi)的命令。
127.0.0.1:6379> multi Ok 127.0.0.1:6379> set user ak QUEUED 127.0.0.1:6379> set school Tsinghua QUEUED 127.0.0.1:6379> set Class Pking QUEUED 127.0.0.1:6379> exec OK OK OK
3.DISCARD取消事務(wù),放棄執(zhí)行事務(wù)塊內(nèi)的所以命令。
127.0.0.1:6379> multi Ok 127.0.0.1:6379> set user ak QUEUED 127.0.0.1:6379> set school Tsinghua QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> get user (nil)
4.WATCH key [key ...]監(jiān)視一個(gè)(或多個(gè))key,如果在事務(wù)執(zhí)行之前這個(gè)(或這些)key被其他命令所改動,那么事務(wù)將被打斷。
127.0.0.1:6379> watch user Ok 127.0.0.1:6379> watch school ok
5.UNWATCH取消WATCH命令對所有key的監(jiān)視。
1.7 Redis安全連接命令1.設(shè)置在客戶端連接是需要指定的密碼(由于redis速度相當(dāng)?shù)目?,一秒鐘可?50K次的密碼嘗試,所以需要設(shè)置一個(gè)密碼強(qiáng)度很大的密碼)。
設(shè)置密碼的方式有兩種:
(1) 使用config set 命令的requirepass 參數(shù),具體格式為config set requirepass “password”。 (2) 配置redis.conf 中設(shè)置requirepass屬性,后面為密碼。
輸入認(rèn)證的方式也有兩種:
(1) 登錄時(shí)可以 redis-cli -a password
(2)登錄后使用 auth password
//1.設(shè)置密碼:首先需要進(jìn)入Redis的安裝目錄,然后修改配置文件redis.conf。根據(jù)grep命令的結(jié)果,使用vi編輯器修改“# requirepass foobared” 為“requirepass aklman”,然后保存退出。 $ grep -n requirepass /etc/redis.conf $ sudo vim /etc/redis.conf //2.重啟redis-server與redis-cli: $ sudo service redis-server restart $ redis-cli > info //沒有權(quán)限提示 > auth aklman > info //成功查詢數(shù)據(jù) > exit //結(jié)果表明第一次info命令失敗,在auth認(rèn)證之后info命令正常返回。最后退出redis-cli。 //或者這樣登錄: $ redis-cli -a aklman > info
2.ECHO message:打印字符串
3.PING:查看服務(wù)是否運(yùn)行
4.QUIT:關(guān)閉當(dāng)前連接
5.SELECT index:切換到指定的數(shù)據(jù)庫
1.8 Redis數(shù)據(jù)持久化aof(Append Only File)Redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫,Redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤來保證持久化。
Redis支持兩種持久化方式:
1、snapshottingRDB(快照),將數(shù)據(jù)存放到文件里,默認(rèn)方式。也就是把內(nèi)存中的內(nèi)容,壓縮之后,直接存儲到硬盤中,這種方式在啟動的時(shí)候,加載速度非常的快!
是將內(nèi)存中的數(shù)據(jù)已快照的方式寫入到二進(jìn)制文件中,默認(rèn)文件dump.rdb,可以通過配置設(shè)置自動做快照持久化的方式??膳渲肦edis在n秒內(nèi)如果超過m個(gè)key被修改就自動保存快照。
save 900 1 #900秒有1個(gè)keys改變,就會執(zhí)行持久化 save 300 10 #300秒有10個(gè)keys改變,就會執(zhí)行持久化,改成save 100 6更方便 save 60 10000 #60秒有1w個(gè)keys改變,就會執(zhí)行持久化
優(yōu)勢:
1.數(shù)據(jù)庫只包含一個(gè)文件,通過文件備份策略,定期配置,恢復(fù)系統(tǒng)災(zāi)難。
2.壓縮文件轉(zhuǎn)移到其他介質(zhì)上。
3.性能最大化,Redis開始持久化時(shí),分叉出進(jìn)程,由進(jìn)程完成持久化工作,避免服務(wù)器進(jìn)程執(zhí)行I/O操作,啟動效率高。
劣勢:
1.無法高可用:系統(tǒng)一定在定時(shí)持久化之前宕機(jī),數(shù)據(jù)還沒寫入,數(shù)據(jù)已經(jīng)丟失。
通過fock分叉進(jìn)程完成工作,數(shù)據(jù)集大的時(shí)候,服務(wù)器停止幾百毫秒甚至1秒。
總結(jié):
redis是一個(gè)內(nèi)存服務(wù)器,我們要操作的數(shù)據(jù)都存儲在內(nèi)存里面的。訪問速度是非常的快的,但是我們的數(shù)據(jù)想要存儲到硬盤,就要持久化。持久化的時(shí)候,就有持久化的機(jī)制,機(jī)制就有快照持久化;這種持久化是通過時(shí)間與key的改變來確定的。
默認(rèn)的配置是非常好的配置,說明被改變的值,在沒有持久化的時(shí)候,是在內(nèi)存里面的。這個(gè)時(shí)候如果服務(wù)器有異常,這些在內(nèi)存里面的值,都會被清空!如果服務(wù)器異常之后,再次啟動,我們就會從持久化的文件里面讀取數(shù)據(jù)到內(nèi)存,之前沒有持久化的數(shù)據(jù),就在也找不到了。
2、 Append-only file(縮寫為aof),將讀寫操作存放到文件中。
由于快照方式在一定間隔時(shí)間做一次,所以如果Redis意外down掉的話,就會丟失最后一次快照后的所有修改。
aof比快照方式有更好的持久化性,是由于使用aof時(shí),redis會將每一個(gè)收到的寫命令都通過write函數(shù)寫入到文件中當(dāng)redis啟動時(shí)會通過重新執(zhí)行文件中保存的寫命令來在內(nèi)存中重新建立整個(gè)數(shù)據(jù)庫的內(nèi)容。
由于os會在內(nèi)核中緩存write做的修改,所以可能不是立即寫到磁盤上,這樣aof方式的持久化也還是有可能會丟失一部分?jǐn)?shù)據(jù)??梢酝ㄟ^配置文件告訴redis我們想要通過fsync函數(shù)強(qiáng)制os寫入到磁盤的時(shí)機(jī)。
配置文件中的可配置參數(shù):
appendonly yes //啟用aof持久化方式 #appendfsync always //收到寫命令就立即寫入磁盤,最慢,但是保證了數(shù)據(jù)的完整持久化 appendfsync everysec //每秒中寫入磁盤一次,在性能和持久化方面做了很好的折中 #appendfsync no //完全依賴os,性能最好,持久化沒有保證
參數(shù)說明:
always :總是保存執(zhí)行的命令到我們的文件里面。任何一個(gè)的改變,都要保存到我們的文件里面。時(shí)時(shí)的寫文件,這個(gè)就會和IO相關(guān),我們的速度就會變慢。
everysec :每一秒中持久化一次。每一秒有多少改變都進(jìn)行持久化!就是把我們一秒之內(nèi)的寫操作,修改操作,寫進(jìn)我們的文件里面。
no :就是根據(jù)我們系統(tǒng)的IO來隨機(jī)操作。
每一秒中有600個(gè)key被改變,這個(gè)時(shí)候,如果有異常服務(wù)器掛了。我們就失去了600個(gè)KEY。
優(yōu)勢:
1.同步:
每秒同步:異步完成,效率高,一旦系統(tǒng)宕機(jī),修改的數(shù)據(jù)丟失;
每修改同步:同步持久化,每分鐘發(fā)生的變化記錄到磁盤中,效率低,安全;
不同步
2.日志寫入操作追加模式append:系統(tǒng)宕機(jī),不影響存在的內(nèi)容,寫入一半數(shù)據(jù),若系統(tǒng)崩潰,下次啟動redis,redis-check-aof工具解決數(shù)據(jù)一致性。
3.如果日志過大,自動重寫機(jī)制,修改的數(shù)據(jù)寫入到到磁盤文件,創(chuàng)建新文件,記錄產(chǎn)生的修改命令,重寫切換時(shí),保證數(shù)據(jù)安全。
4.格式清晰的日志文件,完成數(shù)據(jù)的重建
劣勢:
對于相同數(shù)據(jù)文件,相比RDB,AOF文件較大
效率低
總結(jié):對比兩個(gè)持久化
快照持久化是把內(nèi)存中的數(shù)據(jù),壓縮之后,直接存儲到硬盤里面的。啟動服務(wù)器的時(shí)候,直接拷貝到內(nèi)存就可以直接使用了。
AOF持久化是把我們的操作語句存儲到文件里面,啟動服務(wù)器的時(shí)候,會執(zhí)行這些語句,寫在我們的內(nèi)存里面。寫操作會慢于拷貝??!
AOF可以做到每一秒持久化一次;快照持久化是時(shí)間和key的改變來匹配的。
1.9 Redis的主從模式(讀寫分析模式)Redis通過主從模式可以允許多個(gè)slave(副) server擁有和master(主) server相同的數(shù)據(jù)庫副本。從服務(wù)器只能讀,不能寫。
1.Redis Replication的工作原理:
Slave與master建立連接,發(fā)送sync同步命令。
Master會啟動一個(gè)后臺進(jìn)程,將數(shù)據(jù)庫快照保存到文件中,同時(shí)Master主進(jìn)程會開始收集新的寫命令并緩存。
后臺完成保存后,就將此文件發(fā)送給Slave。
Slave將此文件保存到磁盤上。
原理解讀:
在Slave啟動并連接到Master之后,它將主動發(fā)送一個(gè)SYNC命令。此后Master將啟動后臺存盤進(jìn)程,同時(shí)收集所有接收到的用于修改數(shù)據(jù)集的命令,在后臺進(jìn)程執(zhí)行完畢后,Master將傳送整個(gè)數(shù)據(jù)庫文件到Slave,以完成一次完全同步。而Slave服務(wù)器在接收到數(shù)據(jù)庫文件數(shù)據(jù)之后將其存盤并加載到內(nèi)存中。此后,Master繼續(xù)將所有已經(jīng)收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執(zhí)行這些數(shù)據(jù)修改命令,從而達(dá)到最終的數(shù)據(jù)同步。
如果Master和Slave之間的鏈接出現(xiàn)斷連現(xiàn)象,Slave可以自動重連Master,但是在連接成功之后,一次完全同步將被自動執(zhí)行。
總結(jié):
當(dāng)從服務(wù)器連接上主服務(wù)器時(shí)候,我們的主服務(wù)器就會把數(shù)據(jù)發(fā)送給從服務(wù)器,這些數(shù)據(jù)都是二進(jìn)制,第一次連接的時(shí)候,是全量拷貝。
之后主服務(wù)器有任何數(shù)據(jù)的修改,都會發(fā)送給從服務(wù)器,現(xiàn)在發(fā)送都是修改的數(shù)據(jù),就叫增量拷貝。
只要主從之間斷開過,再次連接,就會實(shí)現(xiàn)一次全量拷貝。
2.Redis Replication的特點(diǎn):
1.同一個(gè)Master可以同步多個(gè)Slaves。
2.多個(gè)slave可以連接同一個(gè)master外,還可以連接到其他的slave(當(dāng)master重啟后,相連的slave轉(zhuǎn)變?yōu)閙aster)。
3.Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力。因此我們可以將Redis的Replication架構(gòu)視為圖結(jié)構(gòu)。
4.Master Server是以非阻塞的方式為Slaves提供服務(wù)。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求。
5.Slave Server同樣是以非阻塞的方式完成數(shù)據(jù)同步。在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數(shù)據(jù)。
6.為了分載Master的讀操作壓力,Slave服務(wù)器可以為客戶端提供只讀操作的服務(wù),寫服務(wù)仍然必須由Master來完成。即便如此,系統(tǒng)的伸縮性還是得到了很大的提高(提高了系統(tǒng)的可伸縮性。)。
7.Master可以將數(shù)據(jù)保存操作交給Slaves完成,從而避免了在Master中要有獨(dú)立的進(jìn)程來完成此操作。
3.如何配置
最少有兩臺(及以上)服務(wù)器
主服務(wù)器,端口號:6379;pid文件配置好了;數(shù)據(jù)目錄也配置好了。
從服務(wù)器,端口號:6380;pid文件不能和主服務(wù)在一起;數(shù)據(jù)目錄不能和主服務(wù)器在一起。
也就是一句話把主服務(wù)器的配置文件拷貝一份到從服務(wù)器一份修改文件名及相應(yīng)配置參數(shù)。(slave.conf與主服務(wù)器的redis.conf一個(gè)目錄里面,端口號是6380,dir /sdata ,appendonly no,再啟動新服務(wù)器,檢驗(yàn)是否啟動成功,連接主服務(wù)器的IP地址和端口號 slaveod 127.0.0.1 6379,連接主服務(wù)器密碼 masterauth aklman,停止從服務(wù)器再啟動,驗(yàn)證)
總結(jié):在Redis的主從配置中,從服務(wù)器是一個(gè)只讀的設(shè)備。不能寫操作。
第二部分 Redis支持的常用數(shù)據(jù)類型 2.1 字符串(String)設(shè)置一個(gè)值:set key value
set name aklman
獲取一個(gè)值:get key
get name
同時(shí)設(shè)置多個(gè)值:mset key1 value key2 value
同時(shí)獲取多個(gè)值:mget key1 key2
刪除值:del key
自增1(值必須是數(shù)字):incr key
自增指定的值:incrby key
incrby可以操作的最大范圍:有符號的2^64;而修改Memcache的最大范圍描述是無符號的2^642.2 散列表(Hash)超過Redis在整形最大范圍的時(shí)候,繼續(xù)自增會報(bào)錯(cuò);而Memcache在最大值時(shí)繼續(xù)增加會到0再繼續(xù)加。自減也同理,只是把增加數(shù)值設(shè)定負(fù)數(shù)即可。Memcache在最小值時(shí)繼續(xù)向下減依然是最小值。
Redis設(shè)置的數(shù)和增加的數(shù)值可以使用負(fù)數(shù),Memcache不能使用負(fù)數(shù)。增減與上同理。
形式:key => array(field1=>value1,field2=>value2,field3=>value2);value1可以重復(fù),field不能重復(fù)。
設(shè)置值:hset key field value
hset user name aklman
獲取值:hget key field
hget user name
設(shè)定多個(gè)值:hmset key field1 value1 field2 value2
hmset student name aklman age 18 sex 1
獲取多個(gè)值(字段值的順序可以換):hmget key field1 field2 field3
hash表中設(shè)定的字段值是唯一的,如果之前有,就會覆蓋??!
獲取hash標(biāo)的field和value(獲取所以字段及相應(yīng)值):hgetall key
獲取hash表里面的field:hkeys key
獲取hash表里面的value的個(gè)數(shù):hlen key
刪除hash表里面的field值:hdel key field1 field2
注意:hash表中的操作,必須使用hash的方法來操作,字符串的操作就用字符串的方式,不能混著用。
2.3 列表(List)列表:雙向列表,隊(duì)列,堆棧;里面的值是可以重復(fù)的。
雙向列表:一邊可以進(jìn)出,另一邊也可以進(jìn)出
隊(duì)列:只能一邊進(jìn)入,另一邊彈出,先進(jìn)先出
堆棧:只有一個(gè)口,口先進(jìn)先出
1.雙向列表:
給一個(gè)列表從左(右)邊添加內(nèi)容:lpush(rpush) Listname value1 value2 value3
查看list的內(nèi)容:lrange Listname 起始位置(0或者其他) 結(jié)束位置(-1表示最后面)
從左(右)邊彈出一個(gè)值:lpop(rpop) Listname
查看列表的長度:llen Listname
2.隊(duì)列:
給一個(gè)列表從左邊添加內(nèi)容:lpushListname value1 value2 value3
從左邊彈出一個(gè)值:lpop Listname
給一個(gè)列表從右邊添加內(nèi)容:rpush Listname value1 value2 value3
從右邊彈出一個(gè)值:rpop Listname
3.堆棧
給一個(gè)列表從左邊添加內(nèi)容:lpushListname value1 value2 value3
從左邊彈出一個(gè)值:lpop Listname
給一個(gè)列表從右邊添加內(nèi)容:rpush Listname value1 value2 value3
從右邊彈出一個(gè)值:rpop Listname
2.4 集合(Set)添加數(shù)據(jù):sadd set value1 value2 value3
添加完數(shù)據(jù)后再想添加數(shù)據(jù),可以再sadd setvalue4 value5 value3,發(fā)現(xiàn)直插入成功兩個(gè),因?yàn)榧喜辉试Svalues的值重復(fù)出現(xiàn)。
查看數(shù)據(jù):smembers set
隨機(jī)彈出:spop set
為什么集合里面的數(shù)據(jù)能隨機(jī)彈出?原因是集合中的數(shù)據(jù)是無序的,也就是無序集合有這個(gè)特性。隨機(jī)彈出多個(gè)值:spop set n (n不能超過集合元素?cái)?shù))
查看長度:scard set
交集:sinter setA setB
交集就是它們的共同部分,與數(shù)學(xué)中學(xué)的一個(gè)樣
并集:sunion setA setB
重復(fù)的內(nèi)容只顯示一次。
差集:sdiff setA setB
redis里面的差集,是只顯示,第一個(gè)集合的內(nèi)容2.5 有序集合(SortedSet)
添加數(shù)據(jù):zadd SortedSetKey number1 value1 number2 value2
查看長度:zcard SortedSetKey
查看有序集合里面的值:zrange SortedSetKey 起始位置 結(jié)束位置(-1表示最后的位置)
顯示有序集合排序的編號:zrange SortedSetKey 起始位置 結(jié)束位置(-1表示最后的位置) withscores
修改排序號:zincrby SortedSetKey n value1
把value1的排序號改成n(表示數(shù)字)
顯示倒序:zrevrange SortedSetKey 起始位置 結(jié)束位置(-1表示最后的位置)
顯示帶編號的倒序:zrevrange SortedSetKey 起始位置 結(jié)束位置(-1表示最后的位置) withscores
注意:
當(dāng)插入相同排的值時(shí)會覆蓋寫之前數(shù)據(jù)也就說會number一樣覆蓋value,value一樣覆蓋number。
無序集合與有序集合:里面的值都是唯一的,不可重復(fù)。當(dāng)寫入的值,里面已經(jīng)有的時(shí)候,就直接覆蓋??!
2.6 鍵(Key)1.查看Redis里面有多少個(gè)key:keys *
一一列出來,星號是通配符,分左匹配和右匹配,左匹配列出指定字符開頭的key,右匹配列出指定字符結(jié)尾的key。
通配符很重要,用Redis的時(shí)候,肯定是數(shù)據(jù)兩特別大,此時(shí)要去測試數(shù)據(jù),有很多類型的測試數(shù)據(jù),都是只能使用一次,使用一次之后就要刪除的,假如這些數(shù)據(jù)都要存儲在Redis里面的,因此我們就要使用這種操作來刪除不需要的數(shù)據(jù)。反復(fù)此時(shí),測試玩刪除數(shù)據(jù)之后再測試。
2.幾條常用命令:
//在命令行直接運(yùn)行命令 redis-cli keys "*" //在命令行刪除內(nèi)容,指定刪除的key redis-cli del "test" //結(jié)合兩個(gè)命令實(shí)現(xiàn)搜索并且刪除key,這樣寫會報(bào)錯(cuò),因?yàn)閗eys在執(zhí)行完成之后,一次性把文檔里面拿給了del,此時(shí),del就認(rèn)為你文檔里面的值,是一個(gè)值,要刪除就會報(bào)錯(cuò)。 redis-cli keys "*" | redis-cli del //解決方式如下,xargs的含義是:當(dāng)左邊命令結(jié)果通過管道的時(shí)候,只要有xargs參數(shù),它就是告訴左邊的命令,你執(zhí)行一條結(jié)果,就給我一條結(jié)果。左邊在執(zhí)行的時(shí)候,執(zhí)行一個(gè)結(jié)果,就立即傳給我們右邊去執(zhí)行 redis-cli keys "*t" |xargs redis-cli del
思考問題:
1.當(dāng)我們左邊的查詢內(nèi)容是10G的時(shí)候,它要傳給右邊,需要的內(nèi)存多少?
占用內(nèi)存20G,因?yàn)槭褂昧藊args參數(shù),就是執(zhí)行完一個(gè)結(jié)構(gòu)就傳給右邊,一個(gè)結(jié)構(gòu)可以占10K,傳給右邊也是10K,加起來就是20K。
2.在結(jié)合find的使用
當(dāng)數(shù)據(jù)左邊查詢(操作)的數(shù)據(jù)量大的時(shí)候,一定使用xargs命令
find /toot/ -name "*php" | xargs ls -l
3.判斷key是否存在:exists key
在Redis服務(wù)器里面使用
4.設(shè)置過期時(shí)間:expire key 20
比如,expire sex 10,時(shí)間到了就過期,過期了get sex得不到值
5.查看過期時(shí)間:ttl key
6.查看key的類型:type key
7.選擇庫:select 2
默認(rèn)有16個(gè)庫,索引是從0開始的,到15結(jié)束,默認(rèn)庫是0.
每一個(gè)庫的數(shù)據(jù)都是互相獨(dú)立的。
8.是在redis的客戶端去ping我們r(jià)edis的服務(wù)端:ping hello
回hello,也就是發(fā)什么給服務(wù)器,服務(wù)器如果在線都會回復(fù)你什么。如果沒有在線,那就回復(fù)不了。只發(fā)ping回pong
9.清空當(dāng)前庫:flushdb
這個(gè)命令一般都不會使用,萬一刪了別人的數(shù)據(jù)就不好。
10.清空索引的庫:flushall
11.Redis的key命名規(guī)范
給key進(jìn)行設(shè)置的時(shí)候,一定使用:來作為分隔符。
在項(xiàng)目中,應(yīng)該給每一個(gè)項(xiàng)目都設(shè)置多帶帶的前綴來區(qū)分不同的項(xiàng)目。如,k122009,hedu2009
Redis是有密碼驗(yàn)證功能的,可以在服務(wù)器端開啟密碼驗(yàn)證,登錄的時(shí)候,就要輸入密碼,auth:密碼。而Memcache服務(wù)器是沒有密碼驗(yàn)證功能的。密碼在redis.conf中設(shè)置,設(shè)置玩重啟redis(ps -ef | grep redis)。
kill pid號:默認(rèn)是使用-15參數(shù)。就是我們的通知我們主進(jìn)程,關(guān)閉系統(tǒng)。主進(jìn)程會回收它的資源,然后進(jìn)行關(guān)閉。-9 參數(shù):就是我們強(qiáng)制性把程序關(guān)閉。
第三部分 總結(jié)和擴(kuò)展 3.1 Redis其他令總結(jié)1.EXISTS and DEL
EXISTS key 判斷一個(gè)key是否存在;存在返回 1;否則返回0; DEL key 刪除某個(gè)key,或是一系列key;
DEL key1 key2 key3 key4。成功返回1,失敗返回0(key值不存在)。
2.TYPE and KEYS
TYPE key:返回某個(gè)key元素的數(shù)據(jù)類型 ( none:不存在,string:字符,list,set,zset,hash),key不存在返回空。
KEYS key—pattern :返回匹配的key列表 (KEYS foo*:查找foo開頭的keys)
3.RANDOMKEY and CLEAR
RANDOMKEY : 隨機(jī)獲得一個(gè)已經(jīng)存在的key,如果當(dāng)前數(shù)據(jù)庫為空,則返回空字符串。
CLEAR :清除界面。
4.RENAME and RENAMENX
RENAME oldname newname:改key的名字,新鍵如果存在將被覆蓋 。
RENAMENX oldname newname:更改key的名字,如果newname存在,則更新失敗;
5.DBSIZE
DBSIZE :返回當(dāng)前數(shù)據(jù)庫的key的總數(shù)
6.CONFIG GET and CONFIG SET
CONFIG GET:用來讀取運(yùn)行Redis服務(wù)器的配置參數(shù)。
CONFIG SET:用于更改運(yùn)行Redis服務(wù)器的配置參數(shù)。
AUTH : 認(rèn)證密碼
7.CONFIG RESETSTAT
CONFIG RESETSTAT:重置數(shù)據(jù)統(tǒng)計(jì)報(bào)告,通常返回值為"OK"
3.2 PHP操作Redis基本操作PHP操作Redis:使用我們的php客戶端(redis擴(kuò)展)連接到redis服務(wù)器
connect("127.0.0.1",6379); $redis->auth("aklman"); $redis->set("DomainServer","Aklman.com");
就可以在Redis從服務(wù)器中看到這條信息了。
3.3 INFO 查詢信息解讀INFO [section] :查詢Redis相關(guān)信息。 INFO命令可以查詢Redis幾乎所有的信息,其命令選項(xiàng)有如下:
server: Redis server的常規(guī)信息
clients: Client的連接選項(xiàng)
memory: 存儲占用相關(guān)信息
persistence: RDB and AOF 相關(guān)信息
stats: 常規(guī)統(tǒng)計(jì)
replication: Master/slave請求信息
cpu: CPU 占用信息統(tǒng)計(jì)
cluster: Redis 集群信息
keyspace: 數(shù)據(jù)庫信息統(tǒng)計(jì)
all: 返回所有信息
default: 返回常規(guī)設(shè)置信息
標(biāo)注[1] 持久化是指存儲到磁盤,服務(wù)器重啟后還可以存在。而存儲到內(nèi)存中的數(shù)據(jù),一重啟服務(wù)器就不存在。
參考資料Redis實(shí)戰(zhàn)
Aklman的讀書筆記
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/61977.html
摘要:取消命令對所有的監(jiān)視。或者這樣登錄打印字符串查看服務(wù)是否運(yùn)行關(guān)閉當(dāng)前連接切換到指定的數(shù)據(jù)庫數(shù)據(jù)持久化是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫,需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤來保證持久化。 前言 Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)的服務(wù)),是一種NoSQL技術(shù),是一個(gè)基于key-value的高速緩存系統(tǒng),是目前應(yīng)用面最廣的緩存系統(tǒng)之一。 Redis實(shí)戰(zhàn) 第一部分 基本概念和...
摘要:取消命令對所有的監(jiān)視?;蛘哌@樣登錄打印字符串查看服務(wù)是否運(yùn)行關(guān)閉當(dāng)前連接切換到指定的數(shù)據(jù)庫數(shù)據(jù)持久化是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫,需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤來保證持久化。 前言 Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)的服務(wù)),是一種NoSQL技術(shù),是一個(gè)基于key-value的高速緩存系統(tǒng),是目前應(yīng)用面最廣的緩存系統(tǒng)之一。 Redis實(shí)戰(zhàn) 第一部分 基本概念和...
閱讀 943·2021-09-07 09:58
閱讀 1494·2021-09-07 09:58
閱讀 2888·2021-09-04 16:40
閱讀 2508·2019-08-30 15:55
閱讀 2416·2019-08-30 15:54
閱讀 1374·2019-08-30 15:52
閱讀 438·2019-08-30 10:49
閱讀 2610·2019-08-29 13:21