在Redis中有五種數(shù)據(jù)類型
- String----------字符串
- Hash------------字典
- List-------------列表
- Set--------------集合
- Sorted Set------有序集合
一 數(shù)據(jù)類型
String—字符串
string是redis最基本的類型忧便,你可以理解成與Memcached一模一樣的類型凭涂,一個(gè)key對(duì)應(yīng)一個(gè)value垒棋。string類型是二進(jìn)制安全的。意思是redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對(duì)象 。string類型是Redis最基本的數(shù)據(jù)類型,一個(gè)鍵最大能存儲(chǔ)512MB莽龟。
String 數(shù)據(jù)結(jié)構(gòu)是簡(jiǎn)單的 key-value 類型,value 不僅可以是 String蚜点,也可以是數(shù)字(當(dāng)數(shù)字類型用 Long 可以表示的時(shí)候encoding 就是整型轧房,其他都存儲(chǔ)在 sdshdr 當(dāng)做字符串)。使用 Strings 類型绍绘,可以完全實(shí)現(xiàn)目前 Memcached 的功能奶镶,并且效率更高迟赃。還可以享受 Redis 的定時(shí)持久化(可以選擇 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能厂镇。除了提供與 Memcached 一樣的 get纤壁、set、incr捺信、decr 等操作外酌媒,Redis 還提供了下面一些操作:
- LEN:O(1)獲取字符串長(zhǎng)度
- APPEND :往字符串 append 內(nèi)容,而且采用智能分配內(nèi)存(每次2倍)
- 設(shè)置和獲取字符串的某一段內(nèi)容
- 設(shè)置及獲取字符串的某一位(bit)
- 批量設(shè)置一系列字符串的內(nèi)容
- 原子計(jì)數(shù)器
- GET SET 命令的妙用迄靠,請(qǐng)于清空舊值的同時(shí)設(shè)置一個(gè)新值秒咨,配合原子計(jì)數(shù)器使用
Hash——字典(哈希)
Hash是一個(gè)健值對(duì)集合,是一個(gè)String類型的key與value的映射表掌挚,特別適合用于存儲(chǔ)對(duì)象雨席。
使用場(chǎng)景:存儲(chǔ)、讀取吠式、修改用戶屬性
在 Memcached 中陡厘,我們經(jīng)常將一些結(jié)構(gòu)化的信息打包成 hashmap,在客戶端序列化后存儲(chǔ)為一個(gè)字符串的值(一般是 JSON 格式)特占,比如用戶的昵稱糙置、年齡、性別是目、積分等谤饭。這時(shí)候在需要修改其中某一項(xiàng)時(shí),通常需要將字符串(JSON)取出來胖笛,然后進(jìn)行反序列化网持,修改某一項(xiàng)的值宜岛,再序列化成字符串(JSON)存儲(chǔ)回去长踊。簡(jiǎn)單修改一個(gè)屬性就干這么多事情,消耗必定是很大的萍倡,也不適用于一些可能并發(fā)操作的場(chǎng)合(比如兩個(gè)并發(fā)的操作都需要修改積分)身弊。而 Redis 的 Hash 結(jié)構(gòu)可以使你像在數(shù)據(jù)庫(kù)中 Update 一個(gè)屬性一樣只修改某一項(xiàng)屬性值。
List——列表
使用場(chǎng)景:微博 TimeLine列敲、消息隊(duì)列
List 說白了就是鏈表(redis 使用雙端鏈表實(shí)現(xiàn)的 List)阱佛,相信學(xué)過數(shù)據(jù)結(jié)構(gòu)知識(shí)的人都應(yīng)該能理解其結(jié)構(gòu)。使用 List 結(jié)構(gòu)戴而,我們可以輕松地實(shí)現(xiàn)最新消息排行等功能(比如新浪微博的 TimeLine )凑术。List 的另一個(gè)應(yīng)用就是消息隊(duì)列,可以利用 List 的 *PUSH 操作所意,將任務(wù)存在 List 中淮逊,然后工作線程再用 POP 操作將任務(wù)取出進(jìn)行執(zhí)行催首。Redis 還提供了操作 List 中某一段元素的 API,你可以直接查詢泄鹏,刪除 List 中某一段的元素
Set——集合
集合是通過哈希表實(shí)現(xiàn)的郎任,所以添加,刪除备籽,查找的復(fù)雜度都是O(1)
使用場(chǎng)景:
**1. 共同好友舶治、二度好友 **
**2. 利用唯一性,可以統(tǒng)計(jì)訪問網(wǎng)站的所有獨(dú)立 IP **
3. 好友推薦的時(shí)候车猬,根據(jù) tag 求交集霉猛,大于某個(gè) threshold 就可以推薦
Set 就是一個(gè)集合,集合的概念就是一堆不重復(fù)值的組合珠闰。利用 Redis 提供的 Set 數(shù)據(jù)結(jié)構(gòu)韩脏,可以存儲(chǔ)一些集合性的數(shù)據(jù)。比如在微博應(yīng)用中铸磅,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中赡矢,將其所有粉絲存在一個(gè)集合。因?yàn)?Redis 非常人性化的為集合提供了求交集阅仔、并集吹散、差集等操作,那么就可以非常方便的實(shí)現(xiàn)如共同關(guān)注八酒、共同喜好空民、二度好友等功能,對(duì)上面的所有集合操作羞迷,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個(gè)新的集合中界轩。
Sorted Set——有序集合
使用場(chǎng)景:
**1. 帶有權(quán)重的元素,比如一個(gè)游戲的用戶得分排行榜 **
2. 比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)衔瓮,一般用到的場(chǎng)景不算太多
和Sets相比浊猾,Sorted Sets是將 Set 中的元素增加了一個(gè)權(quán)重參數(shù) score,使得集合中的元素能夠按 score 進(jìn)行有序排列热鞍,比如一個(gè)存儲(chǔ)全班同學(xué)成績(jī)的 Sorted Sets葫慎,其集合 value 可以是同學(xué)的學(xué)號(hào),而 score 就可以是其考試得分薇宠,這樣在數(shù)據(jù)插入集合的時(shí)候偷办,就已經(jīng)進(jìn)行了天然的排序。另外還可以用 Sorted Sets 來做帶權(quán)重的隊(duì)列澄港,比如普通消息的 score 為1椒涯,重要消息的 score 為2,然后工作線程可以選擇按 score 的倒序來獲取工作任務(wù)回梧。讓重要的任務(wù)優(yōu)先執(zhí)行
二 redis 其他功能使用場(chǎng)景
訂閱-發(fā)布系統(tǒng)
Pub/Sub 從字面上理解就是發(fā)布(Publish)與訂閱(Subscribe)废岂,在 Redis 中铡溪,你可以設(shè)定對(duì)某一個(gè) key 值進(jìn)行消息發(fā)布及消息訂閱,當(dāng)一個(gè) key 值上進(jìn)行了消息發(fā)布后泪喊,所有訂閱它的客戶端都會(huì)收到相應(yīng)的消息棕硫。這一功能最明顯的用法就是用作實(shí)時(shí)消息系統(tǒng),比如普通的即時(shí)聊天袒啼,群聊等功能哈扮。
事務(wù)——Transactions
誰(shuí)說 NoSQL 都不支持事務(wù),雖然 Redis 的 Transactions 提供的并不是嚴(yán)格的 ACID 的事務(wù)(比如一串用 EXEC 提交執(zhí)行的命令蚓再,在執(zhí)行中服務(wù)器宕機(jī)滑肉,那么會(huì)有一部分命令執(zhí)行了,剩下的沒執(zhí)行)摘仅,但是這個(gè) Transactions 還是提供了基本的命令打包執(zhí)行的功能(在服務(wù)器不出問題的情況下靶庙,可以保證一連串的命令是順序在一起執(zhí)行的,中間不會(huì)有其它客戶端命令插進(jìn)來執(zhí)行)娃属。Redis 還提供了一個(gè) Watch 功能六荒,你可以對(duì)一個(gè) key 進(jìn)行 Watch,然后再執(zhí)行 Transactions矾端,在這過程中掏击,如果這個(gè) Watched 的值進(jìn)行了修改,那么這個(gè) Transactions 會(huì)發(fā)現(xiàn)并拒絕執(zhí)行秩铆。