Redis--概述和常用命令

關(guān)系型數(shù)據(jù)庫(SQL):Mysql,oracle

特點(diǎn):數(shù)據(jù)和數(shù)據(jù)之間、表和字段之間,表和表之間是存在關(guān)系的。

優(yōu)點(diǎn):數(shù)據(jù)之間有關(guān)系、進(jìn)行數(shù)據(jù)的增刪改查時非常方便、關(guān)系型數(shù)據(jù)庫有事務(wù)操作,保證數(shù)據(jù)的完整性。

缺點(diǎn):因?yàn)閿?shù)據(jù)和數(shù)據(jù)之間是有關(guān)系的,關(guān)系是由底層大量算法保證,會拉低系統(tǒng)運(yùn)行速度,消耗系統(tǒng)資源;海量數(shù)據(jù)時增刪改查很可能宕機(jī),維護(hù)/擴(kuò)展也會不好。

適合處理一般量級數(shù)據(jù),安全。

非關(guān)系型數(shù)據(jù)庫(NOSQL):Redis##

非關(guān)系數(shù)據(jù)庫設(shè)計(jì)之初是為了替代關(guān)系型數(shù)據(jù)庫的。

優(yōu)點(diǎn):海量數(shù)據(jù)的增刪改查和維護(hù)非常輕松。

缺點(diǎn):數(shù)據(jù)和數(shù)據(jù)之間沒有關(guān)系,不能一目了然;沒有事務(wù)保證數(shù)據(jù)的完整和安全。

適合處理海量數(shù)據(jù),效率。不一定安全。

主流NOSQL數(shù)據(jù)庫

image.png

NoSQL數(shù)據(jù)庫的四大分類如下:

1鍵值(Key-Value)存儲數(shù)據(jù)庫

     相關(guān)產(chǎn)品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

     典型應(yīng)用:內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問負(fù)載。

     數(shù)據(jù)模型:一系列鍵值對

     優(yōu)勢:優(yōu)秀的快速查詢,穩(wěn)定性強(qiáng)。

     劣勢:存儲的數(shù)據(jù)缺少結(jié)構(gòu)化

2列存儲數(shù)據(jù)庫

相關(guān)產(chǎn)品:Cassandra、HBase,Riak

典型應(yīng)用:分布式的文件系統(tǒng)

數(shù)據(jù)模型:以列簇式存儲,將同一列數(shù)據(jù)存在一起

優(yōu)勢:查找速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展

劣勢:功能相對局限,使用極大的內(nèi)存才可調(diào)配,且系統(tǒng)處理算法時將有數(shù)秒甚至更長時間的不可用,導(dǎo)致大量處理超時

3文檔型數(shù)據(jù)庫(淘汰)**

相關(guān)產(chǎn)品:CouchDB、MongoDb

典型應(yīng)用:Web應(yīng)用(與Key-Value類似,Value是結(jié)構(gòu)化的)

數(shù)據(jù)模型:一系列鍵值對

優(yōu)勢:數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格

劣勢:查詢性能不高,而且缺乏統(tǒng)一的查詢語法

4圖形(Graph)數(shù)據(jù)庫**

相關(guān)數(shù)據(jù)庫:Neo4J、infoGrid、infinite、Graph

典型應(yīng)用:社交網(wǎng)絡(luò)【關(guān)系網(wǎng)】

數(shù)據(jù)模型:圖結(jié)構(gòu)

優(yōu)勢:利用圖結(jié)構(gòu)相關(guān)算法

劣勢:需要對整個圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案。局限性過強(qiáng)

Redis概述

Redis由來

2008年,意大利的一家創(chuàng)業(yè)公司Merzia推出了一款基于MySQL的網(wǎng)站實(shí)時統(tǒng)計(jì)系統(tǒng) LLOOGG,然而沒過多久該公司的創(chuàng)始人 Salvatore Sanfilippo 便對MySQL 的性能感到失望,于是他決定親自為 LLOOGG 量身定做一個 數(shù)據(jù)庫,并并于 2009 年開發(fā)完成,這個數(shù)據(jù)庫就是Redis。不過Salvatore Sanfilippo并不滿足只將 Redis 用于LLOOGG這一款產(chǎn)品,而是希望更多的人使用它,于是在同一年 Salvatore Sanfilippo 將 Redis 開源發(fā)布,并開始和 Redis 的另一名主要的代碼貢獻(xiàn)者 Pieter Noordhuis 一起繼續(xù)著 Redis 的開發(fā),直到今天。

Salvatore Sanfilippo 自己也沒有想到,短短的幾年時間,Redis就擁有了龐大的用戶群體。Hacker News 在 2012 年發(fā)布了一份數(shù)據(jù)庫的使用情況調(diào)查,結(jié)果顯示有近 12% 的公司在使用 Redis。國內(nèi)如 新浪微博、街旁網(wǎng)、知乎網(wǎng),國外如GitHub、Stack Overflow、Flickr等都是Redis的用戶。

VMware 公司從2010年開始贊助 Redis 的開發(fā),Salvatore Sanfilippo和 Pieter Noordhuis 也分別在3月和5月加入VMware,全職開發(fā)Redis。

什么是 Redis

Redis 是用 C 語言開發(fā)的一個開源的高性能鍵值對(key-value)數(shù)據(jù)庫。它通過提供多種鍵值數(shù)據(jù)類型來適應(yīng)不同場景下的存儲需求,目前為止 Redis 支持的鍵值數(shù)據(jù)類型如下:

  1. 字符串類型

  2. 散列類型

  3. 列表類型

  4. 集合類型

  5. 有序集合類型。

官方提供測試數(shù)據(jù):50 個并發(fā)執(zhí)行 100000 個請求,讀的速度是 110000 次/s,寫的速度是 81000 次/s。數(shù)據(jù)僅供參考,根據(jù)服務(wù)器配置會有不同結(jié)果。

Redis 的應(yīng)用場景

緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)。(最多使用)

聊天室的在線好友列表。

任務(wù)隊(duì)列。(秒殺、搶購、12306等等)

應(yīng)用排行榜。

網(wǎng)站訪問統(tǒng)計(jì)。

數(shù)據(jù)過期處理(可以精確到毫秒)

分布式集群架構(gòu)中的session分離。

Redis安裝和啟動

redis數(shù)據(jù)類型

redis使用的是鍵值對 保存數(shù)據(jù)(map)

key:全部都是字符串

value:有五種類型

image.png

Key名稱:自定義,理論上不要過長否則影響使用效率(長度從小到大查詢)。也不要太短,要有意義的。

Redis命令-String命令

概述:字符串類型是Redis中最為基礎(chǔ)的數(shù)據(jù)存儲類型,它在Redis中是二進(jìn)制安全的,這便意味著該類型存入和獲取的數(shù)據(jù)將相同。在Redis中字符串類型的Value最多可以容納的數(shù)據(jù)長度是512M。

二進(jìn)制安全和數(shù)據(jù)安全是沒有關(guān)系的。

image.png

MySQL-關(guān)系型數(shù)據(jù)庫,二進(jìn)制不安全。【亂碼、丟失數(shù)據(jù)】

image.png

賦值(相當(dāng)于map.put)

set key value:設(shè)定key持有指定的字符串value,如果該key存在則進(jìn)行覆蓋操作,總是返回“OK”。

image

取值(相當(dāng)于map.get)

get key:獲取key的value。如果與該key關(guān)聯(lián)的value是不string類型的,Redis將返回錯誤信息,因?yàn)間et命令只能用于獲取String value;如果該key不存在,返回(nil)。

image
image

get key value:先獲取該key的值,然后在設(shè)置該key的值,新的value會覆蓋老的value。

刪除(相當(dāng)于map.remove)

del key:刪除指定key,返回受影響行數(shù)。

其他:

獲取并修改值

getset key value:先獲取該key的值,然后在設(shè)置該key的值。

遞增

incr key:將指定的key的value原子性的遞增1,如果該key不存在,其初始值為0,在incr之后其值為1.如果value的值不能轉(zhuǎn)成整形,如hello,該操作將執(zhí)行失敗并返回相應(yīng)的錯誤信息。相當(dāng)于i++

遞減

decr key:將指定的key的value原子性的遞減1,如果該key不存在,其初始值為0,在decr之后其值為-1,如果value的值不能轉(zhuǎn)成整形,如hello,該操作失敗并返回相應(yīng)錯誤。相當(dāng)于i—

拼接字符串

append key value:拼接字符串。如果該key存在,則在原有的value后追加該值,如果不存在,則重新創(chuàng)建一個key/value

將數(shù)值自增任意值

incrby key increment:將指定的key的value原子性增加increment,如果該key不存在,其初始值為0,在incrby后,該值為increment。如果該值不能轉(zhuǎn)成整形,則失敗并報(bào)錯。

將數(shù)值遞減任意值

decrby key decrement:將指定的key的value原子性增加decrement,如果該key不存在,其初始值為0,在incrby后,該值為-decrement。如果該值不能轉(zhuǎn)成整形,則失敗并報(bào)錯。

String使用環(huán)境:主要用于保存******json******格式的字符串

Redis命令-hash命令

概述:Redis中的Hash類型可以看成具有String Key和String Value的map容器。所以該類型非常適合用于存儲值對象的信息。如Username、Password等。如果Hash中包含很少的字段,那么該類型的數(shù)據(jù)也將僅占用很少的磁盤空間。每一個Hash可以存儲4294967295個鍵值對。

賦值

hset key field value:為指定的key設(shè)定field/value對(鍵值對)。

hmset key field value field2 value2 …:設(shè)置key中的多個filed/value

取值

hget key field:返回指定的key中的field的值。

hmget key filed1 filed2 …:獲取key中的多個filed的值

hgetall key:獲取key中的所有filed-value

刪除

hdel key field field..:可刪除一個或者多個字段,返回值是被刪除的字段個數(shù)。

del key:刪除整個

增加數(shù)字

hincrby key field increment:設(shè)置key中filed的值增加increment

其他命令

hexists key field:判斷指定的key中的filed是否存在

hlen key:獲取key所包含的filed的數(shù)量

hkeys kye:獲取所有的字段

hvals key:獲取所有的value

keys * ****查詢所有的key

Redis命令-list命令

概述:dis中,List類型是按照插入順序排序的字符串鏈表。和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵并不存在,Redis將為該鍵創(chuàng)建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那么該鍵也將會被從數(shù)據(jù)庫中刪除。List中可以包含的最大元素?cái)?shù)量是4294967295。

  從元素插入和刪除的效率視角來看,如果我們是在鏈表的兩頭插入或刪除元素,這將會是非常高效的操作,即使鏈表中已經(jīng)存儲了百萬條記錄,該操作也可以在常量時間內(nèi)完成。然而需要說明的是,如果元素插入或刪除操作是作用于鏈表中間,那將會是非常低效的。相信對于有良好數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的開發(fā)者而言,這一點(diǎn)并不難理解。

賦值(兩端添加)

lpush key values1 values2 …:在指定的key所關(guān)聯(lián)的list頭部插入所有的values。如果該key不存在,該命令在插入的之前創(chuàng)建一個與該key關(guān)聯(lián)的空鏈表,之后再向該鏈表的頭部插入數(shù)據(jù)。插入成功,返回元素的個數(shù)。

rpush key values1 values2…:在該list的尾部添加元素。

取值(查看列表)

lrange key start end:獲取鏈表中從start到end的元素的值,start、end從0開始計(jì)數(shù),也可以為負(fù)數(shù),若為-1則標(biāo)識鏈表尾部的元素。-2則表示倒數(shù)第二個,以此類推..

刪除(兩端彈出)

lpop key:返回并彈出指定的key關(guān)聯(lián)的鏈表中的第一個元素,即頭部元素。如果該key不存在,返回nil;若存在則返回鏈表中的頭部元素

rpop key:從尾部單出元素。

獲取列表中的元素個數(shù)

llen key:返回指定的key關(guān)聯(lián)的鏈表中的元素的數(shù)量。

刪除某種元素(效率低)

lrem key count value:刪除count個值為value的元素,如果count大于0,從頭向尾遍歷并刪除count個值為value的元素,如果count小于0,則從尾向頭遍歷并刪除。如果count等于0,則刪除鏈表中所有等于value的元素。

通過索引替換元素(效率低)

lset key index value:設(shè)置鏈表中的index的腳標(biāo)的元素值,0代表鏈表的頭元素,-1代表鏈表的尾元素。操作鏈表的腳標(biāo)不存在則拋異常。

在索引前/****后插入元素(效率低)

linsert key before|after pivot value:在pivot元素前后插入value這個元素。

擴(kuò)展命令

rpoplpush resource destination:將resource鏈表中的尾部元素彈出并添加到destination頭部。

rpoplpush resource resource:將resource鏈表中的尾部元素彈出并添加到resource頭部。(循環(huán)操作)

Redis命令-set命令

概述:Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。集合中最大的成員數(shù)為232 - 1 (4294967295, 每個集合可存儲40多億個成員)。

添加/****刪除元素

sadd key value value1…:向set中添加數(shù)據(jù),如果該key的值已有則不會重復(fù)添加。

srem key members members1..:刪除set中指定的成員。

取值

smembers key:獲取set中所有元素

sismember key member:判斷參數(shù)中指定的元素是否存在,1表示存在,0表示不存在或者該key本身就不存在。(無論集合中有多少元素都可以極速的返回結(jié)果).

集合運(yùn)算

sdiff key1 key2 …:差集運(yùn)算,返回kye1與key2中相差的成員,而且與key的順序有關(guān)。即返回差集。

image.png

sinter key1 key2 …:返回交集

image.png

sunion key1 key2 ..:返回并集。

image.png

擴(kuò)展命令

scard key:獲取set中元素?cái)?shù)量

srandmember key:隨機(jī)返回一個元素

sdiffstore destination key1 key2..:將key1、key2相差的成員存儲在destination上

sinterstore destination key1 key2..:將返回的交際存儲在destination上

sunionstore destination key1 key2..:將返回的并集存儲在destination上

Redis命令-有序set命令(zset)

概述:Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員。不同的是每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。

有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。

有序set集合: 有序,不重復(fù)。專門用來做排行榜

添加元素

zadd key score member score2 member2 …:將所有成員以及該成員的分?jǐn)?shù)放到sorted-set中。如果該元素已經(jīng)存在則會用新的分?jǐn)?shù)替換原有的分?jǐn)?shù)。返回值是新加入到集合中的元素個數(shù),不包含之前已經(jīng)存在的元素。

獲取元素

zscore key member:返回指定成員的分?jǐn)?shù)。

刪除元素

zrem key member member…****:移除集合中指定成員,可以指定多個。

范圍查詢(****順序查看)

zrange key start end [withscores] : 獲取集合中腳標(biāo)為start-end的成員,withscores參數(shù)表明返回的成員包含其分?jǐn)?shù)。(分?jǐn)?shù)有小到大排列)

zrevrange key start end [withscores] : 獲取集合中腳標(biāo)為start-end的成員,withscores參數(shù)表明返回的成員包含其分?jǐn)?shù)。(分?jǐn)?shù)大到小排列)

zremrangebyrank key start stop****:按照排名范圍刪除元素

zremrangebyscore key min max : 按照分?jǐn)?shù)范圍刪除元素

擴(kuò)展命令

zrangebyscore key min max [withscores] [limit offset count]: 返回分?jǐn)?shù)在[min,max]的成員并按照分?jǐn)?shù)從低到高排序。[withscores]:顯示分?jǐn)?shù);[limit offset count]:offset,表明腳標(biāo)為offset的元素開始并返回count個成員。

zincrby key increment member:設(shè)置指定成員的增加的分?jǐn)?shù)。返回值時更改后的分?jǐn)?shù)。

zcount key min max:獲取分?jǐn)?shù)在[min,max]之間的成員。

zrank key member:返回成員在集合中的排名。索引(從小到大)。

zrevrank key member:返回成員在集合中的排名。索引(從大到?。?。

Redis命令-通用命令

keys pattern:獲取所有與pattern匹配的key,返回所有與該key匹配的keys。*表示任意一個或多個字符,?表示任意一個字符。

del key1 key2 ..:刪除指定的key。

exists key:判斷該key是否存在,1代表存在,0代表不存在。

rename key newkey:為當(dāng)前的key重命名

expire key time:設(shè)置過期時間,單位:秒。過期即刪除。

ttl key:獲取該key所剩的超時時間,如果沒有設(shè)置超時,返回-1.如果返回-2表示超時不存在。

type key:獲取指定key的類型。該命令將以字符串的格式返回。返回的字符串為string、list、set、Hash、zset。如果key不存在返回none。

redis服務(wù)器命令

ping:測試連接是否存活。ping成功返回PONG;

echo:在命令行打印一些東西。echo “HELLO WORLD!”;

select:選擇數(shù)據(jù)庫。redis數(shù)據(jù)庫編號【0-15】,選擇16是報(bào)錯;

quit:退出連接;

dbsize:返回當(dāng)前數(shù)據(jù)庫中key的數(shù)目;

info:獲取服務(wù)器的信息和統(tǒng)計(jì);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容