因爲本身當前作的項目過程當中間接的利用到了Redis,對其產生了一點興趣,就買了本Redis入門指南(李子驊編著)看了下,雖然實際上這本書已經買了半年了,==,但最近仍是忽然痛定思痛決定把這本書好好看看而後寫個總結,這裏就先寫一點基礎的知識好了。html
提及Redis首先得提一下NoSQL數據庫,什麼是NoSQL?查詢wiki能夠知道其定義:node
NoSQL是對不一樣於傳統的關係數據庫的數據庫管理系統的統稱。
NoSQL的全名叫作Not Only SQL,與咱們經常使用的MySQL,Oracle等數據庫不一樣,它叫作非關係型數據庫,那麼問題來了,咱們爲何須要NoSQL呢?緣由能夠用四個H表示:linux
在咱們開發有大數據或高併發的網站時,每每關係型數據庫在這個時候的性能會顯得捉襟見肘,然而非關係型的數據庫在這個時候就能發揮其做用,好比咱們本文將會提到的Redis,其數據是存儲在內存當中,因爲內存的讀寫速度遠快於硬盤,所以其性能固然會具備明顯的優點。再者其簡單的存儲結構使得程序與其之間的交互十分簡單,高擴展性和可用性在此也可體現出來。所以其特色十分鮮明,即:redis
NoSQL數據庫的分類大體有四種:shell
咱們這裏介紹的Redis就是屬於其中的鍵值存儲這個分類的數據庫。數據庫
Redis是一個開源的、高性能的、基於鍵值對的緩存與操做系統,經過提供多種鍵值數據類型來適應不一樣場景下的緩存與存儲需求。同時Redis的諸多高層級功能使其能夠勝任消息隊列、任務隊列等不一樣的角色。
Redis是REmote DIctionary Server(遠程字典服務器)的縮寫,它以字典結構存儲數據,並容許其餘應用經過TCP協議讀寫字典中的內容。目前爲止Redis支持的鍵值數據類型以下:編程
後文中咱們會詳細介紹這些數據類型的基本使用方法。centos
本人使用的是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中最基本的數據類型。一個字符串類型鍵容許存儲的數據的最大容量是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入門的基礎知識,但願能有所幫助。