Redis入門(mén)

Redis之入門(mén)教程

博客地址 https://blog.piaoruiqing.com/2019/06/02/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客戶端工具. 支持命令.

Medis

數(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ǔ)在列表中指定索引范圍的值, 值得注意的是, startstop從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)似于混合了SetHash的數(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ù):

zset

[版權(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).

Medis
  • 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)行展示, 如圖:

    Redis Desktop Manager

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ī)


代碼如詩(shī)

[版權(quán)聲明]
本文發(fā)布于樸瑞卿的博客, 非商業(yè)用途允許轉(zhuǎn)載, 但轉(zhuǎn)載必須保留原作者樸瑞卿 及鏈接:blog.piaoruiqing.com. 如有授權(quán)方面的協(xié)商或合作, 請(qǐng)聯(lián)系郵箱: piaoruiqing@gmail.com.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腐芍,隨后出現(xiàn)的幾起案子差导,更是在濱河造成了極大的恐慌,老刑警劉巖猪勇,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件设褐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泣刹,警方通過(guò)查閱死者的電腦和手機(jī)助析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椅您,“玉大人外冀,你說(shuō)我怎么就攤上這事∠朴荆” “怎么了雪隧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)员舵。 經(jīng)常有香客問(wèn)我脑沿,道長(zhǎng),這世上最難降的妖魔是什么马僻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任庄拇,我火速辦了婚禮,結(jié)果婚禮上韭邓,老公的妹妹穿的比我還像新娘措近。我一直安慰自己,他們只是感情好仍秤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布熄诡。 她就那樣靜靜地躺著,像睡著了一般诗力。 火紅的嫁衣襯著肌膚如雪凰浮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天苇本,我揣著相機(jī)與錄音袜茧,去河邊找鬼。 笑死瓣窄,一個(gè)胖子當(dāng)著我的面吹牛笛厦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俺夕,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼裳凸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贱鄙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起姨谷,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逗宁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后梦湘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瞎颗,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年捌议,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哼拔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓣颅,死狀恐怖倦逐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弄捕,我是刑警寧澤僻孝,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站守谓,受9級(jí)特大地震影響穿铆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斋荞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一荞雏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧平酿,春花似錦凤优、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至幸逆,卻和暖如春棍辕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背还绘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工楚昭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拍顷。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓抚太,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尿贫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容