redis數(shù)據(jù)類型和應(yīng)用場景
redis簡介
Redis是當(dāng)前比較熱門的NOSQL系統(tǒng)之一,它是一個開源的使用ANSI c語言編寫的key-value存儲系統(tǒng)(區(qū)別于MySQL的二維表格的形式存儲。),Redis數(shù)據(jù)都是緩存在計算機內(nèi)存中并且它會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,實現(xiàn)數(shù)據(jù)的持久化。談到存儲數(shù)據(jù),那么必然要涉及到相關(guān)的數(shù)據(jù)類型,redis主要有以下數(shù)據(jù)類型:
string(字符串)
描述:string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應(yīng)一個 value。value其實不僅是String,也可以是數(shù)字。string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對象。string 類型是 Redis 最基本的數(shù)據(jù)類型,string 類型的值最大能存儲 512MB。
常用命令:get、set、incr、decr、mget等。
應(yīng)用場景:規(guī)key-value緩存應(yīng)用。常規(guī)計數(shù): 點贊數(shù), 粉絲數(shù)。
hash(哈希)
描述: hash 是一個鍵值(key => value)對集合。Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。
常用命令:hget,hset,hgetall 等。
應(yīng)用場景:存儲部分變更數(shù)據(jù),如商品信息等。
list(列表)
描述:list 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。
常用命令:lpush(添加左邊元素),rpush,lpop(移除左邊第一個元素),rpop,lrange(獲取列表片段,LRANGE key start stop)等。
應(yīng)用場景:消息隊列,關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來實現(xiàn)。
set(無序集合)
描述: set是string類型的無序集合。集合是通過hashtable實現(xiàn)的,概念和數(shù)學(xué)中個的集合基本類似,可以交集,并集,差集等等,set中的元素是沒有順序的。所以添加,刪除,查找的復(fù)雜度都是O(1)。
常用命令:sadd,spop,smembers,sunion 等。
應(yīng)用場景:交集,并集,差集(微博中,可以將一個用戶所有的關(guān)注人存在一個集合中,將其所有粉絲存在一個集合。Redis還為集合提供了求交集、并集、差集等操作,可以非常方便的實現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個新的集合中)
zset(有序集合)
描述:zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。不同是可以打分(排序)
常用命令:zadd,zrange,zrem,zcard等
應(yīng)用場景:排行榜,帶權(quán)重的消息隊列
Bitmaps
描述:Bitmaps這個“數(shù)據(jù)結(jié)構(gòu)”可以實現(xiàn)對位的操作。 把數(shù)據(jù)結(jié)構(gòu)加上引號主要因為:
Bitmaps本身不是一種數(shù)據(jù)結(jié)構(gòu), 實際上它就是字符串 , 但是它可以對字符串的位進行操作。
Bitmaps單獨提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一個以位為單位的數(shù)組, 數(shù)組的每個單元只能存儲0和1, 數(shù)組的下標(biāo)在Bitmaps中叫做偏移量。其實大多數(shù)Bitmaps的應(yīng)用場景可以用其他數(shù)據(jù)類型來實現(xiàn),用Bitmaps主要是存儲空間占用特別少
常用命令:getbit key offset;setbit key offset value
應(yīng)用場景:統(tǒng)計用戶訪問,統(tǒng)計電影某天的的播放量
HyperLogLog
描述:Redis 在 2.8.9 版本添加了 HyperLogLog 結(jié)構(gòu)。Redis HyperLogLog 是用來做基數(shù)統(tǒng)計的算法,HyperLogLog 的優(yōu)點是,在輸入元素的數(shù)量或者體積非常非常大時,計算基數(shù)所需的空間總是固定 的、并且是很小的。在 Redis 里面,每個 HyperLogLog 鍵只需要花費 12 KB 內(nèi)存,就可以計算接近 2^64 個不同元素的基 數(shù)。這和計算基數(shù)時,元素越多耗費內(nèi)存就越多的集合形成鮮明對比。但是,因為 HyperLogLog 只會根據(jù)輸入元素來計算基數(shù),而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素。這類數(shù)據(jù)結(jié)構(gòu)的基本大的思路就是使用統(tǒng)計概率上的算法,犧牲數(shù)據(jù)的精準(zhǔn)性來節(jié)省內(nèi)存的占用空間及提升相關(guān)操作的性能
常用命令:pfadd, pfcount,pfmerge
應(yīng)用場景:統(tǒng)計網(wǎng)站的每日UV
GEO
描述:GEO功能在Redis3.2版本提供,支持存儲地理位置信息用來實現(xiàn)諸如附近位置、搖一搖這類依賴于地理位置信息的功能.geo的數(shù)據(jù)類型為zset.
常用命令:geoadd,geopos, geodist
應(yīng)用場景:附近位置、搖一搖