Redis入門指引

LuaAgosto 7年前發布 | 44K 次閱讀 Redis NoSQL數據庫

概述

本文算是一篇翻譯,原文是 Try Redis 中提供的英文指引。Try Redis提供了一個控制臺作為客戶端,你可以在這里輸入redis的指令來學習redis。這是一個非常棒的做法。

Try Redis

關于Redis說點什么,目前我們公司的項目使用Redis作為數據緩存,緩存的目標主要是那些需要經常訪問的數據,或計算復雜而耗時的數據。緩存的效果就是減少了數據庫讀的次數,減少了復雜數據的計算次數,從而提高了服務器的性能。

好了,下面開始Try Redis的指引內容。

Try Redis指引

說明

TRY REDIS是Redis數據庫的一個范例。這里提供了服務器和客戶端讓你學習Redis。

在這里你可以輸入tutorial獲取簡要的教程,輸入help獲取支持的命令列表。輸入redis命令來和后臺的數據庫進行交互,用來實踐。

數據類型:string

SET & GET

Redis是一個基于key-value存儲的服務器,經常被看作一個NoSQL數據庫。Key-value存儲的本質,是可以提供存儲一些數據的能力。這些數據被稱為value,放到key里面。存儲的value可以被檢索出來,檢索的唯一途徑是提供存儲時使用的key。我們可以使用SET命令,將value "fido"存儲到key "server:name"里面。

SET server:name "fido"

Redis會把我們的數據存儲起來,之后我們問"key server:name里存儲的value是什么?",Redis會回答"fido"。

GET server:name => "fido"

提示:箭頭(=>)之后的問題,是命令的輸出結果。

常用的命令

其他常用的命令有:

  • DEL:刪除指定的key,和相關的value
  • SETNX:SET-if-not-exists,僅當這個key不存在的時候,設置這個key。SET命令有可能是新增一個key-value,也有可能是修改一個已有的key。而SETNX命令保證只會新增,不會去覆蓋已有的值。
  • INCR:指定一個key,這個key里面存儲的是一個數字,對這個數字進行原子遞增。如果指定的key原本不存在,當作0處理。
SET connections 10
INCR connections => 11
INCR connections => 12
DEL connections
INCR connections => 1

原子操作

INCR命令有些特殊,為什么我們要提供這個命令呢?我們似乎可以用一小段代碼來實現這個功能:

x = GET count
x = x + 1
SET count x

如果只有一個客戶端使用這個key,那是沒有問題的。但是如果兩個客戶端同時訪問這個key,可能會發生下面的情況:

1. Client A 讀取count,結果為10

  1. Client B 讀取count,結果為10
  2. Client A 遞增,設置count為11
  3. Client B 遞增,設置count為11</code></pre>

    我們想把這個值變成12,結果卻是11。出現這個問題是因為這種遞增的方式不是原子操作。INCR命令提供了原子操作性質的遞增功能,可以避免這種情況。Redis針對不同的數據類型,提供了很多的原子命令。

    有效期

    你可以告訴Redis,一個key只存在一段時間。這個功能由EXPIRE和TTL實現。

    SET resource:lock "Redis Demo"
    EXPIRE resource:lock 120

    這將導致key resource:lock在120秒后被刪除。你可以使用TTL命令查看一個key的剩余存活時間,它返回一個秒數。

    TTL resource:lock => 113 // 離被刪除時間還有113秒
    TTL resource:lock => -2   // 已經被刪除

    TTL返回-2,表示這個key已經不存在了。如果返回-1,表示這個key永遠不會到期。如果設置一個key,它的TTL將被重置。

    SET resource:lock "Redis Demo 1"
    EXPIRE resource:lock 120
    TTL resource:lock => 119
    SET resource:lock "Redis Demo 2"
    TTL resource:lock => -1

    數據類型:list

    Redis還提供了集合復雜的數據結構,第一個我們要研究的是一個list。一個list就是一組有序的值。list特有的命令中,最重要的幾個是RPUSH、LPUSH、LLEN、LRANGE、LPOP、RPOP。

    RPUSH在list的尾部放一個新的value。

    RPUSH friends "Alice"
    RPUSH friends "Bob"

    LPUSH在list的頭部放一個新的value。

    LPUSH friends "Sam"

    LRANGE返回list的一個子集,它的第一個參數是第一個元素的索引,第二個參數是最后一個元素的索引。負數表示從尾部開始的索引,比如-1表示最后一個。list的第一個元素的索引用0表示,所以0 -1將返回list所有的元素。

    LRANGE friends 0 -1 => 1) "Sam" 2) "Alice 3) "Bob"
    LRANGE friends 0 1 => 1) "Sam" 2) "Alice"
    LRANGE friends 1 2 => 1) "Alice" 2) "Bob"

    LLEN返回list的當前長度.

    LLEN friends => 3

    LPOP移除list的第一個元素并返回它。

    LPOP friends => "Sam"

    RPOP移除list的最后一個元素并返回它。

    RPOP friends => "Bob"

    現在,list中只有一個元素了。

    LLEN friends => 1
    LRANGE friends 0 -1 => 1) "Alice"

    數據類型:set

    下一個我們要研究的是set。set和list很像,唯一不同的兩點:set是無序的,而且每一個元素只能出現一次。相關的重要命令有SADD、SREM、SISMEMBER、SMEMBERS和SUNION。

    SADD添加指定的vlue到這個set。

    SADD superpowers "flight"
    SADD superpowers "x-ray vision"
    SADD superpowers "reflexes"

    SREM從set中移除指定的value。

    SREM superpowers "reflexes"

    SISMEMBER測試一個指定的value是否在set里。如果存在,返回1;否則返回0。

    SISMEMBER superpowers "flight" => 1
    SISMEMBER superpowers "reflexes" => 0

    SMEMBERS返回set中的所有的成員。

    SMEMBERS superpowers => 1) "flight" 2) "x-rey vision"

    SUNION聯合2或多個set,返回他們的并集。

    SADD birdpowers "pecking"
    SADD birdpowers "flight"
    SUNION superpowers birdpowers => 1) "pecking" 2) "x-ray vision" 3) "flight"

    數據類型:sorted set

    set是一個非常方便的數據類型,但是因為是無序的,所以有些情況下并不合適。所以Redis在1.2推出了sorted set。

    sorted set和set很像,不同的是它為每一個value關聯了一個score,這個score用來排序。

    ZADD hackers 1940 "Alian Kay"
    ZADD hackers 1906 "Grace Hopper"
    ZADD hackers 1953 "Richard Stallman"
    ZADD hackers 1965 "Yukihiro Matsumoto"
    ZADD hackers 1916 "Claude Shannon"
    ZADD hackers 1969 "Linus Torvalds"
    ZADD hackers 1957 "Sophie Wilson"
    ZADD hackers 1912 "Alan Turing"

    在上面的例子中,score是出生的年份,value是姓名。

    ZRANGE hackers 2 4 => 1) "Claude Shannon" 2) "Alan Kay" 3) "Richard Stallman"

    數據類型:hash

    接下來介紹hash類型。

    hash是一個映射結構,從字符串類型的域到字符串類型的value。所以很適合用來表示對象(比如用戶對象,含有一些域,像姓名、年齡等等):

    HSET user:1000 name "John Smith"
    HSET user:1000 email "join.smith@example.com"
    HSET user:1000 password "s3cret"

    獲取數據使用HGETALL命令:

    HGETALL user:1000

    可以同時設置多個域:

    HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"

    可以只讀取一個域:

    HGET user:1001 name => "Mary Jones"

    存儲在hash的域里的數字,也可以以原子的方式進行遞增。

    HSET user:1000 visits 10
    HINCRBY user:1000 visits 1 => 11
    HINCRBY user:1000 visits 10 => 21
    HDEL user:1000 visits
    HINCRBY user:1000 visits 1 => 1

    這里 有hash支持的所有命令。

    繼續

    Try Redis的用戶指南已經講完了,你可以盡情的使用這里提供的控制臺。

    通過下面的鏈接,繼續學習Redis相關的知識:

     

    來自:http://www.jianshu.com/p/8ab0a498005c

     

 本文由用戶 LuaAgosto 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!