# 3. Ruby 客戶端
#### 1. 介紹
[clients](http://redis.io/clients)這里列出了redis所支持的語言的所有客戶端程序,其中就有ruby的。有這么多的客戶端,說明要實現redis的客戶端是不難的。其實你只要掌握一種語言的socket編程就可以實現的,比如ruby中的socket編程,本站會有相關的章節來單獨介紹在ruby中是如何進行socket編程的。redis是基于tcp/ip的通訊協議,也就是說有監聽的ip地址和端口號,只要通過一種語言創建socket連接到redis的服務器中,然后發送數據給redis服務器,從redis服務器那得到響應數據再返回,這樣就能通訊了,也就是一個客戶端。在這一篇文章我們會介紹幾種ruby語言實現的redis客戶端程序,也要介紹涉及到的相關的redis的技術。
#### 2. redis-rb
[redis-rb](https://github.com/redis/redis-rb)是官方推薦的一個gem,它是線程安全的,支持管道,客戶端分片,且性能也比較好。
##### 2.1 安裝
首先來安裝它。
```
gem install redis
```
##### 2.2 基本的使用
使用的時候,第一步是連接數據庫,進入`irb`。
```
? ~ irb
> require "redis"
true
> redis = Redis.new
#<Redis client v3.2.1 for redis://127.0.0.1:6379/0>
```
這樣就生成了一個新的實例`redis`,`Redis.new`默認情況下是連接到本機(127.0.0.1),端口6379,也就是默認的端口,選擇的是第0個數據庫。
這樣的數據庫是什么意思呢?其實redis也是有數據庫的概念的,默認情況下redis會有16個數據庫,編號從0到15,當然這個數據庫的數量值是可以在配置文件中修改的。默認不指定數據庫的情況下,一般就是使用第0個數據庫。但是使用`SELECT`命令可以切換數據庫。數據庫相當于數據的隔離空間,只是用這個數據來標志隔離空間,就是沒有語義化,很難被記住。
比如我要連接另一臺機器上的redis服務器,可以這樣。
```
redis = Redis.new(:host => "10.0.1.1", :port => 6380, :db => 15)
```
現在連接好,我就可以發送請求的指令了。
```
> redis.set("mykey", "hello world")
"OK"
> redis.get("mykey")
"hello world"
```
你可以用`redis-cli`工具查看是不是真的有鍵為`mykey'的值啦。
在官方readme文檔中列出的只有get和set兩個方法。但是redis-rb支持所有常見的redis指令。這些方法在源碼的其中一個文件[lib/redis/distributed.rb](https://github.com/redis/redis-rb/blob/master/lib/redis/distributed.rb)可被發現到。比如:
```
> redis.set :count, 12
"OK"
> redis.incr :count
13
```
##### 2.3 Pipelining(管道)
管道是用于批量發送指令給redis服務器,當你需要發送很多的指令給redis服務器時,就可以用管道,畢竟你每條指令發送到服務器,再服務器回傳響應,都是需要時間的,而把所有指令合成一個管道一起發送,這樣就能大大地減少時間。比如:
```
redis.pipelined do
redis.set "foo", "bar"
redis.incr "baz"
end
```
關于管道的更多的詳細內容可以看官方文檔的這篇文章[pipelining](http://redis.io/topics/pipelining)。
除此之外,值得提的是[redis-rails](https://github.com/redis-store/redis-rails)和[redis-rack-cache](https://github.com/redis-store/redis-rack-cache)等gem都是基于redis-rb來實現的。
#### 3. redic
[redic](https://github.com/amakawa/redic)是一個輕量級的客戶端,它是對[hiredis](https://github.com/redis/hiredis-rb)這個gem的封裝。而hiredis這個gem是redis的c客戶端[hiredis](https://github.com/redis/hiredis)的ruby實現,它不像`redis-rb`可能是通過socket連接到redis服務器的,它是能過C語言頭文件連接的,它是輕量級的,速度快,性能高。
要使用也是很簡單。
```
redis = Redic.new
redis.call("SET", "foo", "bar")
```
`redis = Redic.new`是連接到redis服務器,之后通過call命令調用redis的api。
它不像redis-rb那樣,封裝了很多能夠像操作redis那樣的方法,比如"expire"、"ttl"、"flushdb"等。
redic都是通過call這個指令來調用api的,比如
```
redis.call("SUBSCRIBE", "foo")
```
還有,[readthis](https://github.com/sorentwo/readthis)和[ost](https://github.com/soveran/ost)等gem都是基于redic實現的。
完結。