Redis入門基礎

因爲本身當前作的項目過程當中間接的利用到了Redis,對其產生了一點興趣,就買了本Redis入門指南(李子驊編著)看了下,雖然實際上這本書已經買了半年了,==,但最近仍是忽然痛定思痛決定把這本書好好看看而後寫個總結,這裏就先寫一點基礎的知識好了。html

  • NoSQL簡介
  • Redis相關介紹
  • Redis的安裝
  • Redis數據類型

NoSQL簡介

提及Redis首先得提一下NoSQL數據庫,什麼是NoSQL?查詢wiki能夠知道其定義:node

NoSQL是對不一樣於傳統的關係數據庫的數據庫管理系統的統稱。

NoSQL的全名叫作Not Only SQL,與咱們經常使用的MySQL,Oracle等數據庫不一樣,它叫作非關係型數據庫,那麼問題來了,咱們爲何須要NoSQL呢?緣由能夠用四個H表示:linux

  • High performance -- 高併發讀寫
  • Huge Storage --海量數據的高效率存儲和訪問
  • High Scalability && High Availability --高擴展性和高可用性

在咱們開發有大數據或高併發的網站時,每每關係型數據庫在這個時候的性能會顯得捉襟見肘,然而非關係型的數據庫在這個時候就能發揮其做用,好比咱們本文將會提到的Redis,其數據是存儲在內存當中,因爲內存的讀寫速度遠快於硬盤,所以其性能固然會具備明顯的優點。再者其簡單的存儲結構使得程序與其之間的交互十分簡單,高擴展性和可用性在此也可體現出來。所以其特色十分鮮明,即:redis

  • 易擴展
  • 靈活的數據模型
  • 大數據量,高性能
  • 高可用

NoSQL數據庫的分類大體有四種:shell

  • 鍵值(key-value)存儲
  • 列存儲
  • 文檔數據庫
  • 圖形數據庫

咱們這裏介紹的Redis就是屬於其中的鍵值存儲這個分類的數據庫。數據庫

Redis相關介紹

Redis是一個開源的、高性能的、基於鍵值對的緩存與操做系統,經過提供多種鍵值數據類型來適應不一樣場景下的緩存與存儲需求。同時Redis的諸多高層級功能使其能夠勝任消息隊列、任務隊列等不一樣的角色。

Redis是REmote DIctionary Server(遠程字典服務器)的縮寫,它以字典結構存儲數據,並容許其餘應用經過TCP協議讀寫字典中的內容。目前爲止Redis支持的鍵值數據類型以下:編程

  • 字符串類型
  • 散列類型
  • 列表類型
  • 集合類型
  • 有序集合類型

後文中咱們會詳細介紹這些數據類型的基本使用方法。centos

Redis的安裝

本人使用的是centos7系統進行操做的,Redis兼容大部分POSIX系統,包括Linux和OS X等,安裝步驟以下:緩存

wget http://download.redis.io/redis-stable.tar.gz
    tar xzf redis-stable.tar.gz
    cd redis-stable
    make

Redis沒有其餘外部依賴,因此安裝過程很簡單,建議在實際運行前使用make test命令來測試Redis是否編譯正確,編譯後還能夠直接執行make install命令來將這些程序複製到/usr/local/bin目錄中以便之後執行程序時不用輸入完整的路徑。
本人以前有在一個Ubuntu系統上安裝過一次,執行make的時候報出以下錯誤:服務器

[root@node1 redis]# make
    cd src && make all
    make[1]: Entering directory `/usr/local/redis/src'
        CC adlist.o
    在包含自 adlist.c:34 的文件中:
    zmalloc.h:50:31: 錯誤:jemalloc/jemalloc.h:沒有那個文件或目錄
    zmalloc.h:55:2: 錯誤:#error "Newer version of jemalloc required"
    make[1]: *** [adlist.o] 錯誤 1
    make[1]: Leaving directory `/usr/local/redis/src'
    make: *** [all] 錯誤 2

這個問題能夠看一下readme裏面的一段話

Selecting a non-default memory allocator when building Redis is done by setting
the `MALLOC` environment variable. Redis is compiled and linked against libc
malloc by default, with the exception of jemalloc being the default on Linux
systems. This default was picked because jemalloc has proven to have fewer
fragmentation problems than libc malloc.

To force compiling against libc malloc, use:

    % make MALLOC=libc

To compile against jemalloc on Mac OS X systems, use:

    % make MALLOC=jemalloc

意思是關於分配器allocator, 若是有MALLOC 這個 環境變量, 會有用這個環境變量的 去創建Redis,並且libc 並非默認的分配器, 默認的是 jemalloc, 由於 jemalloc 被證實相對於libc有更少的 fragmentation problems。若是你又沒有jemalloc而只有libc就會make 出錯。因此加這麼一個參數,即執行:

make MALLOC=libc

再者後來執行make test的時候也頗有可能會報一個錯誤:

make[1]: *** [test] 錯誤 1
make[1]: Leaving directory `/usr/local/src/redis-stable/src'
make: *** [test] 錯誤 2

這個意思是說沒安裝tcl,去官網 http://www.linuxfromscratch.o... 上按照說明安裝便可。(其實我也不知道這玩意幹嗎的,照着官網把命令複製出來執行如下就行了==)

好了,至此,Redis就成功安裝了,接下來就是啓動它了,直接啓動的話運行redis-server便可,賊簡單:

$ redis-server
    3850:C 08 Sep 00:39:53.036 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    3850:C 08 Sep 00:39:53.036 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3850, just started
    ......
    3850:M 08 Sep 00:39:53.084 * DB loaded from disk: 0.033 seconds
    3850:M 08 Sep 00:39:53.084 * Ready to accept connections

Redis服務器默認端口號爲6379,固然你也能夠經過--port參數自定義端口號:

$redis-server --port 6380

咱們能夠經過PING命令來測試鏈接是否正常,鏈接正常會返回PONG:

$redis-cli PING
    PONG

中止Redis的命令是:

$redis-cli SHUTDOWN

Redis收到SHUTDOWN命令後,會先斷開全部客戶端連接,而後根據配置執行持久化,最後完成退出。
咱們這裏舉例幾個Redis常見的基礎命令:
得到符合規則的鍵名列表:KEYS pattern
判斷一個鍵是否存在,存在返回1,不然返回0: EXISTS key
刪除鍵,返回刪除的鍵的個數: DEL key [key ...]
得到鍵值的數據類型: TYPE key

Redis基本數據類型

字符串類型

字符串類型是Redis中最基本的數據類型。一個字符串類型鍵容許存儲的數據的最大容量是512MB。
命令:

賦值與取值:SET key value   GET key
遞增數字: INCR key  ------- 若key不存在,則賦值0再加1,decr同理
增長指定的整數: INCRBY key increment
減小指定的整數: DECR key (decrement)
增長指定浮點數: INCRBYFLOAT key increment
向尾部追加值: APPEND key value   -------key不存在會建立 返回字符串長度
獲取字符串長度: STRLEN key
同時得到/設置多個鍵值: MGET key [key…]  MSET key value [key value …]
位操做: 
    GETBIT key offset ---得到一個字符串類型鍵指定位置的二進制位的值(0或1)
    SET BIT key offset value --設置字符串類型鍵指定位置的二進制位的值,返回值是該位置的舊值。
    BITCOUNT key [start]  [end] ---得到字符串類型鍵中值是1的二進制位的個數
    BITOP operation destkey key [key …] ---對多個字符串類型鍵進行位運算,並將結果存儲在destkey參數指定的鍵中。

散列類型

散列(hash)的鍵值也是一種字典結構,其存儲了字段和字段值的映射,但字段值只支持字符串,不支持其餘數據類型。一個散列類型鍵能夠包含最多2^32-1個字段。
散列類型適合存儲對象:使用對象類別和ID構成鍵名,使用字段表示對象的屬性,而字段值則存儲屬性值。
命令:

賦值取值:
    HSET key field value
    HGET key field
    HMSET key field value [field value …]
    HGETALL key
判斷字段是否存在
    HEXISTS key field
當字段不存在時賦值
    HSETNX key field value
增長數字
    HINCREBY key field increment
刪除字段
    HDEL key field [field …]
只獲取字段名或字段值
    HKEYS key
    HVALS key
得到字段數量

HLEN key

列表類型

列表類型能夠存儲一個有序的字符串列表,經常使用的操做是向列表兩端添加元素,或者得到列表的某一個片斷。
列表類型內部是使用雙向鏈表實現的(經過索引訪問元素比較慢),因此向列表兩端添加元素的時間複雜度爲O(1),獲取越接近兩端的元素就越快。
一個列表類型鍵能夠包含至多2∧32-1個字段。
命令:
向列表兩端增長元素

LPUSH key value [value…]   ---- > 左邊增長,返回值表示增長元素後列表的長度     lpushx key value ------key必須存在
RPUSH key value [value…]         ---- > 右邊增長,返回值表示增長元素後列表的長度
rpushx key value -----key必須存在

從列表兩端彈出元素

LPOP key
RPOP key

獲取列表中元素的個數

LLEN key

得到列表片斷(包含兩端)

LRANGE key start stop

刪除列表中指定的值 返回實際刪除的元素個數

LREM key count value  count爲負則從後往前刪,若爲0則刪除全部對應value

得到/設置指定索引的元素值

LINDEX key index
LSET key index value

只保留列表指定片斷

LTRIM key start end

向列表中插入元素

LINSERT 能夠BEFORE|AFTER pivot value

將元素從一個列表轉到另外一個列表

REOPLPUSH source destination

集合類型

集中中的每一個元素都是不一樣的,且沒有順序,一個集合類型(set)鍵能夠存儲2∧32-1個字符串。
集中類型的經常使用操做是向集合中加入或刪除元素、判斷某個元素是否存在等。集合類型在Redis內部是用值爲空的散列表(hash table)實現的,因此這些操做的時間複雜度是O(1)。最方便的是多個集合類型鍵之間能夠進行並集、交集和差集運算。
命令:
增長/刪除元素

SADD key member [member …]
SREM key member [member …]

得到集合中的全部元素

SMEMBERS key

判斷元素是否在集合中

SISMEMBER key member

集合間運算

SDIFF key [key …] 多個集合執行差集運算 A-B
SINTER key [key …] 交集運算 A∩B
SUNION key [key …] 並集運算 A∪B

得到集合中元素個數

SCARD key

進行集合運算並將結果存儲

SDIFFSTORE destination key [key …]
SINTERSTORE destination key [key …]
SUNIONSTORE destination key [key …]

隨機得到集合中的元素

SRANDMEMBER key [count] count>0 count個不重複元素 count<0 |count|個有可能相同的元素

從集合中彈出一個元素
SPOP key

有序集合類型

有序集合(sorted set)在集合類型的基礎上爲集合中的每一個元素都關聯了一個分數。
有序集合類型和列表類型類似點:

• 兩者都是有序的;
• 兩者均可以得到某一範圍的元素;

區別:

• 列表類型是經過鏈表實現的,獲取靠近兩端的數據速度極快,而當元素增多後,訪問中間數據的速度會較慢,因此它更加適合實現如「新鮮事」或「日誌」這樣不多訪問中間元素的應用;
• 有序集合類型是使用散列表和跳躍表實現的,因此即便讀取位於中間的數據速度也是很快,時間複雜度O(log(N));
• 列表中不能簡單的調整某個元素的位置,可是有序集合能夠(更改這個元素的分數);

有序集合要比列表類型更耗費內存;
命令:
增長元素

ZADD key score member [score member …] (也可用於修改)

得到元素的分數

ZSCORE key member

得到排名在某個範圍的元素列表

ZRANGE key start stop [WITHSCORES] --按照元素分數從小到大的順序返回從start到stop之間的全部元素。負數表明從後向前;加上WITHSCORES返回據格式編程元素1,分數1,元素2,分數2.。。;時間複雜度O(log n+m)(n爲有序集合的基數,m爲返回的元素個數)
ZREVRANGE key start stop [WITHSCORES] 從大到小

得到指定分數範圍的元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

增長某個元素的分數

ZINCREBY key increment member

得到集合中元素的數量

ZCARD key

得到指定分數範圍內的元素個數

ZOUNT key min max

刪除一個或多個元素

ZREM key member [member…]

按照排名範圍刪除元素

ZREMRANGEBYRANK key start stop

按照分數範圍刪除元素

ZREMRANGEBYSCORE key min max

得到元素的排名

ZRANK key member 從小到大
ZREVRANK key member 從大到小

計算有序集合的交集

ZINTERSTORE destination numkeys key [key…] [WEIGHT weight [weight …]] [AGGREGATE SUM|MIN|MAX]
計算多個有序集合的交集並將結果存儲在destination鍵中(一樣以有序集合類型存儲)

以上,爲Redis入門的基礎知識,但願能有所幫助。

相關文章
相關標籤/搜索