Redis之入門(mén)教程
關(guān)鍵詞
-
Redis
: Redis是一個(gè)開(kāi)源(BSD許可)內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ). 可用作數(shù)據(jù)庫(kù), 緩存和消息代理. -
NoSql
: 泛指非關(guān)系型的數(shù)據(jù)庫(kù). -
Docker
: 是一個(gè)開(kāi)源的應(yīng)用容器引擎. 可以非常方便地部署服務(wù). -
緩存
:高速緩存
簡(jiǎn)稱(chēng)緩存
晌端,原始意義是指訪問(wèn)速度比一般隨機(jī)存取存儲(chǔ)器(RAM)快的一種RAM戈鲁,通常它不像系統(tǒng)主存那樣使用DRAM技術(shù),而使用昂貴但較快速的SRAM技術(shù). 簡(jiǎn)言之, 緩存是在計(jì)算機(jī)上的一個(gè)原始數(shù)據(jù)的復(fù)制集, 讓數(shù)據(jù)更接近使用者, 有著更快的訪問(wèn)速度.
前言
本文闡述了Redis的簡(jiǎn)單使用, 包括使用Docker啟動(dòng)redis服務(wù)端蛤铜、redis客戶端的使用嫩絮、redis常用數(shù)據(jù)結(jié)構(gòu)及其使用方法和場(chǎng)景.
使用入門(mén)
服務(wù)端
本文使用Docker啟動(dòng)redis服務(wù)端.
Docker Hub: https://hub.docker.com/_/redis
docker container run \
--rm \
--name redis \
-p 6379:6379 \
-d \
redis:5.0
-
--rm
: 退出后刪除 -
--name
: 指定容器名 -
-p
: 映射端口 -
-d
: 后臺(tái)運(yùn)行并輸出容器ID
客戶端
redis-cli
原生redis客戶端
在宿主機(jī)上執(zhí)行docker exec -it redis redis-cli
即可進(jìn)入容器內(nèi)的redis客戶端. 注: 命令中redis
為前文中啟動(dòng)redis時(shí)指定的容器名: --name redis
(也可用容器id替代).
root@ubuntu:/home/ubuntu/docker/redis$ docker exec -it redis redis-cli
127.0.0.1:6379>
medis
medis是一個(gè)圖形化redis客戶端工具. 支持命令.
數(shù)據(jù)結(jié)構(gòu)
Redis不是普通的鍵值對(duì)存儲(chǔ), 它實(shí)際上是一個(gè)支持不同類(lèi)型數(shù)據(jù)結(jié)構(gòu)的服務(wù)器. 這意味著Redis與傳統(tǒng)的鍵值存儲(chǔ)不同, 具有更多更復(fù)雜的數(shù)據(jù)結(jié)構(gòu), 下文將簡(jiǎn)要介紹Redis的數(shù)據(jù)結(jié)構(gòu)及用法.
Binary-safe strings
應(yīng)用場(chǎng)景:
- 緩存HTML片段或頁(yè)面
- 緩存某個(gè)接口的返回值等.
Redis String類(lèi)型是與Redis Key關(guān)聯(lián)的最簡(jiǎn)單的值類(lèi)型.
打開(kāi)redis-cli
執(zhí)行簡(jiǎn)單的string操作. (后文中所有示例都將使用redis-cli
)
127.0.0.1:6379> SET mykey myvalue
OK
127.0.0.1:6379> GET mykey
"myvalue"
127.0.0.1:6379> KEYS my*
1) "mykey"
127.0.0.1:6379> EXISTS mykey
(integer) 1
127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> GET mykey
(nil)
-
SET
: 設(shè)置KEY對(duì)應(yīng)的值. -
GET
: 獲取指定KEY的值. -
KEYS
: 查詢KEY. -
EXISTS
: 查詢KEY是否存在. -
DEL
: 刪除KEY. -
EXPIRE
: 指定KEY的過(guò)期時(shí)間 (SET
命令也可通過(guò)參數(shù)指定過(guò)期時(shí)間)
Lists
應(yīng)用場(chǎng)景:
- 記錄用戶發(fā)布到社交網(wǎng)絡(luò)的最近更新.
- 流程之間的通信, 借助redis列表實(shí)現(xiàn)
生產(chǎn)者 - 消費(fèi)者
模式.
根據(jù)插入順序排序的字符串元素的集合. 其實(shí)現(xiàn)基于鏈表, 因此即使數(shù)據(jù)量極大的情況下, 也能在常量時(shí)間內(nèi)添加元素到列表頭或尾.
127.0.0.1:6379> RPUSH mylist a # 尾部增加元素a
(integer) 1
127.0.0.1:6379> RPUSH mylist b # 尾部增加元素b
(integer) 2
127.0.0.1:6379> LPUSH mylist first # 頭部增加元素first
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1 # 獲取mylist全部元素
1) "first"
2) "a"
3) "b"
127.0.0.1:6379> LRANGE mylist 0 -2 # 獲取mylist第一~倒數(shù)第二的全部元素
1) "first"
2) "a"
127.0.0.1:6379> RPOP mylist # 從尾部彈出一個(gè)元素
"b"
127.0.0.1:6379> LPOP mylist # 從頭部彈出一個(gè)元素
"first"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "a"
127.0.0.1:6379> RPUSH mylist b c d e f g # 尾部增加 b c d e f g 元素
(integer) 7
127.0.0.1:6379> LRANGE mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> LTRIM mylist 0 2 # 截取索引0~2的元素(其余元素丟棄)
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "a"
2) "b"
3) "c"
-
RPUSH
: 在列表尾部(右側(cè))增加新元素. -
LPUSH
: 在列表頭部(左側(cè))增加新元素. -
LRANGE
: 獲取存儲(chǔ)在列表中指定索引范圍的值, 值得注意的是,start
和stop
從0開(kāi)始, 支持負(fù)值, 負(fù)值的意義是從尾部開(kāi)始偏移, 倒數(shù)第一個(gè)為-1, 倒數(shù)第二個(gè)為-2, 依此類(lèi)推
. 故命令LRANGE mylist 0 -1
的含義為獲取全部元素(第一個(gè)到最后一個(gè)). -
RPOP
: POP相信很多人并不陌生, 彈出一個(gè)元素(獲取并刪除),RPOP
的含義就是從尾部(右側(cè))彈出一個(gè)元素. -
LPOP
: 與RPOP
類(lèi)似, 其含義為從列表頭部(左側(cè))彈出一個(gè)元素. -
LTRIM
: 截取元素, 指定截取的范圍, 其余丟棄.
Sets
應(yīng)用場(chǎng)景:
- 希望存儲(chǔ)一個(gè)不重復(fù)的數(shù)據(jù)集合,
- 獲取兩個(gè)人的共同好友
Sets
是字符串的無(wú)序集合. 使用過(guò)Java的讀者應(yīng)該對(duì)HashSet
并不陌生, 其特點(diǎn)就是無(wú)序且元素不重復(fù), Redis的Set也有這樣的特點(diǎn).
127.0.0.1:6379> SADD myset a # 將元素 a 存入 myset
(integer) 1
127.0.0.1:6379> SMEMBERS myset # 獲取 myset 的元素
1) "a"
127.0.0.1:6379> SADD myset a # 再次將元素 a 存入 myset, set能保證元素唯一,故此次存入返回0
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "a"
127.0.0.1:6379> SADD myset b c # 將元素 b、c 存入 myset
(integer) 2
127.0.0.1:6379> SMEMBERS myset
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> SPOP myset # 隨機(jī)彈出一個(gè)元素
"c"
127.0.0.1:6379> SMEMBERS myset
1) "b"
2) "a"
127.0.0.1:6379> SADD myset c # 將剛剛彈出的c放回去
(integer) 1
127.0.0.1:6379> SPOP myset # 再次隨機(jī)彈出, 這一次彈出的是b
"b"
127.0.0.1:6379> SMEMBERS myset
1) "c"
2) "a"
-
SADD
: 向set添加元素. -
SMEMBERS
: 獲取set的元素. -
SPOP
: 隨機(jī)彈出一個(gè)元素. - Sets還可以進(jìn)行交集围肥、并集剿干、差集計(jì)算等操作.
Sorted sets
應(yīng)用場(chǎng)景:
- 以某個(gè)條件為權(quán)重進(jìn)行排序, 例如排行榜.
有序集合是一種類(lèi)似于混合了Set
和Hash
的數(shù)據(jù)結(jié)構(gòu), 由唯一的、 非重復(fù)的字符串元素組成. 因此在一定程度上也算是一種集合(Set).
有序集合中的每個(gè)元素都與浮點(diǎn)值相關(guān)聯(lián), 稱(chēng)為分?jǐn)?shù) (score) (這就是為什么說(shuō)它也類(lèi)似于散列(hash), 因?yàn)槊總€(gè)元素都映射到一個(gè)值).
127.0.0.1:6379> ZADD students 99 piaoruiqing # 向students存入piaoruiqing且指定其score為99
(integer) 1
127.0.0.1:6379> ZADD students 98 zhangsan
(integer) 1
127.0.0.1:6379> ZADD students 85 lisi
(integer) 1
127.0.0.1:6379> ZADD students 90 wangwu
(integer) 1
127.0.0.1:6379> ZRANGE students 0 -1 # 獲取students全部元素
1) "lisi"
2) "wangwu"
3) "zhangsan"
4) "piaoruiqing"
127.0.0.1:6379> ZRANGE students 0 -1 WITHSCORES # 升序獲取students全部元素及其score
1) "lisi"
2) "85"
3) "wangwu"
4) "90"
5) "zhangsan"
6) "98"
7) "piaoruiqing"
8) "99"
127.0.0.1:6379> ZREVRANGE students 0 -1 WITHSCORES # 降序獲取students全部元素及其score
1) "piaoruiqing"
2) "99"
3) "zhangsan"
4) "98"
5) "wangwu"
6) "90"
7) "lisi"
8) "85"
127.0.0.1:6379> ZADD students 99 wuliu # 不同元素評(píng)分可以相同(piaoruiqing和wuliu都是99)
(integer) 1
127.0.0.1:6379> ZREVRANGE students 0 -1 WITHSCORES
1) "wuliu"
2) "99"
3) "piaoruiqing"
4) "99"
5) "zhangsan"
6) "98"
7) "wangwu"
8) "90"
9) "lisi"
10) "85"
為了更直觀, 讓我們從Medis查看下這條數(shù)據(jù):
[版權(quán)聲明]
本文發(fā)布于樸瑞卿的博客, 非商業(yè)用途允許轉(zhuǎn)載, 但轉(zhuǎn)載必須保留原作者樸瑞卿 及鏈接:blog.piaoruiqing.com. 如有授權(quán)方面的協(xié)商或合作, 請(qǐng)聯(lián)系郵箱: piaoruiqing@gmail.com.
Hashes
應(yīng)用場(chǎng)景:
- 適合存儲(chǔ)對(duì)象, 可用緩存用戶信息等
Hashes
是一個(gè)field-value
的映射表, 適合存儲(chǔ)對(duì)象.
127.0.0.1:6379> HSET user:9527 user_name piaoruiqing verified 1 user_level 99 # 存
(integer) 1
127.0.0.1:6379> HGET user:9527 user_name # 獲取 user:9527 的user_name字段的值.
"piaoruiqing"
127.0.0.1:6379> HGET user:9527 user_level
"99"
127.0.0.1:6379> HGETALL user:9527 # 獲取 user:9527 的全部字段和元素
1) "user_name"
2) "piaoruiqing"
3) "birth_year"
4) "1977"
5) "verified"
6) "1"
7) "user_level"
8) "99"
為了更直觀, 讓我們從Medis查看下這條數(shù)據(jù):
值得注意的是: 圖中第一欄標(biāo)題的type是數(shù)據(jù)類(lèi)型, name是redis的key, 第二列標(biāo)題的key, 就是Hashes的field. 請(qǐng)讀者切勿被界面中的文字誤導(dǎo).
HSET
: 向hashs存入元素.HGET
: 獲取key某字段對(duì)應(yīng)的元素.HGETALL
: 獲取key的全部字段和元素.-
:
: 值得一提的是一般將冒號(hào):
作為redis key的分隔符. 冒號(hào)在早期的redis版本中是一個(gè)存儲(chǔ)命名空間數(shù)據(jù)的概念, 是一個(gè)"遺留下來(lái)"的"約定", 冒號(hào)并不強(qiáng)制使用, 如果有需要, 你可以選擇_
虐先、怨愤、
、,
等任何字符分割你的key, 但推薦使用:
, 因?yàn)楹芏嗫蛻舳硕寄J(rèn)將其作為命名空間進(jìn)行展示, 比如Redis Desktop Manager
就使用冒號(hào)將redis的key分割為樹(shù)狀結(jié)構(gòu)進(jìn)行展示, 如圖:
HyperLogLogs
應(yīng)用場(chǎng)景:
- 統(tǒng)計(jì)網(wǎng)站訪問(wèn)IP總量.
HyperLogLogs
是用來(lái)計(jì)算唯一事物出現(xiàn)概率的一種數(shù)據(jù)結(jié)構(gòu). 它并不存儲(chǔ)元素本身, 僅僅根據(jù)元素來(lái)計(jì)算基數(shù). 即使元素很大它也能占用極小的空間快速計(jì)算出基數(shù).
127.0.0.1:6379> PFADD ip 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.2 # 存入四個(gè)IP元素
(integer) 1
127.0.0.1:6379> PFCOUNT ip # 獲取當(dāng)前IP總量 (192.168.0.2出現(xiàn)過(guò)兩次, 故獲取的值是3而不是4)
(integer) 3
Streams
應(yīng)用場(chǎng)景:
- 消息隊(duì)列
Stream是Redis 5.0引入的一種新數(shù)據(jù)類(lèi)型, 其設(shè)計(jì)借鑒了Kafka, 以完全不同的方式實(shí)現(xiàn)了與Kafka類(lèi)似的思想: 允許一組客戶端合作消費(fèi)相同的消息流的不同部分. 彌補(bǔ)了Redis Pub/Sub不能持久化消息的缺陷
127.0.0.1:6379> XADD mystream * sensor_id 9527 temperature 19.9 # 存入
"1559476322048-0"
127.0.0.1:6379> XADD mystream * sensor_id 9528 temperature 19.9
"1559476326813-0"
127.0.0.1:6379> XRANGE mystream - + # 獲取
1) 1) "1559476322048-0"
2) 1) "sensor_id"
2) "9527"
3) "temperature"
4) "19.9"
2) 1) "1559476326813-0"
2) 1) "sensor_id"
2) "9528"
3) "temperature"
4) "19.9"
127.0.0.1:6379> XRANGE mystream - + COUNT 1 # 獲取(升序)
1) 1) "1559476322048-0"
2) 1) "sensor_id"
2) "9527"
3) "temperature"
4) "19.9"
127.0.0.1:6379> XREVRANGE mystream + - COUNT 1 # 獲取(降序)
1) 1) "1559476326813-0"
2) 1) "sensor_id"
2) "9528"
3) "temperature"
4) "19.9"
-
XADD
: 存入, 命令XADD mystream * sensor_id 9527 temperature 19.9
中*
表示自動(dòng)生成ID -
XRANGE
: 獲取(升序) -
XREVRANGE
: 獲取(降序)
結(jié)語(yǔ)
本文闡述了redis的簡(jiǎn)單使用方式及常用數(shù)據(jù)結(jié)構(gòu), 需要深入了解的讀者可以訪問(wèn)redis官網(wǎng)獲取更詳細(xì)的文檔.
后續(xù)文章將闡述redis在實(shí)際開(kāi)發(fā)中的使用方式,如: Java客戶端集成蛹批、Lua腳本的使用撰洗、實(shí)踐案例等, 敬請(qǐng)關(guān)注.
參考文獻(xiàn)
歡迎關(guān)注公眾號(hào): 代碼如詩(shī)
[版權(quán)聲明]
本文發(fā)布于樸瑞卿的博客, 非商業(yè)用途允許轉(zhuǎn)載, 但轉(zhuǎn)載必須保留原作者樸瑞卿 及鏈接:blog.piaoruiqing.com. 如有授權(quán)方面的協(xié)商或合作, 請(qǐng)聯(lián)系郵箱: piaoruiqing@gmail.com.