一直想寫一篇關于Redis的教程,給自己對Redis的學習做個總結糊肠。這里寫一個簡明教程,大概簡述下Redis是什么遗锣,有什么特性货裹,可以做什么,怎么去運維和監(jiān)控精偿。
1. Redis是什么
初次接觸Redis大概是在18年弧圆,那時候只知到Redis是一套緩存系統赋兵,可以緩存數據庫的查詢結果,可以緩存session搔预,可以用來替換memcached霹期。深入學習之后才發(fā)現Redis可以做的事情可多了,但是最常見的應用場景估計還是緩存拯田。
1.1 Redis的定義
Redis是一個開源(BSD許可)历造,內存存儲的數據結構服務器,可用作數據庫船庇,高速緩存和消息隊列代理帕膜。
這是從Redis中文網找到的Redis的定義。這里分開來解析下:
- Redis是基于內存的溢十,所以它很快垮刹。
- Redis有多種數據結構,這就是它和memcached的一個不同张弛,memcached只支持string類型荒典,而Redis還支持哈希、列表吞鸭、集合寺董、有序集合以及在這個基礎上衍生的更多的數據類型。
- 因為多樣的數據類型刻剥,Redis可以用來做數據庫遮咖、高速緩存甚至是消息隊列。
1.2 Redis的特性
- Redis是單線程的造虏,雖然是單線程御吞,但是它很快。并且因為它的單線程特性漓藕,所以服務端處理模型也非常簡單陶珠,不用考慮并發(fā)的沖突。
- 比起memcache享钞,Redis支持多種的數據機構揍诽,并且還可以做持久化。持久化的方式有RDB和AOF兩種栗竖。
- Redis還支持主從復制暑脆,可以做集群。
- 快狐肢,非程砺穑快。主要是由于基于內存以及單線程的特性处坪,官方給出的讀寫性能可以達到10萬/秒架专。
1.3 Redis的應用場景
- 緩存:和Memcached一樣玄帕,用來緩存數據庫查詢的結果部脚。
- 排行榜系統:這是由于其有序集合的數據類型裤纹。
- 社交網絡:這是由于集合類型委刘,可以做集合運算。
- 消息隊列:Redis提供了發(fā)布訂閱功能和阻塞隊列的功能鹰椒。雖然在功能性上比不上專業(yè)的消息隊列,但是基本的需求還是可以滿足的漆际。
2. Redis的數據結構
Redis支持多種的數據結構,這里做個大概的介紹奸汇。
2.1 string(字符串)
字符串是Redis中最基礎的數據類型施符,可以簡單認為這是一個鍵值對。字符串類型的值可以是字符串擂找、數字甚至是二進制戳吝,最大不能超過512M。常用的命令包括:
##設置及獲取鍵值
set key value
get key
#刪除
del key
##批量設置和獲取鍵值
mset key value
mget key
##自增自減
incr key
decr key
字符串類型的應用常見通常為緩存系統听哭,這就是和memcached一樣的地方塘雳。此外陆盘,Redis還適合做計數器粉捻,因為它的自增和自減的性能非常高。
2.2 hash(哈希)
Redis的哈希數據類型與python中的字典基本一致肩刃,這是一個鍵值對的結構杏头,形如value={{field1盈包,value1}醇王,...{fieldN,valueN}}寓娩。在這里說的value指的是field(字段)的值呼渣,而不是key的值寞埠,需要和前面的字符串類型做區(qū)別。常用的命令包括:
##設置和獲取鍵值
hset key field value
hget key field
##刪除
hdel key field
##計算field個數
hlen key
##批量設置和獲取鍵值
hmget key field
hmset key field
##獲取所有的鍵仁连、值和鍵值
hkeys key
hvals key
hgetall key
哈希數據類型可以明顯看出是基于字符串類型的,所以哈希也可以用在緩存的場景下的饭冬,并且有更高的壓縮率。此外由于哈希數據類型增加字段非常簡單昌抠,如果用來替換關系型數據庫,最大的優(yōu)點就是增加字段幾乎不花時間麦乞。
2.3 list(列表)
這是一個雙向的鏈表,兩端都可以pop和push數據姐直。就是說它可以充當棧和隊列的角色。LPUSH然后LPOP那就是后進先出蒋畜,這就是棧声畏,LPUSH然后RPOP那就是先進先出,這就是隊列姻成,這是消息隊列的基礎。常見的命令如下:
##增均牢、刪才睹、查徘跪、改
lpush key value
rpush key value
lpop key
rpop key
lrange key start end
lset key index newValue
##阻塞操作
blpop key [key ...] timeout
brpop key [key ...] timeout
blpop和brpop是lpop和rpop的阻塞版本琅攘,在列表為空的時候:如果timeout=3,那么客戶端要等到3秒后返回坞琴,如果timeout=0哨查,那么客戶端一直阻塞等下去剧辐。這種情況是不是很容易想到消息隊列呢邮府?
列表類型的應用場景如上面多次提到的消息隊列溉奕,另外它還很適合做文章的列表,畢竟本來就叫做列表類型嘛腐宋。
2.4 set(集合)
集合就是和數學中的集合一樣,就是說它能夠支持對應的集合運算胸竞。對比列表類型,集合類型最大的不同就是它里面的數據是亂序的煎饼,不能通過索引下標獲取元素,并且要求里面的所有數據都不能重復吆玖,必須唯一马篮。常見的命令如下:
2.4.1 集合內操作
#增沾乘、刪
sadd key element
srem key element
#計算元素個數
scard key
#判斷元素是否在集合中
sismember key element
#隨機返回元素
srandmember key [count]
#從集合隨機彈出元素
spop key
#獲取所有元素
smembers key
2.4.2 集合間操作
#交集
sinter key [key ...]
#并集
suinon key [key ...]
#差集
sdiff key [key ...]
很明顯的數據特點浑测,我們可以用集合運算來發(fā)現不同用戶的相同興趣。
2.5 sorted set(有序集合)
在集合的基礎上掷匠,我們給每個元素加上分數岖圈,然后就可以用分數來做排序了讹语。在有序集合中蜂科,元素不可以重復,但是元素可以重復擎值,畢竟一個班級里面考試分數相同也很正常。有序集合的常用命令如下:
2.5.1 集合內
#添加成員
zadd key score member
#計算成員個數
zcard key
#計算某個成員的分數
zscore key member
#計算成員的排名
zrank key member
zrevrank key member
#刪除成員
zrem key member #
#增加成員的分數
zincrby key increment member
#返回指定排名范圍的成員
zrange key start end [withscores]
zrevrange key start end [withscores]
#返回指定分數范圍的成員
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
2.5.2 集合間的操作
#交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
#并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
有了分數,這很明顯用來做排行榜就很合適了厕氨。
2.6 其他數據類型
Redis在這幾個基礎數據類型的上衍生了其他的數據結構进每,比如位圖命斧,hyperloglogs 等等,這里不做介紹贤徒。有興趣可以點擊鏈接查看。