什么是Nosql?
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”作郭, 泛指非關(guān)系型的數(shù)據(jù)庫,可以理解為SQL的一個(gè)有力補(bǔ)充弦疮。典型代表有MongDB夹攒、 Redis、Memcache等胁塞。特別是Redis咏尝,可以說是目前最火的Nosql數(shù)據(jù)庫之一。
為什么選擇Nosql?
隨著 Internet的快速發(fā)展啸罢,越來越多的網(wǎng)站编检、應(yīng)用系統(tǒng)需要支撐海量數(shù)據(jù)存儲(chǔ),高并發(fā)請(qǐng)求扰才、高可用允懂、高可擴(kuò)展性等特性要求,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在應(yīng)付這些調(diào)整已經(jīng)顯得力不從心衩匣,暴露了許多難以克服的問題蕾总。由此,各種各樣的NoSQL數(shù)據(jù)庫作為傳統(tǒng)關(guān)系型數(shù)據(jù)的一個(gè)有力補(bǔ)充得到迅猛發(fā)展琅捏。此處推薦閱讀《從Mysql到Nosql》和《NoSQL 還是 SQL 生百?》看看sql的發(fā)展歷史和常用的幾大類Nosql數(shù)據(jù)庫。
無論是關(guān)系型數(shù)據(jù)庫還是非關(guān)系型數(shù)據(jù)庫柄延,本質(zhì)都是對(duì)數(shù)據(jù)進(jìn)行增刪改查而已蚀浆,但Nosql和關(guān)系數(shù)據(jù)庫之間還是有一些區(qū)別的,如在儲(chǔ)存方法搜吧、存儲(chǔ)結(jié)構(gòu)市俊、存儲(chǔ)規(guī)范、存儲(chǔ)擴(kuò)展滤奈、查詢方法摆昧、事務(wù)、性能上僵刮,二者都有較大的差異据忘。對(duì)比如下:
儲(chǔ)存方法:關(guān)系數(shù)據(jù)庫是表格式的鹦牛,因此存儲(chǔ)在表的行和列中。在它們之間關(guān)聯(lián)協(xié)作存儲(chǔ)很容易勇吊,并且提取數(shù)據(jù)很方便曼追。另一方面,Nosql數(shù)據(jù)庫是一個(gè)龐大的組汉规。通常存儲(chǔ)在數(shù)據(jù)集中礼殊,就像文檔、鍵值對(duì)或圖形結(jié)構(gòu)一樣针史。
存儲(chǔ)結(jié)構(gòu):關(guān)系數(shù)據(jù)庫對(duì)應(yīng)于結(jié)構(gòu)化數(shù)據(jù)晶伦。數(shù)據(jù)表預(yù)先定義結(jié)構(gòu)(列定義),結(jié)構(gòu)描述數(shù)據(jù)的形式和內(nèi)容啄枕。這對(duì)數(shù)據(jù)建模至關(guān)重要婚陪,雖然預(yù)定義結(jié)構(gòu)帶來了可靠性和穩(wěn)定性,但修改這些數(shù)據(jù)更加困難频祝。 Nosql數(shù)據(jù)庫基于動(dòng)態(tài)結(jié)構(gòu)泌参,使用和非結(jié)構(gòu)化數(shù)據(jù)。由于Nosql數(shù)據(jù)庫是動(dòng)態(tài)結(jié)構(gòu)常空,因此可以輕松適應(yīng)數(shù)據(jù)類型和結(jié)構(gòu)的變化沽一。
存儲(chǔ)規(guī)范:關(guān)系數(shù)據(jù)庫的數(shù)據(jù)存儲(chǔ)為了獲得更高的規(guī)范性,數(shù)據(jù)被分段為最小的關(guān)系表漓糙,以避免重復(fù)并實(shí)現(xiàn)簡(jiǎn)化的空間利用铣缠。雖然管理非常清楚,但是當(dāng)單個(gè)操作設(shè)計(jì)為多個(gè)表時(shí)昆禽,數(shù)據(jù)管理有點(diǎn)麻煩蝗蛙。雖然Nosql數(shù)據(jù)存儲(chǔ)在平面數(shù)據(jù)集中,但數(shù)據(jù)通澄辏可以復(fù)制歼郭。單個(gè)數(shù)據(jù)庫很少分開遗契,但作為一個(gè)整體存儲(chǔ)辐棒,因此整個(gè)數(shù)據(jù)塊更易于讀寫。
存儲(chǔ)擴(kuò)展:這可能是兩者之間最大的區(qū)別牍蜂,關(guān)系數(shù)據(jù)庫是垂直擴(kuò)展漾根,這意味著要提高處理能力,需要使用速度更快的計(jì)算機(jī)鲫竞。由于數(shù)據(jù)存儲(chǔ)在關(guān)系表中辐怕,因此操作中的性能瓶頸可能涉及多個(gè)表,需要通過提高計(jì)算機(jī)性能來克服从绘。雖然有很大的擴(kuò)展空間寄疏,但最終會(huì)達(dá)到縱向擴(kuò)張的上限是牢。 Nosql數(shù)據(jù)庫被擴(kuò)展,其存儲(chǔ)自然分布陕截。您可以通過向資源池添加更多常見數(shù)據(jù)庫服務(wù)器來共享負(fù)載驳棱。
查詢方法:關(guān)系數(shù)據(jù)庫通過結(jié)構(gòu)化查詢語言(我們通常稱之為SQL)對(duì)數(shù)據(jù)庫進(jìn)行操作。 SQL支持?jǐn)?shù)據(jù)庫CURD操作非常強(qiáng)大农曲,是業(yè)界的標(biāo)準(zhǔn)用法社搅。 Nosql查詢使用非結(jié)構(gòu)化查詢語言(UnQl)對(duì)塊中的數(shù)據(jù)進(jìn)行操作,這是非標(biāo)準(zhǔn)的乳规。關(guān)系數(shù)據(jù)庫表中的主鍵的概念對(duì)應(yīng)于存儲(chǔ)在Nosql中的文檔的ID形葬。關(guān)系數(shù)據(jù)庫使用預(yù)定義的優(yōu)化方法(例如索引)來加速查詢操作,而Nosql更簡(jiǎn)單暮的,更準(zhǔn)確的數(shù)據(jù)訪問模式笙以。
事務(wù):關(guān)系數(shù)據(jù)庫遵循ACID規(guī)則(原子性、一致性冻辩、隔離源织、耐久性)瓣颅,而Nosql數(shù)據(jù)庫遵循BASE原則(基本可用虛擬着倾、軟/靈活事務(wù))(軟狀態(tài))、最終一致性)巨双。由于關(guān)系數(shù)據(jù)庫中數(shù)據(jù)的高度一致性凛剥,對(duì)事務(wù)的支持非常好侠仇。關(guān)系數(shù)據(jù)庫支持對(duì)事務(wù)原子性的細(xì)粒度控制,并且易于回滾事務(wù)犁珠。 Nosql數(shù)據(jù)庫在CAP中是可選的(一致性逻炊、可用性、分區(qū)容差)犁享,因?yàn)榛诠?jié)點(diǎn)的分布式系統(tǒng)難以完全滿足余素,因此對(duì)事務(wù)的支持不是很好,盡管也可以使用事務(wù)炊昆,但不是Nosql的閃點(diǎn)桨吊。
性能:關(guān)系數(shù)據(jù)庫的數(shù)據(jù)存儲(chǔ)在磁盤中,面對(duì)高并發(fā)讀寫性能非常差凤巨,面對(duì)海量數(shù)據(jù)视乐,效率非常低。 Nosql存儲(chǔ)的格式是鍵值類型敢茁,存儲(chǔ)在內(nèi)存中佑淀,非常容易存儲(chǔ),數(shù)據(jù)一致性較弱彰檬。 Nosql不需要sql解析來提高讀寫性能伸刃。
怎么用Nosql?
對(duì)數(shù)據(jù)的處理無外乎都是增刪改查谎砾。本篇主要是介紹Nosql三劍庫MongoDb、Memcache和Redis的基本使用捧颅。特別是Redis棺榔,可以說是目前最火的Nosql數(shù)據(jù)庫,也是面試必問點(diǎn)之一隘道,本篇將花大篇幅對(duì)其作出說明症歇。
下面我們通過實(shí)例來講解Memcache、Mongodb即Redis的概念和使用谭梗。
Memcache
Memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng)忘晤,通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨大的hash表,它能夠用來存儲(chǔ)各種格式的數(shù)據(jù)激捏,包括圖像设塔、視頻、文件以及數(shù)據(jù)庫檢索的結(jié)果等远舅。簡(jiǎn)單的說就是將數(shù)據(jù)調(diào)用到內(nèi)存中闰蛔,然后從內(nèi)存中讀取,從而大大提高讀取速度图柏。
Memcache的工作流程:
MemCache的工作流程如下:先檢查客戶端的請(qǐng)求數(shù)據(jù)是否在memcached中序六,如有,直接把請(qǐng)求數(shù)據(jù)返回蚤吹,不再對(duì)數(shù)據(jù)庫進(jìn)行任何操作例诀;如果請(qǐng)求的數(shù)據(jù)不在memcached中,就去查數(shù)據(jù)庫裁着,把從數(shù)據(jù)庫中獲取的數(shù)據(jù)返回給客戶端繁涂,同時(shí)把數(shù)據(jù)緩存一份到memcached中;每次更新數(shù)據(jù)庫的同時(shí)更新memcached中的數(shù)據(jù)二驰,保證一致性扔罪;當(dāng)分配給memcached內(nèi)存空間用完之后,會(huì)使用LRU(Least Recently Used桶雀,最近最少使用)策略加上到期失效策略矿酵,失效數(shù)據(jù)首先被替換,然后再替換掉最近未使用的數(shù)據(jù)背犯。
Memcache的優(yōu)點(diǎn):
Memcached可以利用多核優(yōu)勢(shì)坏瘩,單實(shí)例吞吐量極高盅抚,可以達(dá)到幾十萬QPS(取決于key漠魏、value的字節(jié)大小以及服務(wù)器硬件性能,日常環(huán)境中QPS高峰大約在4-6w左右)妄均。適用于最大程度扛量柱锹。
支持直接配置為session handle哪自。
Memcache的缺點(diǎn):
只支持簡(jiǎn)單的key/value數(shù)據(jù)結(jié)構(gòu),不像Redis可以支持豐富的數(shù)據(jù)類型禁熏。
無法進(jìn)行持久化壤巷,數(shù)據(jù)不能備份,只能用于緩存使用瞧毙,且重啟后數(shù)據(jù)全部丟失胧华。
無法進(jìn)行數(shù)據(jù)同步,不能將MC中的數(shù)據(jù)遷移到其他MC實(shí)例中宙彪。
Memcache內(nèi)存分配采用Slab Allocation機(jī)制管理內(nèi)存矩动,value大小分布差異較大時(shí)會(huì)造成內(nèi)存利用率降低,并引發(fā)低利用率時(shí)依然出現(xiàn)踢出等問題释漆。需要用戶注重value設(shè)計(jì)悲没。
Memcache默認(rèn)能接受的key的最大長(zhǎng)度是250個(gè)字符,單個(gè)value的大小被限制在1M byte之內(nèi)男图,不適合存儲(chǔ)較大的數(shù)據(jù)示姿。
Memcache的應(yīng)用場(chǎng)景:
動(dòng)態(tài)系統(tǒng)中減輕數(shù)據(jù)庫負(fù)載,提升性能逊笆;
做緩存栈戳,適合多讀少寫,大數(shù)據(jù)量的情況(如人人網(wǎng)大量查詢用戶信息难裆、好友信息荧琼、文章信息等)。
Mongodb
MongoDB是一個(gè)跨平臺(tái)的差牛,基于分布式文件存儲(chǔ)的NoSQL數(shù)據(jù)庫命锄,由C++語言編寫的。MongoDB是以文檔的形式存儲(chǔ)數(shù)據(jù)偏化,數(shù)據(jù)結(jié)構(gòu)由鍵值(key:value)對(duì)組成脐恩,類似JSON。
MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品侦讨,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富驶冒,最像關(guān)系數(shù)據(jù)庫的。MongoDB的結(jié)構(gòu)中韵卤,最小的單位為文檔(類似MySQL的行)骗污,每一個(gè)文檔用的是BSON形式來存儲(chǔ)(類似JSON),文檔的上一層為集合(類似MySQL的表)沈条,再上一級(jí)為庫(類似MySQL的數(shù)據(jù)庫)需忿。
mongodb與mysql不同的是,mysql的每一次更新操作都會(huì)直接寫入硬盤,但是mongo不會(huì)屋厘,做為內(nèi)存型數(shù)據(jù)庫涕烧,數(shù)據(jù)操作會(huì)先寫入內(nèi)存,然后再會(huì)持久化到硬盤中去汗洒。具體是在mongodb啟動(dòng)時(shí)议纯,專門初始化一個(gè)線程不斷循環(huán)(除非應(yīng)用crash掉),用于在一定時(shí)間周期內(nèi)來從defer隊(duì)列中獲取要持久化的數(shù)據(jù)并寫入到磁盤的journal(日志)和mongofile(數(shù)據(jù))處溢谤,當(dāng)進(jìn)行CUD操作時(shí)瞻凤,記錄(Record類型)都被放入到defer隊(duì)列中以供延時(shí)批量(groupcommit)提交寫入,默認(rèn)的時(shí)間周期為90s世杀。
Mongodb的優(yōu)點(diǎn):
更高的寫負(fù)載鲫构,MongoDB擁有更高的插入速度。
處理很大的規(guī)模的單表玫坛,當(dāng)數(shù)據(jù)表太大的時(shí)候可以很容易的分割表结笨,添加1個(gè)新字段不會(huì)對(duì)舊表格有任何影響,整個(gè)過程會(huì)非呈疲快速炕吸。
高可用性,設(shè)置M-S不僅方便而且很快勉痴,MongoDB還可以快速赫模、安全及自動(dòng)化的實(shí)現(xiàn)節(jié)點(diǎn)(數(shù)據(jù)中心)故障轉(zhuǎn)移。
查詢效率高蒸矛,MongoDB支持二維空間索引瀑罗,比如管道,因此可以快速及精確的從指定位置獲取數(shù)據(jù)雏掠。MongoDB在啟動(dòng)后會(huì)將數(shù)據(jù)庫中的數(shù)據(jù)以文件映射的方式加載到內(nèi)存中斩祭。如果內(nèi)存資源相當(dāng)豐富的話,這將極大地提高數(shù)據(jù)庫的查詢速度乡话。
支持持久化摧玫,Mongodb做為內(nèi)存型數(shù)據(jù)庫,數(shù)據(jù)操作會(huì)先寫入內(nèi)存绑青,然后再會(huì)持久化到硬盤中去诬像。
Mongodb的缺點(diǎn):
不支持事務(wù)。
MongoDB占用內(nèi)存過大 闸婴。
MongoDB沒有成熟的維護(hù)工具坏挠。
Mongodb的應(yīng)用場(chǎng)景
主要解決海量數(shù)據(jù)的訪問效率問題。
Redis
Redis(Remote Dictionary Server)是一個(gè)開源的使用ANSI C語言編寫邪乍、支持網(wǎng)絡(luò)降狠、可基于內(nèi)存亦可持久化的日志型对竣、Key-Value數(shù)據(jù)庫,并提供多種語言的API喊熟。是當(dāng)前最熱門的Nosql數(shù)據(jù)庫之一柏肪,也是本篇要主要講解的內(nèi)容姐刁。以下內(nèi)容主要是講解它的安裝和基本命令使用芥牌,及redis用做數(shù)據(jù)緩存(商品數(shù)據(jù)、新聞聂使、熱點(diǎn)數(shù)據(jù))壁拉、單點(diǎn)登錄、秒殺柏靶、搶購(gòu)弃理、網(wǎng)站訪問排名、應(yīng)用的模塊開發(fā)等應(yīng)用場(chǎng)景屎蜓。
redis的優(yōu)勢(shì):
運(yùn)行在內(nèi)存痘昌,性能極高,官方說法Redis能讀的速度是110000次/s,寫的速度是81000次/s 炬转。
支持持久化辆苔,即可以將內(nèi)存中的數(shù)據(jù)異步寫入到硬盤中,同時(shí)不影響繼續(xù)提供服務(wù)
支持?jǐn)?shù)據(jù)結(jié)構(gòu)豐富(string(字符串)扼劈,list(鏈表)驻啤,set(集合),zset(sorted set - 有序集合))和Hash(哈希類型)
Redis安裝
1.下載redis安裝包
wget http://download.redis.io/releases/redis-3.2.1.tar.gz
2.解壓安裝包并安裝
tar xzf redis-3.2.1.tar.gz
cd redis-3.2.1
make
make時(shí)報(bào)錯(cuò)make: cc: Command not found make: * [adlist.o] Error 127荐吵,則需要安裝gcc: yum -y install gcc
make時(shí)報(bào)錯(cuò)fatal error: jemalloc/jemalloc.h: No such file or directory骑冗,則需要改命令為:make MALLOC=libc
make完后 redis-3.2.1目錄下會(huì)出現(xiàn)編譯后的redis服務(wù)程序redis-server,還有用于測(cè)試的客戶端程序redis-cli,兩個(gè)程序位于安裝目錄 src 目錄下
3.修改redis為后臺(tái)運(yùn)行
vim redis.conf
將daemonize no 改為 daemonize yes,如果不修改先煎,該窗口將無法往下執(zhí)行操作了
redis采用的是單進(jìn)程多線程的模式贼涩。當(dāng)redis.conf中選項(xiàng)daemonize設(shè)置成yes時(shí),代表開啟守護(hù)進(jìn)程模式薯蝎。在該模式下磁携,redis會(huì)在后臺(tái)運(yùn)行,并將進(jìn)程pid號(hào)寫入至redis.conf選項(xiàng)pidfile設(shè)置的文件中良风,此時(shí)redis將一直運(yùn)行谊迄,除非手動(dòng)kill該進(jìn)程。
4.啟動(dòng)服務(wù)端
cd src
./redis-server ../redis.conf
redis的配置文件也是挺重要的內(nèi)容烟央⊥撑担可以參考《redis3.2 配置文件詳解》
5.啟動(dòng)客戶端
./redis-cli
在以上實(shí)例中我們連接到本地的 redis 服務(wù)。并可執(zhí)行 PING 命令用于檢測(cè) redis 服務(wù)是否啟動(dòng)疑俭。如果需要在遠(yuǎn)程 redis 服務(wù)上執(zhí)行命令粮呢,同樣我們使用的也是 redis-cli 命令:redis-cli -h host -p port
6.關(guān)閉客戶端、服務(wù)端
關(guān)閉服務(wù)端(客戶端未連接時(shí)): ./redis-cli shutdown
關(guān)閉服務(wù)端(客戶端連接時(shí)):shutdown save | nosave , 然后 quit
關(guān)閉客戶端:quit啄寡,或者 exit豪硅,或者 Ctrl + C
Redis常用命令
Redis是一種鍵值對(duì)(K-V)數(shù)據(jù)庫,Redis能夠支持五種數(shù)據(jù)類型:string(字符串)挺物,list(鏈表)懒浮,set(集合),zset(有序集合)和Hash(哈希類型)识藤,我們先來看下Redis的常用命令砚著,常用命令熟悉了,后面看它實(shí)現(xiàn)的功能也就容易理解了痴昧。
Redis 鍵命令
Redis是一種鍵值對(duì)(K-V)數(shù)據(jù)庫稽穆,它對(duì)數(shù)據(jù)的操作都是基于鍵,下面我們看看 Redis 鍵相關(guān)的基本命令:
keys pattern
查找所有符合給定模式( pattern)的 key 赶撰。
如 keys * 查找Redis中所有的鍵舌镶,但會(huì)影響CPU,且會(huì)造成redis鎖豪娜,注意線上慎用該命令餐胀。
Redis在2.8.0版本新增了眾望所歸的scan操作,從此再也不用擔(dān)心敲入了keys *, 然后舉起雙手看著鍵盤等待漫長(zhǎng)的系統(tǒng)卡死了···
exists key
檢查給定 key 是否存在侵歇。
type key
返回 key 所儲(chǔ)存的值的類型骂澄。(五種類型:string、list惕虑、set坟冲、zset、hash溃蔫,key不存在時(shí)返回none)
del key
該命令用于在 key 存在時(shí)刪除 key健提。
expire key seconds
為給定 key 設(shè)置過期時(shí)間,以秒計(jì)
pexpire key milliseconds
設(shè)置 key 的過期時(shí)間以毫秒計(jì)伟叛。
expireat key timestamp
expireat 的作用和 expire 類似私痹,都用于為 key 設(shè)置過期時(shí)間。 不同在于 expireat 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳(unix timestamp)统刮。
pexpireat key milliseconds-timestamp
設(shè)置 key 過期時(shí)間的時(shí)間戳(unix timestamp) 以毫秒計(jì)
ttl key
以秒為單位紊遵,返回給定 key 的剩余生存時(shí)間(TTL, time to live)。( key 不存在時(shí)侥蒙,返回 -2 暗膜。 當(dāng)key 存在但未設(shè)置剩余生存時(shí)間時(shí),返回 -1)
pttl key
以毫秒為單位返回 key 的剩余的過期時(shí)間鞭衩。( key 不存在時(shí)学搜,返回 -2 娃善。 當(dāng)key 存在但未設(shè)置剩余生存時(shí)間時(shí),返回 -1)
persist key
移除 key 的過期時(shí)間瑞佩,key 將持久保持聚磺。
randomkey
從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回一個(gè) key 。(不建議使用)
rename key newkey
修改 key 的名稱
renamenx key newkey
僅當(dāng) newkey 不存在時(shí)炬丸,將 key 改名為 newkey 瘫寝。
move key db
將當(dāng)前數(shù)據(jù)庫的 key 移動(dòng)到給定的數(shù)據(jù)庫 db 當(dāng)中。
dump key
序列化給定 key 御雕,并返回被序列化的值矢沿。(序列化最終的目的是為了對(duì)象可以跨平臺(tái)存儲(chǔ)滥搭,和進(jìn)行網(wǎng)絡(luò)傳輸酸纲。而我們進(jìn)行跨平臺(tái)存儲(chǔ)和網(wǎng)絡(luò)傳輸?shù)姆绞骄褪荌O,而我們的IO支持的數(shù)據(jù)格式就是字節(jié)數(shù)組瑟匆。)
restore key ttl serialized-value
反序列化給定的序列化值闽坡,并將它和給定的 key 關(guān)聯(lián)。(參數(shù) ttl 以毫秒為單位為 key 設(shè)置生存時(shí)間愁溜;如果 ttl 為 0 疾嗅,那么不設(shè)置生存時(shí)間)
Redis 字符串(string)
Redis字符串(string)類型是最常見到的數(shù)據(jù)結(jié)構(gòu),它既可以存儲(chǔ)文字(比如“hello world”)冕象,又可以存儲(chǔ)數(shù)字(比如整數(shù)10086和浮點(diǎn)數(shù)3.14)代承,還可以存儲(chǔ)二進(jìn)制數(shù)據(jù)(比如10010100),字符串值能存儲(chǔ)的最大容量為512M渐扮。
字符串(string)常用命令
set key value
設(shè)置指定 key 的值论悴。(如果key已存在則覆蓋其值)
setnx key value
只有在 key 不存在時(shí)設(shè)置 key 的值。
get key
獲取指定 key 的值墓律。
getrange key start end
返回 key 中字符串值的子字符
getset key value
將給定 key 的值設(shè)為 value 膀估,并返回 key 的舊值(old value)。
mset key value [key value ...]
同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì)耻讽。
mget key1 [key2..]
獲取所有(一個(gè)或多個(gè))給定 key 的值察纯。
setex key seconds value
將值 value 關(guān)聯(lián)到 key ,并將 key 的過期時(shí)間設(shè)為 seconds (以秒為單位)针肥。
psetex key milliseconds value
這個(gè)命令和 SETEX 命令相似饼记,但它以毫秒為單位設(shè)置 key 的生存時(shí)間,而不是像 SETEX 命令那樣慰枕,以秒為單位具则。
strlen key
返回 key 所儲(chǔ)存的字符串值的長(zhǎng)度。
incr key
將 key 中儲(chǔ)存的數(shù)字值增一捺僻。(若key不存在則生成一個(gè)新的key且值為1乡洼,若值非數(shù)字則報(bào)錯(cuò))
incrby key increment
將 key 所儲(chǔ)存的值加上給定的增量值(increment) 崇裁。(其它規(guī)則同incr key)
decr key
將 key 中儲(chǔ)存的數(shù)字值減一。(其它規(guī)則同incr key)
decrby key decrement
key 所儲(chǔ)存的值減去給定的減量值(decrement) 束昵。(其它規(guī)則同incr key)
append key value
如果 key 已經(jīng)存在并且是一個(gè)字符串拔稳, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾。
Redis 列表(list)
Redis列表(list)類型是用來存儲(chǔ)多個(gè)有序的字符串锹雏。在Redis中巴比,可以對(duì)列表的兩端進(jìn)行插入(push)和彈出(pop)操作,還可以獲取指定范圍的元素列表礁遵、獲取指定索引下標(biāo)的元素等轻绞。列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu),它可以充當(dāng)棧和隊(duì)列的角色佣耐,在實(shí)際開發(fā)上有很多應(yīng)用場(chǎng)景政勃。
Redis 中每個(gè) list 可以存儲(chǔ)40多億個(gè)元素(2的32次方-1個(gè))。
列表(list)常用命令
rpush key value1 [value2]
在列表中添加一個(gè)或多個(gè)值兼砖,列表不存在時(shí)則創(chuàng)建并添加值奸远。
rpushx key value
為已存在的列表添加值,列表不存在時(shí)則不會(huì)創(chuàng)建讽挟。
lpush key value1 [value2]
將一個(gè)或多個(gè)值插入到列表頭部懒叛,列表不存在時(shí)則創(chuàng)建并添加值。
lpushx key value
將一個(gè)值插入到已存在的列表頭部耽梅,列表不存在時(shí)則不會(huì)創(chuàng)建薛窥。
llen key
獲取列表長(zhǎng)度
lindex key index
通過索引獲取列表中的元素,如 lindex key 0 獲取列表中的首個(gè)元素眼姐, lindex key -1 獲取列表中的最后一個(gè)元素
lset key index value
通過索引設(shè)置列表元素的值
lrange key start stop
獲取列表指定范圍內(nèi)的元素诅迷,如 lrange key 0 -1 獲取列表中的所有元素
linsert key BEFORE|AFTER value newValue
在列表的元素前或者后插入元素(newValue),當(dāng)列表不存在或指定元素(value)不存在于列表中時(shí)不執(zhí)行任何操作妥凳。
ltrim key start stop
對(duì)一個(gè)列表進(jìn)行修剪(trim)竟贯,就是說,讓列表只保留指定區(qū)間內(nèi)的元素逝钥,不在指定區(qū)間之內(nèi)的元素都將被刪除屑那。
lrem key count value
根據(jù)參數(shù) COUNT 的值,移除列表中與參數(shù) VALUE 相等的元素艘款。如count為0持际,則移除表中所有與 VALUE 相等的值;count不為0哗咆,則從頭或尾起移除|count|個(gè)與value相等的元素蜘欲。
lpop key
移出并獲取列表的第一個(gè)元素
blpop key1 [key2 ] timeout
移出并獲取列表的第一個(gè)元素, 如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止晌柬。
rpop key
移出并獲取列表的最后一個(gè)元素
rpoplpush source destination
移除列表的最后一個(gè)元素姥份,并將該元素添加到另一個(gè)列表頭部并返回郭脂。如果destination不存在則創(chuàng)建并添加。
brpop key1 [key2 ] timeout
移出并獲取列表的最后一個(gè)元素澈歉, 如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止展鸡。
brpoplpush source destination timeout
從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它埃难;如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止莹弊。