這篇文章將為大家詳細(xì)講解有關(guān)redis常用數(shù)據(jù)類型操作指令有哪些,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
目前創(chuàng)新互聯(lián)公司已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、海鹽網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
Redis 命令用于在 redis 服務(wù)上執(zhí)行操作。要在 redis 服務(wù)上執(zhí)行命令需要一個(gè) redis
客戶端??梢允褂?code>redis-cli命令啟動(dòng)Redis客戶端。完整的啟動(dòng)命令是redis-cli -h host -p port -a password
。
Redis常用的數(shù)據(jù)類型有五種:string、hash、list、set及zset(sorted set有序集合)。學(xué)習(xí)這些類型之前還需要學(xué)習(xí)常用命令Key的管理。下面詳細(xì)介紹這些類型:更詳細(xì)的API可以參照此處
常用命令Key管理
Key的應(yīng)用場(chǎng)景:
限時(shí)的優(yōu)惠活動(dòng)信息。
網(wǎng)站的數(shù)據(jù)緩存(對(duì)于一些需要定時(shí)更新的數(shù)據(jù),如積分排行榜)
手機(jī)驗(yàn)證碼
限制網(wǎng)站訪客訪問頻率(例如1分鐘最多訪問10次)
Key的命名建議:
key名稱區(qū)分大小寫;key不要太長(zhǎng),盡量不超過1024字節(jié),太長(zhǎng)會(huì)降低查找效率;在一個(gè)項(xiàng)目中key最好使用統(tǒng)一的命名模式,如user:id:password
keys pattern
返回滿足給定pattern的所有key,可以模糊匹配,如keys abc*
代表abc開頭的keyexists key
判斷一個(gè)key是否存在,存在返回1,不存在返回0expire key second
設(shè)定一個(gè)key的活動(dòng)時(shí)間(秒)pexpire key milliseconds
設(shè)定一個(gè)key的活動(dòng)時(shí)間(毫秒)del key
刪除一個(gè)keyttl key
返回一個(gè)key的剩余時(shí)間,key不存在時(shí)返回-2;key存在但未設(shè)置剩余生存時(shí)間返回-1persist key
取消過期時(shí)間select dbindex
選擇數(shù)據(jù)庫,默認(rèn)有16個(gè),索引從0開始move key, dbindex
移動(dòng)當(dāng)前數(shù)據(jù)庫中的key到dbindex數(shù)據(jù)庫randomkey
隨機(jī)返回一個(gè)keykeyrename key, key2
重命名keydbsize
返回當(dāng)前數(shù)據(jù)庫中key的數(shù)量info
查看數(shù)據(jù)庫信息config get *
實(shí)時(shí)存儲(chǔ)收到的請(qǐng)求,返回相關(guān)的配置type(key)
返回值的類型
flushdb
刪除當(dāng)前選擇數(shù)據(jù)庫中的所有keyflushall
刪除所有數(shù)據(jù)庫中的所有key
一、字符串String
String是redis最基本的類型,一個(gè)鍵最大能存儲(chǔ)523MB。String類型是二進(jìn)制安全的。意思是redis的String可以包含任何數(shù)據(jù)。比如圖片或者序列化的對(duì)象 。
String的應(yīng)用場(chǎng)景:
String通常用于保存單個(gè)字符串或JSON字符串?dāng)?shù)據(jù)。
因?yàn)镾tring是二進(jìn)制安全的,可以把圖片文件的內(nèi)容作為字符串來存儲(chǔ)。
計(jì)數(shù)器(常規(guī)key-value緩存應(yīng)用,粉絲數(shù)、微博數(shù)量,投票等)
INCR 等指令本身就具有原子操作的特性,所以完全可以利用 Redis 的 NCR、INCRBY、DECR、DECRBY 等指令來實(shí)現(xiàn)原子計(jì)數(shù)的效果。假如,在某種場(chǎng)景下有 3 個(gè)客戶端同時(shí)讀取了 minum 的值(值為 2),然后對(duì)其同時(shí)進(jìn)行了加 1 的操作,那么,最后 bynum 的值一定是 5。不少網(wǎng)站都利用 reds 的這個(gè)特性來實(shí)現(xiàn)業(yè)務(wù)上的統(tǒng)計(jì)計(jì)數(shù)需求。
賦值語法set key value
為key賦予值value,多次設(shè)置會(huì)覆蓋舊值且無視類型setnx key value
為key賦予值value,如果key已存在,則不設(shè)置并返回0,否則設(shè)置并返回1。是解決分布式鎖的方案之一。setex key time value
為key賦予值value并設(shè)定過期時(shí)間time,到期后key和value都清除。setrange key start end
設(shè)置指定區(qū)間范圍內(nèi)的值,下標(biāo)從0開始,替換字符串。
取值語法
get key
獲取指定key的value值,key不存在則返回nilgetrange key start end
獲取指定key的value的子字符串,包括start和end角標(biāo)getbit key offset
對(duì) key 所儲(chǔ)存的字符串值,獲取指定偏移量的bit(二進(jìn)制)getset key value
為key設(shè)新值,同時(shí)返回舊值,key不存在返回nilsubstr(key, start, end)
返回名稱為key的string的value的子串
刪值語法del key
同Key
批量寫入mset k1 v1 k2 v2...kn vn
批量設(shè)置多個(gè)的值
批量讀出
mget k1 k2 ... kn
獲取多個(gè)key的值
自增自減incr key
key的value對(duì)應(yīng)+1incrby key integer
key的value對(duì)應(yīng)+integerdecr key
key的value對(duì)應(yīng)-1decrby key integer
key的value對(duì)應(yīng)-integer
字符串拼接append key value
將value附加到指定key的末尾
msetnx(key1, value1...keyN, valueN)
同時(shí)設(shè)置多個(gè)key和value,僅key之前都不存在時(shí)生效
字符串長(zhǎng)度strlen key
返回key的字符長(zhǎng)度
二、雙重鍵值對(duì)Hash
Hash類型是String類型的field和value的映射表。Hash特別適合用于存儲(chǔ)對(duì)象,相比String可以占用更少的磁盤空間,可以看成具有key和value的map容器。Redis中每個(gè)hash可以存儲(chǔ)(2^32)-1個(gè)鍵值對(duì)。
Hash的應(yīng)用場(chǎng)景:
通常用來存儲(chǔ)一個(gè)用戶信息對(duì)象數(shù)據(jù)。
Redis的Hash實(shí)際是將內(nèi)部存儲(chǔ)的value作為一個(gè)HashMap。
賦值語法
hset key field value
為指定key設(shè)置field和valuehsetnx key field value
為指定key設(shè)置field和value,如果key已存在則不生效。hmset key f1 v1 f2 v2 ... fn vn
同時(shí)將多個(gè)field-value(域值對(duì))設(shè)置到哈希表的key中。
取值語法
hget key field
根據(jù)field獲取value值hmget key f1 f2 ... fn
根據(jù)多個(gè)field獲取所有的value值hgetall key
獲取Hash表中所有的字段和值hkeys key
獲取所有Hash表中的字段hvals key
獲取所有Hash表中的字段對(duì)應(yīng)的valuehexists key field
查看Hash表Key中,指定的字段是否存在hlen key
獲取Hash表中字段的數(shù)量
刪除語法
hdel key field1 field2 ... fieldn
刪除一個(gè)或多個(gè)Hash表的字段del key
同Key
增減語法
hincrby key field integer
為Hash表Key中field對(duì)應(yīng)的value增加integerhincrbyfloat key field increment
為Hash表Key中field對(duì)應(yīng)的value增加increment
三、雙端鏈表List
List類型是一個(gè)鏈表結(jié)構(gòu)的集合,主要功能有push、pop、獲取元素等。更詳細(xì)的說,List類型是一個(gè)雙端鏈表的結(jié)構(gòu),可以通過相關(guān)的操作進(jìn)行集合頭部或者尾部元素的添加和刪除,List既可以作為棧,又可以作為隊(duì)列,能夠滿足絕大多數(shù)需求。
如果鍵不存在,創(chuàng)建新的鏈表。
如果鍵已存在,新增內(nèi)容。
如果值全移除,對(duì)應(yīng)的鍵也就消失了。
鏈表操作無論是頭和尾效率都極高,但中間元素的操作效率很低。
應(yīng)用場(chǎng)景
對(duì)數(shù)據(jù)量大的集合數(shù)據(jù)刪減
列表數(shù)據(jù)顯示、關(guān)注列表、粉絲列表、留言評(píng)價(jià)等…分頁、熱點(diǎn)新聞(Top10)等。利用lrange可以很方便的實(shí)現(xiàn)分頁的功能,在博客系統(tǒng)中,每篇博文的評(píng)論也可以存入一個(gè)單獨(dú)的list中。
任務(wù)隊(duì)列
在處理web客戶端發(fā)送的命令請(qǐng)求時(shí),某些操作的執(zhí)行時(shí)間可能會(huì)比我們預(yù)期的更長(zhǎng)一些,通過將待執(zhí)行任務(wù)的相關(guān)信息放入隊(duì)列里面,并在之后對(duì)隊(duì)列進(jìn)行處理,用戶可以推遲執(zhí)行那些需要一段時(shí)間才能完成的操作,這種將工作交給任務(wù)處理器來執(zhí)行的做法被稱為任務(wù)隊(duì)列(task queue)。list通??梢杂脕韺?shí)現(xiàn)一個(gè)消息隊(duì)列,而且可以確保先后順序。
賦值語法
lpush key value1 value2 ... valueN
將一個(gè)或多個(gè)值插入到列表頭部(從左側(cè)添加)rpush key value1 value2 ... valueN
將一個(gè)或多個(gè)值插入到列表頭部(從右側(cè)添加)lpushx key value
將一個(gè)值插入到已存在的列表頭部(最左邊),如果列表不存在,操作無效。rpushx key value
將一個(gè)值插入到已存在的列表尾部(最右邊),如果列表不存在,操作無效。
取值語法
llen key
獲取列表長(zhǎng)度lindex key index
通過索引獲取列表的元素lrange key start stop
獲取列表指定范圍內(nèi)的元素
刪除語法
lpop key
移除并獲取列表的第一個(gè)元素(從左側(cè)移除)lpop key
移除并獲取列表的最后一個(gè)元素(從右側(cè)移除)lrem key count value
刪除count個(gè)值為value的keyblpop key1 key2 timeout
移除并獲取列表的第一個(gè)元素,如果列表沒有元素會(huì)阻塞列表,直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止brpop key1 key2 timeout
移除并獲取列表的最后一個(gè)元素,如果列表沒有元素會(huì)阻塞列表,直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止ltrim key start stop
對(duì)一個(gè)列表進(jìn)行修剪,只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間內(nèi)的元素都刪除。
修改語法
lset key index value
通過索引設(shè)置列表元素的值linsert key before|after world value
在列表的某個(gè)元素world前或者后插入元素value。
高級(jí)命令
rpoplpush source destination
移除source列表的最后一個(gè)元素,并將該元素添加到destination列表,并返回。(可以對(duì)自己本身操作,類似隊(duì)列)brpoplpush source destination timeout
移除source列表的最后一個(gè)元素,并將該元素添加到destination列表,并返回;如果source 列表沒有元素會(huì)阻塞列表知道等待超時(shí)或發(fā)現(xiàn)可移除元素為止。
四、無序集合Set
Set 是 String 類型的無序集合。集合成員是唯一的,集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。
Redis 中的集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。
集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。
類似于JAVA中的 Hashtable集合
Redis的set的底層存儲(chǔ)結(jié)構(gòu)特別神奇,底層使用了intset和hashtable兩種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的,intset我們可以理解為數(shù)組,hashtable就是普通的哈希表(key為set的值,value為null)。
intset內(nèi)部其實(shí)是一個(gè)數(shù)組(int8_t coentents[]數(shù)組),而且存儲(chǔ)數(shù)據(jù)的時(shí)候是有序的,因?yàn)樵诓檎覕?shù)據(jù)的時(shí)候是通過二分查找來實(shí)現(xiàn)的。
應(yīng)用場(chǎng)景
對(duì)兩個(gè)集合間的數(shù)據(jù)[計(jì)算]進(jìn)行交集、并集、差集運(yùn)算
以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能。對(duì)上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存儲(chǔ)到一個(gè)新的集合中。
利用唯一性,可以統(tǒng)計(jì)訪問網(wǎng)站的所有獨(dú)立 IP
賦值語法
sadd key member1 member2 ... memberN
向集合添加一個(gè)或多個(gè)成員
取值語法
scard key
獲取集合的成員數(shù)smembers key
返回集合中的所有成員sismember key member
判斷 member 元素是否是集合 key 的成員(開發(fā)中:驗(yàn)證是否存在判斷)srandmember key count
返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)
刪除語法
srem key member1 member2...memberN
移除集合中一個(gè)或多個(gè)成員spop kye count
移除并返回集合中的一個(gè)或多個(gè)隨機(jī)元素
smove source destincation member
將member元素從source集合移動(dòng)到destination集合
差集語法
sdiff key1 key2
返回給定所有集合的差集(左側(cè))sdiffstore destination key1 key2
返回給定所有集合的差集并存儲(chǔ)在 destination 中(destination中原有的數(shù)據(jù)清除)
交集語法
sinter key1 key2
返回給定所有集合的交集(共有數(shù)據(jù))sinterstore destination key1 key2
返回給定所有集合的交集并存儲(chǔ)在 destination 中
并集語法sunion key1 key2
返回所有給定集合的并集sunionstore destination key1 key2
所有給定集合的并集存儲(chǔ)在 destination 集合中
五、有序集合Zset
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
之前的set是k1 v1 v2
現(xiàn)在的zset是k1 score1 v1 score2 v2
應(yīng)用場(chǎng)景
排行榜
①twitter 的public timeline可以以發(fā)表時(shí)間作為score來存儲(chǔ),這樣獲取時(shí)就是自動(dòng)按時(shí)間排好序的。
②一個(gè)存儲(chǔ)全班同學(xué)成績(jī)的Sorted Set,其集合value可以是同學(xué)的學(xué)號(hào),而score就可以是其考試得分,這樣在數(shù)據(jù)插入集合的時(shí)候,就已經(jīng)進(jìn)行了天然的排序。
③用Sorted Set來做帶權(quán)重的隊(duì)列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來獲取工作任務(wù)。讓重要的任務(wù)優(yōu)先執(zhí)行。
賦值語法zadd key score1 member1 score2 member2
向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)
取值語法zcard key
獲取有序集合的成員數(shù)zcount key min max
計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)zrank key member
返回有序集合中指定成員的索引zrange key start stop [withscores]
通過索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員(低到高)zrevrange key start stop [withscores]
通過索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員(高到低)zlexcount key,min,max
在有序集合中計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量
刪除語法del key
移除集合zrem key member [member ...]
移除有序集合中的一個(gè)或多個(gè)成員zremrangebyrank key start stop
移除有序集合中給定的排名區(qū)間的所有成員(第一名是0)(低到高排序)zremrangebyscore key min max
移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員
分?jǐn)?shù)自增zincrby key ncrement member
有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量increment
六、HyperLoglog
Redis在2.8.9版本添加了HyperLoglog結(jié)構(gòu)。該結(jié)構(gòu)是用來做基數(shù)統(tǒng)計(jì)的算法,
優(yōu)點(diǎn):無論輸入元素多少,計(jì)算基數(shù)所需要的空間總是固定的,并且很小。
缺點(diǎn):只會(huì)根據(jù)輸入元素的計(jì)算基數(shù),而不會(huì)存儲(chǔ)輸入元素本身,索引不能像集合那樣,返回輸入的各個(gè)元素。
什么是基數(shù)?
比如數(shù)據(jù)集{1,2,3,3,4,5,5},那么這個(gè)數(shù)據(jù)集的基數(shù)集為{1,2,3,4,5},基數(shù)為5。所謂基數(shù)估計(jì)就是在誤差可接受的范圍內(nèi),快速計(jì)算基數(shù)。
為什么要使用HyperLogLog?
傳統(tǒng)的統(tǒng)計(jì)一個(gè)對(duì)象的基數(shù)值需要12M內(nèi)存,如果統(tǒng)計(jì)1萬個(gè)對(duì)象,需要將近120G內(nèi)存,無法廣泛應(yīng)用于大數(shù)據(jù)場(chǎng)景;而使用了HyperLogLog,統(tǒng)計(jì)1億個(gè)數(shù)據(jù)的基數(shù)值,大約需要12M,內(nèi)存占用減少明顯。
pfadd key element1 element2 ... elementN
添加指定元素到HyperLogLog中pfcount key
返回給定HyperLogLog的基數(shù)估算值pfmerge destkey sourcekey1 sourcekey2 ...sourcekeyN
將多個(gè)HyperLogLog合并為一個(gè)HyperLogLog
關(guān)于“Redis常用數(shù)據(jù)類型操作指令有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
文章題目:Redis常用數(shù)據(jù)類型操作指令有哪些
轉(zhuǎn)載注明:http://jinyejixie.com/article6/jdogig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、小程序開發(fā)、品牌網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)