原文出處:http://www.yund.tech/zdetail.html?type=1&id=b8d62d1179aa19ef7df3d771b9af1428
作者: jstarseven
一爽醋、前言
Redis 提供了5種數(shù)據(jù)類型:String(字符串)源祈、Hash(哈希)、List(列表)、Set(集合)孝扛、Zset(有序集合),理解每種數(shù)據(jù)類型的特點(diǎn)對(duì)于redis的開發(fā)和運(yùn)維非常重要拨脉。
?String是Redis的最基本的數(shù)據(jù)類型辨赐,可以理解為與 Memcached 一模一樣的類型,即Key-Value型的數(shù)據(jù)诲祸,String類型是二進(jìn)制安全的浊吏,另外 Redis 的 String 可以包含任何數(shù)據(jù)而昨,簡(jiǎn)單的字符串、復(fù)雜的字符串(xml找田、json)歌憨、數(shù)字(整數(shù)、浮點(diǎn)數(shù))墩衙、二進(jìn)制(圖片务嫡、音頻、視頻)漆改,一個(gè) Redis 中字符串 value 最多可以是 512M心铃。
二、String 類型操作命令
命令 | 描述 | 用法 |
---|---|---|
SET | 1.將字符串值Value關(guān)聯(lián)到Key 2.Key已關(guān)聯(lián)則覆蓋挫剑,無視類型 3.原本Key帶有生存時(shí)間TTL去扣,那么TTL被清除 |
SET key value [EX seconds] [PX milliseconds] [NX|XX] |
GET | 1.返回key關(guān)聯(lián)的字符串值 2.Key不存在返回nil 3.Key存儲(chǔ)的不是字符串,返回錯(cuò)誤樊破,因?yàn)镚ET只用于處理字符串 |
GET key |
MSET | 1.同時(shí)設(shè)置一個(gè)或多個(gè)Key-Value鍵值對(duì) 2.某個(gè)給定Key已經(jīng)存在愉棱,那么MSET新值會(huì)覆蓋舊值 3.如果上面的覆蓋不是希望的,那么使用MSETNX命令哲戚,所有Key都不存在才會(huì)進(jìn)行覆蓋 4.MSET是一個(gè)原子性操作奔滑,所有Key都會(huì)在同一時(shí)間被設(shè)置,不會(huì)存在有些更新有些沒更新的情況 |
MSET key value [key value ...] |
MGET | 1.返回一個(gè)或多個(gè)給定Key對(duì)應(yīng)的Value 2.某個(gè)Key不存在那么這個(gè)Key返回nil |
MGET key [key ...] |
SETEX | 1.將Value關(guān)聯(lián)到Key 2.設(shè)置Key生存時(shí)間為seconds惫恼,單位為秒 3.如果Key對(duì)應(yīng)的Value已經(jīng)存在档押,則覆蓋舊值 4.SET也可以設(shè)置失效時(shí)間,但是不同在于SETNX是一個(gè)原子操作祈纯,即關(guān)聯(lián)值與設(shè)置生存時(shí)間同一時(shí)間完成 |
SETEX key seconds value |
SETNX | 1.將Key的值設(shè)置為Value,當(dāng)且僅當(dāng)Key不存在 2.若給定的Key已經(jīng)存在叼耙,SEXNX不做任何動(dòng)作 |
SETNX key value |
三腕窥、應(yīng)用場(chǎng)景
- 緩存功能:字符串最經(jīng)典的使用場(chǎng)景,redis最為緩存層筛婉,Mysql作為儲(chǔ)存層簇爆,絕大部分請(qǐng)求數(shù)據(jù)都是redis中獲取,由于redis具有支撐高并發(fā)特性爽撒,所以緩存通常能起到加速讀寫和降低 后端壓力的作用入蛆。
- 計(jì)數(shù)器:許多運(yùn)用都會(huì)使用redis作為計(jì)數(shù)的基礎(chǔ)工具,他可以實(shí)現(xiàn)快速計(jì)數(shù)硕勿、查詢緩存的功能哨毁,同時(shí)數(shù)據(jù)可以一步落地到其他的數(shù)據(jù)源。如:視頻播放數(shù)系統(tǒng)就是使用redis作為視頻播放數(shù)計(jì)數(shù)的基礎(chǔ)組件源武。
- 共享session:出于負(fù)載均衡的考慮扼褪,分布式服務(wù)會(huì)將用戶信息的訪問均衡到不同服務(wù)器上想幻,用戶刷新一次訪問可能會(huì)需要重新登錄,為避免這個(gè)問題可以用redis將用戶session集中管理话浇,在這種模式下只要保證redis的高可用和擴(kuò)展性的脏毯,每次獲取用戶更新或查詢登錄信息都直接從redis中集中獲取。
- 限速:處于安全考慮幔崖,每次進(jìn)行登錄時(shí)讓用戶輸入手機(jī)驗(yàn)證碼食店,為了短信接口不被頻繁訪問,會(huì)限制用戶每分鐘獲取驗(yàn)證碼的頻率赏寇。
四叛买、特殊的String操作:INCR/DECR
??INCR/DECR操作可以利用Redis自動(dòng)幫助我們對(duì)一個(gè)Key對(duì)應(yīng)的Value進(jìn)行加減,在實(shí)際工作中還是很常用的蹋订。
INCR/DECR操作在 Redis 中的相關(guān)命令:
命令 | 描述 | 用法 |
---|---|---|
INCR | 1)Key中存儲(chǔ)的數(shù)字值+1率挣,返回增加之后的值 2)Key不存在,那么Key的值被初始化為0再執(zhí)行INCR 3)如果值包含錯(cuò)誤類型或者字符串不能被表示為數(shù)字露戒,那么返回錯(cuò)誤 4)值限制在64位有符號(hào)數(shù)字表示之內(nèi)即-9223372036854775808~9223372036854775807 |
INCR key |
DECR | 1)Key中存儲(chǔ)的數(shù)字值-1 2)其余同INCR |
DECR key |
INCRBY | 1)將key所存儲(chǔ)的值加上增量返回增加之后的值 2)其余同INCR |
INCRBY key increment |
DECRBY | 1)將key所存儲(chǔ)的值減去減量decrement 2)其余同INCR |
DECRBY key decrement |
五稚虎、INCR/DECR 應(yīng)用場(chǎng)景
- 原先單機(jī)環(huán)境中統(tǒng)計(jì)在線人數(shù),變成分布式部署之后可以使用INCR/DECR
- 由于Redis本身極高的讀寫性能酿矢,一些秒殺的場(chǎng)景庫(kù)存增減可以基于Redis來做而不是直接操作DB
image