【數據庫開發】Redis key-value內存數據庫介紹

Redis是一個開源的,先進的 key-value 存儲可用於構建高性能,可擴展的 Web 應用程序的解決方案。Redis官方網網站是:http://www.redis.io/,以下:
Redis快速入門
Redis 有三個主要使其有別於其它不少競爭對手的特色:
  • Redis是徹底在內存中保存數據的數據庫,使用磁盤只是爲了持久性目的; 
  • Redis相比許多鍵值數據存儲系統有相對豐富的數據類型; 
  • Redis能夠將數據複製到任意數量的從服務器中; 

Redis優勢

  • 異常快速 : Redis是很是快的,每秒能夠執行大約110000設置操做,81000個/每秒的讀取操做。css

  • 支持豐富的數據類型 : Redis支持最大多數開發人員已經知道如列表,集合,可排序集合,哈希等數據類型。html

    這使得在應用中很容易解決的各類問題,由於咱們知道哪些問題處理使用哪一種數據類型更好解決。
  • 操做都是原子的 : 全部 Redis 的操做都是原子,從而確保當兩個客戶同時訪問 Redis 服務器獲得的是更新後的值(最新值)。mysql

  • MultiUtility工具:Redis是一個多功能實用工具,能夠在不少如:緩存,消息傳遞隊列中使用(Redis原生支持發佈/訂閱),在應用程序中,如:Web應用程序會話,網站頁面點擊數等任何短暫的數據;

Redis環境

要在 Ubuntu 上安裝 Redis,打開終端,而後輸入如下命令:
$sudo apt-get update
$sudo apt-get install redis-server
這將在您的計算機上安裝Redis

啓動 Redisredis

$redis-server

查看 redis 是否還在運行算法

$redis-cli
這將打開一個 Redis 提示符,以下圖所示:
redis 127.0.0.1:6379>
在上面的提示信息中:127.0.0.1 是本機的IP地址,6379是 Redis 服務器運行的端口。如今輸入 PING 命令,以下圖所示:
redis 127.0.0.1:6379> ping
PONG
這說明如今你已經成功地在計算機上安裝了 Redis。

在Ubuntu上安裝Redis桌面管理器
要在Ubuntu 上安裝 Redis桌面管理,能夠從  http://redisdesktop.com/download 下載包並安裝它。
Redis 桌面管理器會給你用戶界面來管理 Redis 鍵和數據。

Redis數據類型

Redis 支持5種數據類型,說明以下:

字符串

Redis 字符串是一個字節序列。在 Redis 中字符串是二進制安全的,這意味着它們沒有任何特殊終端字符來肯定長度,因此能夠存儲任何長度爲 512 兆的字符串。

示例

redis 127.0.0.1:6379> SET name "yiibai"
OK
redis 127.0.0.1:6379> GET name
"yiibai"
在上面的例子中,SET 和 GET 是 Redis 命令,name 和 "yiibai" 是存儲在 Redis 的鍵和字符串值。

哈希

Redis哈希是鍵值對的集合。 Redis哈希是字符串字段和字符串值之間的映射,因此它們用來表示對象。

示例

redis 127.0.0.1:6379> HMSET user:1 username yiibai password yiibai points 200
OK
redis 127.0.0.1:6379> HGETALL user:1

1) "username"
2) "yiibai"
3) "password"
4) "yiibai"
5) "points"
6) "200"
在上面的例子中,哈希數據類型用於存儲包含用戶基本信息的用戶對象。這裏 HSET,HEXTALL 是 Redis 命令同時 user:1 也是一個鍵。

列表

Redis 列表是簡單的字符串列表,經過插入順序排序。能夠添加一個元素到 Redis 列表的頭部或尾部。

示例

redis 127.0.0.1:6379> lpush tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> lpush tutoriallist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush tutoriallist rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange tutoriallist 0 10

1) "rabitmq"
2) "mongodb"
3) "redis"
列表的最大長度爲   2 32  - 1 個元素(4294967295,每一個列表的元素超過四十億)。

集合

Redis 集合是字符串的無序集合。在 Redis 能夠添加,刪除和測試成員存在的時間複雜度爲 O(1)。

示例

redis 127.0.0.1:6379> sadd tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist mongodb
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers tutoriallist

1) "rabitmq"
2) "mongodb"
3) "redis"
注:在上面的例子中 rabitmq 被添加兩次,但因爲它是隻集合具備惟一特性。集合中的成員最大數量爲  2 32  - 1(4294967295,每一個集合有超過四十億條記錄)。

集合排序

不一樣的是,一個有序集合的每一個成員均可以排序,就是爲了按有序集合排序獲取它們,按權重分值從最小到最大排序。雖然成員都是獨一無二的,按權重分數值可能會重複。

示例

redis 127.0.0.1:6379> zadd tutoriallist 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000

1) "redis"
2) "mongodb"
3) "rabitmq"

Redis鍵

Redis 中的 keys 命令用於管理 redis 中的鍵。Redis keys命令使用的語法以下所示:

語法

redis 127.0.0.1:6379> COMMAND KEY_NAME

示例

redis 127.0.0.1:6379> SET yiibai redis
OK
redis 127.0.0.1:6379> DEL yiibai
(integer) 1
在上面的例子中 DEL 是一個命令,而 yiibai 是一個鍵。若是鍵被成功刪除,則該命令的輸出將是(整數)1,不然這將是(整數)0;

Redis字符串

Redis 的字符串命令用於管理 redis 的字符串值。Redis 的字符串命令語法的使用以下所示:

語法

redis 127.0.0.1:6379> COMMAND KEY_NAME

示例

redis 127.0.0.1:6379> SET yiibai redis
OK
redis 127.0.0.1:6379> GET yiibai
"redis"
在上面示例中 SET 和 GET 是 Redis 的命令,這裏 yiibai 就是一個鍵(key);

Redis哈希

Redis哈希是字符串字段和字符串值之間的映射,因此它是用來表示對象的一個完美的數據類型,Redis 的哈希值最多可存儲超過4十億字段-值對。

示例

redis 127.0.0.1:6379> HMSET yiibai name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
redis 127.0.0.1:6379> HGETALL yiibai

1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
在上面的例子,咱們在設置一個名爲 yiibai Redis的哈希的教程詳細信息(name, description, likes, visitors)。

Redis列表

Redis列表是簡單的字符串列表,經過插入順序排序。您能夠在Redis 列表的頭或列表尾添加元素。列表的最大長度爲    2 32  - 1 個元素(4294967295,每一個列表可有超過四十億個元素)。

示例

redis 127.0.0.1:6379> LPUSH tutorials redis
(integer) 1
redis 127.0.0.1:6379> LPUSH tutorials mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH tutorials mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE tutorials 0 10

1) "mysql"
2) "mongodb"
3) "redis"
在上面的例子中的三個值由命令LPUSH 插入到 redis 名稱爲 tutorials 的列表。

Redis集合

Redis集合是惟一字符串的無序集合。惟一集合是不容許數據有重複的鍵的。在 Redis 集合中添加,刪除和測試成會是否存的時間複雜度爲O(1)(恆定的時間,不管集合內包含元素的數量)。集合的最大長度爲     2 32  - 1 個元素(4294967295,每一個集合中超過四十億個元素)。

示例

redis 127.0.0.1:6379> SADD yiibai redis
(integer) 1
redis 127.0.0.1:6379> SADD yiibai mongodb
(integer) 1
redis 127.0.0.1:6379> SADD yiibai mysql
(integer) 1
redis 127.0.0.1:6379> SADD yiibai mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS yiibai

1) "mysql"
2) "mongodb"
3) "redis"
在上面的例子中的三個值被 Redis 的命令SADD插入到一個名爲 yiibai 集合。

Redis有序集合

Redis的有序集合相似於 Redis 的集合,可是存儲的值在集合中具備惟一性。另外有序集合的每一個成員都使用分值(score)的東西,這個分值就是用於將有序集合排序,從分值最小到最大來排序。

在 Redis 有序集合添加,刪除和測試成員的存在的時間複雜度爲 O(1)(恆定時間,不管集合內包含元素的數量)。列表的最大長度爲 232 - 1 個元素(4294967295,每一個集合的元素超過四十億)。 sql

示例

redis 127.0.0.1:6379> ZADD yiibai 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD yiibai 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD yiibai 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD yiibai 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD yiibai 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE yiibai 0 10 WITHSCORES

1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
在上面的例子中的三個值及其分值被 ZADD 命令插入一個名稱爲 yiibai 的 redis 有序集合中

Redis HyperLogLog


Redis HyperLogLog 是用來作基數統計的算法,HyperLogLog 的優勢是,在輸入元素的數量或者體積很是很是大時,計算基數所需的空間老是固定 的、而且是很小的。mongodb

在 Redis 裏面,每一個 HyperLogLog 鍵只須要花費 12 KB 內存,就能夠計算接近 2^64 個不一樣元素的基 數。這和計算基數時,元素越多耗費內存就越多的集合造成鮮明對比。可是,由於 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素自己,因此 HyperLogLog 不能像集合那樣,返回輸入的各個元素。數據庫


示例

下面的例子說明了 HyperLogLog Redis 的工做原理:
redis 127.0.0.1:6379> PFADD tutorials "redis"

1) (integer) 1

redis 127.0.0.1:6379> PFADD tutorials "mongodb"

1) (integer) 1

redis 127.0.0.1:6379> PFADD tutorials "mysql"

1) (integer) 1

redis 127.0.0.1:6379> PFCOUNT tutorials

(integer) 3

Redis發佈訂閱

Redis訂閱和發佈實現了通信系統,發件人(在 Redis 中的術語稱爲發佈者)發送郵件,而接收器(訂戶)接收它們。信息傳輸的鏈路稱爲通道。Redis 一個客戶端能夠訂閱任意數量的通道。

示例

如下舉例說明發布訂閱用戶如何工做。在下面的例子給出一個客戶端訂閱的通道命名 redisChat 。
redis 127.0.0.1:6379> SUBSCRIBE redisChat

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
如今,兩個客戶端都在同一個通道名:redisChat 上發佈消息,上述訂閱客戶端接收消息。
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"

(integer) 1

redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by tutorials point"

(integer) 1


1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by tutorials point"

Redis事務

Redis事務容許一組命令在單一步驟中執行。事務有兩個屬性,說明以下:
  • 在一個事務中的全部命令做爲單個獨立的操做順序執行。在Redis事務中的執行過程當中而另外一客戶機發出的請求,這是不能夠的;
  • Redis事務是原子的。原子意味着要麼全部的命令都執行,要麼都不執行;

示例

Redis 事務由指令 MULTI 發起的,以後傳遞須要在事務中和整個事務中,最後由 EXEC 命令執行全部命令的列表。
redis 127.0.0.1:6379> MULTI
OK
List of commands here
redis 127.0.0.1:6379> EXEC

示例

下面的例子說明了 Redis 的事務是如何開始和執行。
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET tutorial redis
QUEUED
redis 127.0.0.1:6379> GET tutorial
QUEUED
redis 127.0.0.1:6379> INCR visitors
QUEUED
redis 127.0.0.1:6379> EXEC

1) OK
2) "redis"
3) (integer) 1

Redis腳本

Redis 腳本是使用Lua解釋腳本用來評估(計算)。從 Redis 2.6.0 版本開始內置這個解釋器。命令 EVAL 用於執行 腳本命令。

語法

EVAL命令的基本語法以下:
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

示例

下面的例子說明了 Redis 腳本是如何工做的:
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

1) "key1"
2) "key2"
3) "first"
4) "second"

Redis鏈接

Redis 的鏈接命令基本上都用於管理 Redis服務器與客戶端鏈接。

示例

下面的例子說明了一個客戶端在Redis服務器上,如何檢查服務器是否正在運行並驗證本身。
redis 127.0.0.1:6379> AUTH "password"
OK
redis 127.0.0.1:6379> PING
PONG

Redis備份

Redis的SAVE命令用於建立當前 Redis 數據庫的備份。

語法

Redis 的 SAVE 命令的基本語法以下所示:
127.0.0.1:6379> SAVE

示例

如下示例顯示瞭如何在Redis的當前數據庫中建立備份。
127.0.0.1:6379> SAVE

OK
在執行此命令以後,將在 redis 目錄中建立一個 dump.rdb 文件。

恢復 Redis 數據
要恢復 redis 數據只須要要將 Redis 的備份文件(dump.rdb)放到 Redis 的目錄中,並啓動服務器。要了解知道 Redis 目錄在什麼位置,可以使用 CONFIG 命令,以下所示:
127.0.0.1:6379> CONFIG get dir

1) "dir"
2) "/user/yiibai/redis-2.8.13/src"
在上面的命令命令輸出爲 /user/yiibai/redis-2.8.13/src 就是使用的 Redis 目錄,也就是 Redis 的服務器安裝的目錄。

Bgsave

建立 Redis 的備份也可使用備用命令 BGSAVE 。此命令將啓動備份過程,並在後臺運行此。

示例

127.0.0.1:6379> BGSAVE

Background saving started

Redis安全

Redis 數據庫能夠配置安全保護的,因此任何客戶端在鏈接執行命令時須要進行身份驗證。爲了確保 Redis 的安全,須要在配置文件設置密碼。

示例

下面給出的例子顯示的步驟是用來確保 Redis 實例的安全。
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""
默認狀況下此屬性是空的,這意味着此實例沒有設置密碼。能夠經過執行如下命令來修改設置此屬性
127.0.0.1:6379> CONFIG set requirepass "yiibaipass"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "yiibaipass"
若是客戶端運行命令無需驗證設置密碼,那麼(錯誤)NOAUTH 須要驗證。錯誤將返回。所以,客戶端須要使用 AUTH 命令來驗證本身的身份信息。

語法

AUTH命令的基本語法以下所示:
127.0.0.1:6379> AUTH password

Redis性能測試

Redis的基準性能測試是經過同時運行 N 個命令以檢查 Redis 性能的工具。

語法

Redis的基準測試的基本語法以下所示:
redis-benchmark [option] [option value]

示例

下面給出的示例是經過調用 100000 個(次)命令來檢查 Redis。
redis-benchmark -n 100000

PING_INLINE: 141043.72 requests per second
PING_BULK: 142857.14 requests per second
SET: 141442.72 requests per second
GET: 145348.83 requests per second
INCR: 137362.64 requests per second
LPUSH: 145348.83 requests per second
LPOP: 146198.83 requests per second
SADD: 146198.83 requests per second
SPOP: 149253.73 requests per second
LPUSH (needed to benchmark LRANGE): 148588.42 requests per second
LRANGE_100 (first 100 elements): 58411.21 requests per second
LRANGE_300 (first 300 elements): 21195.42 requests per second
LRANGE_500 (first 450 elements): 14539.11 requests per second
LRANGE_600 (first 600 elements): 10504.20 requests per second
MSET (10 keys): 93283.58 requests per second

Redis客戶端鏈接

若是啓用了Redis 的接受配置監聽,客戶端可在TCP端口上與Unix套接字鏈接。如下操做執行後新的客戶端鏈接被服務器接受:
  • 客戶端套接字在非阻塞狀態,由於 Redis 使用複用和非阻塞I/O;
  • TCP_NODELAY選項設定以確保不會在鏈接時延遲;
  • 建立一個可讀的文件事件,以便 Redis 可以儘快收集客戶端查詢做爲新的數據可被套接字讀取;

客戶端最大鏈接數量
在Redis的配置文件(redis.conf)有一個屬性 maxclients ,它描述了能夠鏈接到 Redis 的客戶的最大數量。命令的基本語法是:
config get maxclients

1) "maxclients"
2) "10000"
默認狀況下此屬性設置爲 10000(取決於OS的文件標識符限制最大數量),但能夠修改這個屬性。

示例

在下面給出的例子咱們已經設置客戶端最大鏈接數量爲 100000,在以後啓動服務器:
redis-server --maxclients 100000

Redis管道

Redis是一個TCP服務器,支持請求/響應協議。在 redis 中一個請求完成如下步驟:
  • 客戶端發送一個查詢給服務器,並從套接字中讀取,一般服務器的響應是在一個封閉的方式;
  • 服務器處理命令並將響應返回給客戶端;

管道的含義
管道的基本含義是:客戶端能夠發送多個請求給服務器,而不等待所有響應,最後在單個步驟中讀取全部響應。

示例

要檢查 Redis 管道只須要啓動 Redis 實例,並在終端輸入如下命令。
$(echo -en "PING\r\n SET tutorial redis\r\nGET tutorial\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379

+PONG
+OK
redis
:1
:2
:3
在上面的例子所示,瞭解使用 PING 命令鏈接 Redis,以後咱們在 Redis 設定一個名爲 tutorial 字符串值,以後拿到這個鍵對應的值並增長訪問人數的三倍。在結果中,咱們能夠看到全部的命令都提交給 Redis 一次,Redis是給單步輸出全部命令。

通道的好處
這種技術的好處是顯着提升協議的性能。管道localhost 得到至少達到百倍的網絡鏈接速度。

Redis分區

分區是將數據分割成多個 Redis 實例,使每一個實例將只包含鍵子集的過程。

分區的好處

  • 它容許更大的數據庫,使用多臺計算機的內存總和。若是不分區,只是一臺計算機有限的內存能夠支持的數據存儲;
  • 它容許按比例在多內核和多個計算機計算,以及網絡帶寬向多臺計算機和網絡適配器;

分區的劣勢
  • 涉及多個鍵的操做一般不支持。例如,若是它們被存儲在被映射到不一樣的 Redis 實例鍵,則不能在兩個集合之間執行交集;
  • 涉及多個鍵時,Redis事務沒法使用;
  • 分區粒度是一個鍵,因此它不可能使用一個鍵和一個很是大的有序集合分享一個數據集;
  • 當使用分區,數據處理比較複雜,好比要處理多個RDB/AOF文件,使數據備份須要從多個實例和主機彙集持久性文件;
  • 添加和刪除的容量可能會很複雜。例如:Redis的Cluster支持數據在運行時添加和刪除節點是透明平衡的,但其餘系統,如客戶端的分區和代理服務器不支持此功能

分區類型

Redis 提供有兩種類型的分區。假設咱們有四個 redis 實例:R0,R1,R2,R3,分別表示用戶用戶如:user:1, user:2, ...等等

範圍分區
範圍分區被映射對象指定 Redis 實例在一個範圍內完成。
在咱們的例子中,用戶從ID爲 0 至 ID10000 將進入實例 R0,而用戶 ID 10001到ID 20000 將進入實例 R1 等等。

散列分區
在這種類型的分區是一個散列函數(例如,模數函數)用於將鍵轉換爲數字數據,而後存儲在不一樣的 redis 實例。
相關文章
相關標籤/搜索