【原創】NOSQL系列-Redis精簡版安裝與Ruby測試

leonarding發表於2013-01-13
         簡介:Redis是一個NOSQL資料庫,它是一款key-values儲存型資料庫,也叫“memcached改進版”,它不同與memcached最大特點是它由記憶體+硬碟來儲存資料的,它支援儲存的values型別很多,包括string字串、list連結串列、set集合、zset有序集合、雜湊表等。這些資料型別都支援push/popadd/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。Redis支援不同方式的排序,與memcached一樣,資料都是快取在記憶體中的,但會定期把更新的資料寫入硬碟,在此基礎上實現了master-slave主從同步。Redis還提供了廣泛的開發語言客戶端,rubyperljavacc++PHPscalaclojurenode.jsobjective-C

一、實驗環境

1.系統型別

[leo@h4 etc]$ cat issue

CentOS Linux release 6.0 (Final)

Kernel \r on an \m

2.系統位數

[leo@h4 桌面]$ getconf LONG_

32

Linux ISOCentOS-6.0-i386-bin-DVD.iso 32

JDK version"1.6.0_25-ea"

虛擬機器:Product VMware® Workstation Version 7.0.0 build-203739

3.CentOS需要能連入網路,這個比較簡單,可以參考《》,這篇文章在一開始就介紹了虛擬機器如何連線上網

4.Redis版本:redis.i386 0:2.4.10-1.el5

5.EPLE版本:

6.Ruby 版本:ruby-1.9.2-p180


二、Redis 安裝與配置

1.我們使用yum方式安裝redis資料庫

[root@h4 ~]# ping 202.99.96.68                測試一下,現在我們可以連線到外網

PING 202.99.96.68 (202.99.96.68) 56(84) bytes of data.

64 bytes from 202.99.96.68: icmp_seq=1 ttl=245 time=4.14 ms

64 bytes from 202.99.96.68: icmp_seq=2 ttl=245 time=4.44 ms

64 bytes from 202.99.96.68: icmp_seq=3 ttl=245 time=4.12 ms

64 bytes from 202.99.96.68: icmp_seq=4 ttl=245 time=5.60 ms

注:如果是新啟動的VMware系統,有可能會連不上網,沒關係,我們重啟下network服務即可恢復

[root@h4 ~]# service network restart

[root@h4 ~]# yum install redis

Loaded plugins: fastestmirror, refresh-packagekit

Loading mirror speeds from cached hostfile

* base: mirrors.neusoft.edu.cn

* extras: mirrors.neusoft.edu.cn

* updates: mirrors.neusoft.edu.cn

base                     | 3.7 kB     00:00     

extras                    | 3.5 kB     00:00     

updates                  | 3.5 kB     00:00     

updates/primary_db        | 4.3 MB     00:26     

Setting up Install Process

No package redis available.                 沒有可用的redis

Error: Nothing to do

CentOSRedHat企業版(收費)編譯過來的社群版(免費),去掉了所有關於版權問題的東西。如果我們想使用收費版yum源(軟體包齊全),我們就需要安裝EPEL(Extra Packages for Enterprise Linux )即企業版Linux的擴充套件包,EPLE提供了很多RedhatCentos共用的元件,安裝完這個以後基本常用的rpm包都可以找到了^_^

32位系統選擇:(我是32位)

[root@h4 ~]# rpm -ivh

Retrieving

warning: /var/tmp/rpm-tmp.UX54fR: Header V3 DSA/SHA1 Signature, key ID 217521f6: NOKEY

Preparing...                ########################################### [100%]

   1:epel-release           ########################################### [100%]

64位系統選擇:

rpm -ivh

近水樓臺先得月可參考  感謝zhaoyg 童鞋,它是64

下面我們再次安裝redis -> yum install redis

[root@h4 ~]# yum install redis

Loaded plugins: fastestmirror, refresh-packagekit

Loading mirror speeds from cached hostfile

* base: mirrors.neusoft.edu.cn

* epel: mirrors.neusoft.edu.cn

* extras: mirrors.neusoft.edu.cn

* updates: mirrors.neusoft.edu.cn

epel                               | 3.7 kB     00:00     

epel/primary_db                     | 3.1 MB     00:15     

Setting up Install Process

Resolving Dependencies

--&gt Running transaction check

---&gt Package redis.i386 0:2.4.10-1.el5 set to be updated

--&gt Finished Dependency Resolution

Dependencies Resolved

=======================================================================================

Package      Arch      Version          Repository                            Size

=======================================================================================

Installing:

redis        i386      2.4.10-1.el5        epel                                      299 k

Transaction Summary

=======================================================================================

Install       1 Package(s)

Upgrade       0 Package(s)

Total download size: 299 k

Installed size: 646 k

Is this ok [y/N]:y                 是否安裝redis yes

Downloading Packages:

redis-2.4.10-1.el5.i386.rpm                                                                                                                     warning: rpmts_HdrFromFdno: Header V4 DSA/SHA1 Signature, key ID 217521f6: NOKEY   | 299 kB     00:01

epel/gpgkey                                                                                                                                  Importing GPG key 0x217521F6 "Fedora EPEL <>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL    | 3.3 kB     00:00 ...     是否匯入金鑰

Is this ok [y/N]: y

Running rpm_check_debug

Running Transaction Test

Transaction Test Succeeded

Running Transaction

Warning: RPMDB altered outside of yum.                              警告已經修改了yum

Installing:redis-2.4.10-1.el5.i386                                                     1/1

Installed:

  redis.i386 0:2.4.10-1.el5                                                                                                                                            

Complete!                       到此redis軟體安裝完畢,下面我們開始配置

配置redis

2.找一找redis安裝到哪些目錄中了

[root@h4 ~]# find / -name "redis*"

/var/lib/redis

/var/run/redis

/var/log/redis

/usr/bin/redis-cli

/usr/bin/redis-check-dump

/usr/bin/redis-check-aof

/usr/bin/redis-benchmark

/usr/sbin/redis-server                      redis伺服器主程式

/usr/share/gimp/2.0/patterns/redishstuff.pat

/usr/share/doc/redis-2.4.10

/etc/logrotate.d/redis

/etc/redis.conf                            redis配置檔案,啟動引數都在這裡配置

/etc/rc.d/init.d/redis                       redis開機啟動服務

3.設定redis引數檔案/etc/redis.conf

[root@h4 ~]# vim /etc/redis.conf

daemonize yes                   啟動redis後要不要後臺執行

port 6379                       redis服務預設埠號,如果啟動多個服務埠號要設定不同

bind 127.0.0.1                   繫結ip地址

timeout 0                       telnet連線服務過期時間,0 代表關閉這項功能

loglevel notice                   日誌級別

SNAPSHOTTING                  快照設定

4.啟動redis服務

[root@h4 ~]# redis-server /etc/redis.conf       按照此配置檔案的引數設定啟動服務

5.驗證啟動是否成功

[root@h4 ~]# pstree                        索引樹方式檢視

├─redis-server───2*[{redis-server}]       啟動一個redis服務,包含2個執行緒

[root@h4 ~]# ps aux | grep redis              程式列表方式檢視

root     18787  0.0  0.2  31280  1080 ?        Ssl  15:42   0:00 redis-server /etc/redis.conf

這還是啟動命令

6.使用telnet簡單測試

我們知道redismemcached的改進版,那麼命令語法也是大同小異

[root@h4 ~]# telnet localhost 6379

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

set leonarding 8            輸入key-value key=leonarding   value=8

+OK

get leonarding             輸出key-value

$1                       $1: 字串型別,1個字元長度

8                        顯示value

set liu sheng               輸入key-value key=liu   value=sheng

+OK

get liu                    輸出key-value

$5                       $5: 字串型別,5個字元長度

Sheng                    顯示value

測試連結串列

lpush 11 22                定義第一個連結串列lpush表頭新增結點(左邊新增) key=11  value=22

:1

lpush 33 44                定義第二個連結串列 key=33  value=44

:1

rpush 55 66                定義第三個連結串列rpush表尾新增結點(右邊新增)key=55  value=66

:1

lrange 11 0 -1               顯示第一個連結串列,0  -1 表示從頭到尾顯示連結串列

*1

$2

22

lrange 33 0 -1               顯示第二個連結串列,*1 表示連結串列中有1個結點

*1

$2                         $2字串型別,2個字元長度

44

lrange 55 0 -1               顯示第三個連結串列,說明連結串列是基於key為單位組成的

*1

$2

66

del 33                      刪除連結串列33

:1

del 55                      刪除連結串列55

:1

del 11                      刪除連結串列11

:1

quit                       退出redis

+OK

Connection closed by foreign host.


三、Ruby連線Redis資料庫測試

1.下載ruby程式包

[root@h4 ~]# rpm -qa | grep ruby

由於我沒有安裝過ruby語言程式,所以什麼都沒有顯示

[root@h4 ~]# mkdir ruby       先建立一個ruby目錄用來存放ruby安裝程式包

[root@h4 ~]# cd ruby         進入目錄

首先要安裝ruby軟體包

Ruby版本:

99% [========================================> ] 11,154,815  26.9K/s eta(英國中部時

100%[===============================================>] 11,158,935  27.5K/s   

當進度條走到100%ruby程式完成下載

[root@h4 ruby]# chmod 777 ruby-1.9.2-p180.tar.gz      授予777許可權

[root@h4 ruby]# ll

rwxrwxrwx. 1 root root 11158935  2  18  2011 ruby-1.9.2-p180.tar.gz

2.解壓ruby程式包

[root@h4 ruby]# tar -zxvf ruby-1.9.2-p180.tar.gz

[root@h4 ruby]# cd ruby-1.9.2-p180                     進入ruby程式包目錄

3.執行config檔案

[root@h4 ruby-1.9.2-p180]# ./configure             執行ruby配置檔案

checking build system type... i686-pc-linux-gnu

checking host system type... i686-pc-linux-gnu 。。。。。。檢查系統型別

config.status: creating Makefile                    建立Makefile

4.編譯ruby並把編譯好的結果進行安裝

[root@h4 ruby-1.9.2-p180]# make                  編譯原始檔,需要等待10分鐘

gcc -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -I. -I.ext/include/i686-linux -I./include -I. -DRUBY_EXPORT   -o dmyversion.o -c dmyversion

[root@h4 ruby-1.9.2-p180]# make install             把編譯好的結果進行安裝

./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb  ./tool/generic_erb.rb -c -o encdb.h ./template/encdb.h.tmpl ./enc enc

encdb.h unchanged

make -f enc.mk RUBY="./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb " MINIRUBY="./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb "  srcs

make[1]: Entering directory `/root/ruby/ruby-1.9.2-p180'

5.找一找ruby安裝到哪些目錄下

[root@h4 ruby-1.9.2-p180]# find / -name ruby

/root/ruby

/root/ruby/ruby-1.9.2-p180/ruby

/root/ruby/ruby-1.9.2-p180/test/ruby

/root/ruby/ruby-1.9.2-p180/include/ruby

/root/ruby/ruby-1.9.2-p180/.ext/include/ruby

/root/ruby/ruby-1.9.2-p180/.ext/include/i686-linux/ruby

/home/grid/hbase-0.90.5/lib/ruby

/home/grid/hbase-0.90.5/src/test/ruby

/home/grid/hbase-0.90.5/src/main/ruby

/usr/local/include/ruby-1.9.1/ruby

/usr/local/include/ruby-1.9.1/i686-linux/ruby

/usr/local/lib/ruby

/usr/local/bin/ruby

/usr/local/share/doc/ruby

/usr/share/swig/1.3.40/ruby

6.設定/etc/profile環境變數,對全域性有效

export PATH=/usr/java/jdk1.6.0_25/bin:/usr/local/bin:/sbin:$PATH        新增紅色字串

[root@h4 bin]$ ruby                   到此ruby程式已經安裝到系統中可以執行ruby指令碼

ruby: Interrupt

-:1: syntax error, unexpected ':', expecting $end

ruby: Interrupt

     ^

7.安裝rubygems元件(透過這個元件安裝redis-rb程式庫)

[root@h4 ruby-1.9.2-p180]# yum install rubygems

Loaded plugins: fastestmirror, refresh-packagekit

Loading mirror speeds from cached hostfile

* base: mirrors.grandcloud.cn

* epel: mirrors.ustc.edu.cn

* extras: mirrors.grandcloud.cn

* updates: mirrors.grandcloud.cn

epel                                                                                                                                            | 3.7 kB     00:00     

Setting up Install Process

Resolving Dependencies

--&gt Running transaction check

---&gt Package rubygems.noarch 0:1.3.7-1.el6 set to be updated

--&gt Processing Dependency: ruby(abi) = 1.8 for package: rubygems-1.3.7-1.el6.noarch

--&gt Processing Dependency: ruby-rdoc for package: rubygems-1.3.7-1.el6.noarch

--&gt Processing Dependency: /usr/bin/ruby for package: rubygems-1.3.7-1.el6.noarch

--&gt Running transaction check

---&gt Package ruby.i686 0:1.8.7.352-7.el6_2 set to be updated

---&gt Package ruby-libs.i686 0:1.8.7.352-7.el6_2 set to be updated

--&gt Processing Dependency: libreadline.so.5 for package: ruby-libs-1.8.7.352-7.el6_2.i686

---&gt Package ruby-rdoc.i686 0:1.8.7.352-7.el6_2 set to be updated

--&gt Processing Dependency: ruby-irb = 1.8.7.352-7.el6_2 for package: ruby-rdoc-1.8.7.352-7.el6_2.i686

--&gt Running transaction check

---&gt Package compat-readline5.i686 0:5.2-17.1.el6 set to be updated

---&gt Package ruby-irb.i686 0:1.8.7.352-7.el6_2 set to be updated

--&gt Finished Dependency Resolution

Is this ok [y/N]: y

Total                                                                                                                                  211 kB/s | 3.2 MB     00:15     

Running rpm_check_debug

Running Transaction Test

Transaction Test Succeeded

Running Transaction

  Installing     : compat-readline5-5.2-17.1.el6.i686                                                                                                              1/6

  Installing     : ruby-libs-1.8.7.352-7.el6_2.i686                                                                                                                2/6

  Installing     : ruby-1.8.7.352-7.el6_2.i686                                                                                                                     3/6

  Installing     : ruby-irb-1.8.7.352-7.el6_2.i686                                                                                                                 4/6

  Installing     : ruby-rdoc-1.8.7.352-7.el6_2.i686                                                                                                                5/6

  Installing     : rubygems-1.3.7-1.el6.noarch                                                                                                                     6/6

Installed:

  rubygems.noarch 0:1.3.7-1.el6                                                                                                                                       

Dependency Installed:

  compat-readline5.i686 0:5.2-17.1.el6        ruby.i686 0:1.8.7.352-7.el6_2        ruby-irb.i686 0:1.8.7.352-7.el6_2        ruby-libs.i686 0:1.8.7.352-7.el6_2      

  ruby-rdoc.i686 0:1.8.7.352-7.el6_2         

Complete!

如果遇上如下報錯請參考下面解決方案

[root@h4 ruby-1.9.2-p180]# gem install redis

ERROR:  Loading command: install (LoadError)

    no such file to load – zlib                       原因是gem執行缺少zlib庫支援

ERROR:  While executing gem ... (NameError)

    uninitialized constant Gem::Commands::InstallCommand

解決方案

[root@h4 ruby-1.9.2-p180]# yum -y install gcc   

Loaded plugins: fastestmirror, refresh-packagekit

Loading mirror speeds from cached hostfile

由於安裝系統的時候沒有裝c編譯器 導致很多原始碼安裝的程式無法編譯 所以需要在linux上裝c編譯器,必須按順序安裝否則安裝不會成功

[root@h4 ruby-1.9.2-p180]# yum install zlib-devel       安裝zlib-devel

Loaded plugins: fastestmirror, refresh-packagekit

Loading mirror speeds from cached hostfile

[root@h4 ruby-1.9.2-p180]# cd ext/zlib/               進入這個目錄

[root@h4 zlib]# ruby extconf.rb                      執行這條命令

checking for deflateReset() in -lz... yes

checking for zlib.h... yes

checking for kind of operating system... Unix

checking for crc32_combine() in zlib.h... yes

checking for adler32_combine() in zlib.h... yes

creating Makefile

[root@h4 zlib]# make && make install                 編譯並安裝

gcc -I. -I/usr/local/include/ruby-1.9.1/i686-linux -I/usr/local/include/ruby-1.9.1/ruby/backward -I/usr/local/include/ruby-1.9.1 -I. -DHAVE_ZLIB_H  -DOS_CODE=OS_UNIX -DHAVE_CRC32_COMBINE -DHAVE_ADLER32_COMBINE  -D_FILE_OFFSET_BITS=64  -fPIC -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long  -o zlib.o -c zlib.c

gcc -shared -o zlib.so zlib.o -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L.  -rdynamic -Wl,-export-dynamic   -lz  -lpthread -lrt -ldl -lcrypt -lm   -lc

/usr/bin/install -c -m 0755 zlib.so /usr/local/lib/ruby/site_ruby/1.9.1/i686-linux

[root@h4 zlib]# gem list

*** LOCAL GEMS ***

minitest (1.6.0)

rake (0.8.7)

rdoc (2.5.8)

到此我們已經解決了“gem執行缺少zlib庫”問題,現在我們可以正常gem install redis

8.安裝redis-rb程式庫,因為只有安裝了此程式庫ruby才能正常訪問redis資料庫

[root@h4 zlib]# gem install redis

Successfully installed redis-3.0.1

1 gem installed

Installing ri documentation for redis-3.0.1...

Installing RDoc documentation for redis-3.0.1...

[root@h4 zlib]#

感謝天感謝地,我們終於安裝上了redis-rb,經歷了多少個日夜,經歷了多少個困苦,查閱了多少資料,當我們迎來成功之時,一切都是值得的,臺上10分鐘 臺下十年功

9.編寫ruby指令碼訪問redis資料庫

[root@h4 ruby]# vim leonarding_redisrb1.rb      編寫ruby指令碼,建立連結串列

require 'rubygems'                           引用程式庫

require 'redis'

redis=Redis.new                             開啟兩個終端程式訪問redis資料庫

redis2=Redis.new

hoge = "leonarding";               設定keyhoge leonarding

redis.lpush(hoge,3)                建立連結串列,在表頭新增三個結點

redis.lpush(hoge,2)                value 3 2 1 4

redis.lpush(hoge,1)

redis.rpush(hoge,4)                          在表尾新增一個結點

p redis.lrange(hoge,0,-1)                      從頭到尾顯示連結串列

[root@h4 ruby]# ruby leonarding_redisrb1.rb     執行ruby指令碼

/usr/local/lib/ruby/gems/1.9.1/gems/redis-3.0.1/lib/redis/client.rb:79:in `call': ERR Operation against a key holding the wrong kind of value (Redis::CommandError)

       from /usr/local/lib/ruby/gems/1.9.1/gems/redis-3.0.1/lib/redis.rb:859:in `block in lpush'

       from /usr/local/lib/ruby/gems/1.9.1/gems/redis-3.0.1/lib/redis.rb:36:in `block in synchronize'

       from /usr/local/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'

       from /usr/local/lib/ruby/gems/1.9.1/gems/redis-3.0.1/lib/redis.rb:36:in `synchronize'

       from /usr/local/lib/ruby/gems/1.9.1/gems/redis-3.0.1/lib/redis.rb:858:in `lpush'

       from leonarding_redisrb1.rb:7:in `

'

報錯這是為什麼呢,想起來了,不同的ruby版本語法不同,我們來修改一下

Ruby 版本:ruby-1.9.2-p180

#############################################################################

新版leonarding_redisrb1.rb

[root@h4 ruby]# vim leonarding_redisrb1.rb

require 'rubygems'

require 'redis'

redis=Redis.new

redis2=Redis.new

hoge = "leonarding";

redis.lpush:hoge,3

redis.lpush:hoge,2

redis.lpush:hoge,1

redis.rpush:hoge,4

p redis.lrange:hoge,0,-1

執行ruby指令碼

[root@h4 ruby]# ruby leonarding_redisrb1.rb

["1", "2", "3", "4"]

[root@h4 ruby]# ruby leonarding_redisrb1.rb

["1", "2", "3", "1", "2", "3", "4", "4"]

[root@h4 ruby]# ruby leonarding_redisrb1.rb

["1", "2", "3", "1", "2", "3", "1", "2", "3", "4", "4", "4"]

value=4始終從表尾新增,符合題意

#################################################################################

我們在編寫一個ruby指令碼,測試不同終端是否可以訪問同一個資料庫

[root@h4 ruby]# vim leonarding_redisrb2.rb

require 'rubygems'

require 'redis'

redis=Redis.new

redis2=Redis.new            開啟2個終端程式訪問redis資料庫

hoge = "leonarding";

redis.lpush:hoge,3

redis.lpush:hoge,2

redis.lpush:hoge,1

redis.rpush:hoge,4

redis2.rpush:hoge,5

p redis.lrange:hoge,0,-1

使用redis2程式從表尾新增結點value=5,看看是不是能夠操作同一個連結串列,那就證明我們連線的是同一個redis資料庫,並且操作是具有原子性和一致性的

執行ruby指令碼

[root@h4 ruby]# ruby leonarding_redisrb2.rb

["1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "4", "4", "4", "4", "5"]

小結:Redis精簡版安裝與Ruby測試到此總結完畢,透過上面的實驗我們應該掌握如下內容

(1)redis簡要概念

(2)redis安裝與配置

(3)ruby程式和元件包安裝與故障診斷

(4) ruby連線Redis資料庫

心得:一步一腳印,不懂我們就問,思考與耐心,苦盡奕甘來



redis  ruby  gem  rubygems  redis-rb






2013.1.13
天津&winter
分享技術~成就夢想
Blog

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-752605/,如需轉載,請註明出處,否則將追究法律責任。

相關文章