天天看點

編譯安裝Redis

一、Redis簡介

    Redis 是一個高性能的key-value資料庫。redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部分場合可以對關系資料庫起到很好的補充作用。它跟memcached類似,不過資料可以持久化,而且支援的資料類型很豐富。有字元串,連結清單,集合和有序集合。支援在伺服器端計算集合的并,交和補集(difference)等,還支援多種排序功能。是以Redis也可以被看成是一個資料結構伺服器。

    Redis的所有資料都是儲存在記憶體中,然後不定期的通過異步方式儲存到磁盤上(這稱為“半持久化模式”);也可以把每一次資料變化都寫入到一個append only file(aof)裡面(這稱為“全持久化模式”)。它提供Python,Ruby,Erlang,PHP用戶端,使用很友善。問題是這個項目還很新,可能還不足夠穩定,而且沒有在實際的一些大型系統應用的執行個體。此外,缺乏mc中批量get也是比較大的問題,始終批量擷取跟多次擷取的網絡開銷是不一樣的。

二、Redis的安裝

1、編譯安裝

1

2

3

4

5

6

<code># wget http://download.redis.io/releases/redis-2.8.17.tar.gz</code>

<code># tar xf redis-2.8.17.tar.gz </code>

<code># cd redis-2.8.17</code>

<code># make</code>

<code># make test </code>

<code># make install</code>

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<code>[root@Redis redis-2.8.17]# make test</code>

<code>cd src &amp;&amp; make test</code>

<code>make[1]: Entering directory `/root/redis/redis-2.8.17/src'</code>

<code>You need tcl 8.5 or newer in order to run the Redis test</code>

<code>make[1]: *** [test] 錯誤 1</code>

<code>make[1]: Leaving directory `/root/redis/redis-2.8.17/src'</code>

<code>make: *** [test] 錯誤 2</code>

<code>解決方法:</code>

<code>http:</code><code>//www.linuxfromscratch.org/blfs/view/cvs/general/tcl.html</code>

<code>////////////////////////沒有明白這個包為什麼會這麼安裝,那麼麻煩///////////////////////</code>

<code># tar xf tcl8.6.2-src.tar.gz </code>

<code># cd tcl8.6.2</code>

<code># export SRCDIR=`pwd` &amp;&amp;</code>

<code>cd unix &amp;&amp;</code>

<code>./configure --prefix=/usr           \</code>

<code>            </code><code>--without-tzdata        \</code>

<code>            </code><code>--mandir=/usr/share/man \</code>

<code>            </code><code>$([ $(uname -m) = x86_64 ] &amp;&amp; echo --enable-64bit) &amp;&amp;</code>

<code>make &amp;&amp;</code>

<code>sed -e </code><code>"s#$SRCDIR/unix#/usr/lib#"</code> <code>\</code>

<code>    </code><code>-e </code><code>"s#$SRCDIR#/usr/include#"</code>  <code>\</code>

<code>    </code><code>-i tclConfig.sh               &amp;&amp;</code>

<code>sed -e </code><code>"s#$SRCDIR/unix/pkgs/tdbc1.0.1#/usr/lib/tdbc1.0.0#"</code> <code>\</code>

<code>    </code><code>-e </code><code>"s#$SRCDIR/pkgs/tdbc1.0.1/generic#/usr/include#"</code>    <code>\</code>

<code>    </code><code>-e </code><code>"s#$SRCDIR/pkgs/tdbc1.0.1/library#/usr/lib/tcl8.6#"</code> <code>\</code>

<code>    </code><code>-e </code><code>"s#$SRCDIR/pkgs/tdbc1.0.1#/usr/include#"</code>            <code>\</code>

<code>    </code><code>-i pkgs/tdbc1.0.1/tdbcConfig.sh                        &amp;&amp;</code>

<code>sed -e </code><code>"s#$SRCDIR/unix/pkgs/itcl4.0.1#/usr/lib/itcl4.0.0#"</code> <code>\</code>

<code>    </code><code>-e </code><code>"s#$SRCDIR/pkgs/itcl4.0.1/generic#/usr/include#"</code>    <code>\</code>

<code>    </code><code>-e </code><code>"s#$SRCDIR/pkgs/itcl4.0.1#/usr/include#"</code>            <code>\</code>

<code>    </code><code>-i pkgs/itcl4.0.1/itclConfig.sh                        &amp;&amp;</code>

<code>unset SRCDIR</code>

<code># make install &amp;&amp;</code>

<code>make install-</code><code>private</code><code>-headers &amp;&amp;</code>

<code>ln -v -sf tclsh8.6 /usr/bin/tclsh &amp;&amp;</code>

<code>chmod -v 755 /usr/lib/libtcl8.6.so</code>

<code># mkdir -v -p /usr/share/doc/tcl-8.6.2 &amp;&amp;</code>

<code>cp -v -r  ../html/* /usr/share/doc/tcl-8.6.2</code>

<code>////////////////////////////////////////////////////////////////////////////////////////////////</code>

2、拷貝redis配置檔案

<code># mkdir /etc/redis</code>

<code># cp /root/redis/redis-2.8.17/redis.conf /etc/redis/</code>

3、建立redis服務啟動使用者

<code># useradd -s /sbin/nologin redis</code>

4、簡單的修改常用的配置選項

<code># vim /etc/redis/redis.conf </code>

<code>daemonize   yes          #redis以守護程序的方式運作,no表示不以守護程序的方式運作(會占用一個終端)</code>

<code>timeout 300              #用戶端閑置多長時間後斷開連接配接,預設為0關閉此功能</code>

<code>loglevel  verbose        #設定redis日志級别</code>

<code>logfile stdout           #設定日志檔案的輸出方式,如果以守護程序的方式運作redis并且日志輸出設定為stdout,那麼日志資訊就輸出到/dev/null裡面去了</code>

5、提供redis的SysV腳本

注意:用這個腳本管理之前,需要先配置下面的核心參數,否則Redis腳本在重新開機或停止redis時,将會報錯,并且不能自動在停止服務前同步資料到磁盤上

<code># echo "vm.overcommit_memory = 1" &gt;&gt;/etc/sysctl.conf</code>

<code>此參數可用的值為0,1,2</code>

<code>    </code><code>0表示當使用者空間請求更多的記憶體時,核心嘗試估算出可用的記憶體</code>

<code>    </code><code>1表示核心允許超量使用記憶體直到記憶體用完為止</code>

<code>    </code><code>2表示整個記憶體位址空間不能超過swap+(vm.overcommit_ratio)%的RAM值</code>

<code># sysctl -p   #立刻生效</code>

# vim /etc/init.d/redis

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

<code>#!/bin/bash </code>

<code># </code>

<code># Init file for redis </code>

<code># chkconfig: - 80 12 </code>

<code># description: redis daemon </code>

<code># processname: redis </code>

<code># config: /etc/redis.conf </code>

<code># pidfile: /var/run/redis.pid </code>

<code>source /etc/init.d/functions</code>

<code>#BIN="/usr/local/bin" </code>

<code>BIN=</code><code>"/usr/local/bin"</code>

<code>CONFIG=</code><code>"/etc/redis/redis.conf"</code>

<code>PIDFILE=</code><code>"/var/run/redis.pid"</code>

<code>### Read configuration </code>

<code>[ -r </code><code>"$SYSCONFIG"</code> <code>] &amp;&amp; source </code><code>"$SYSCONFIG"</code>

<code>RETVAL=0</code>

<code>prog=</code><code>"redis-server"</code>

<code>desc=</code><code>"Redis Server"</code>

<code>start() {</code>

<code>        </code><code>if</code> <code>[ -e $PIDFILE ];then</code>

<code>             </code><code>echo </code><code>"$desc already running...."</code> 

<code>             </code><code>exit</code> <code>1</code>

<code>        </code><code>fi</code>

<code>        </code><code>echo -n $</code><code>"Starting $desc: "</code> 

<code>        </code><code>daemon $BIN/$prog $CONFIG</code>

<code>        </code><code>RETVAL=$?</code>

<code>        </code><code>echo </code>

<code>        </code><code>[ $RETVAL -eq 0 ] &amp;&amp; touch /var/lock/subsys/$prog</code>

<code>        </code><code>return</code> <code>$RETVAL</code>

<code>}</code>

<code>stop() {</code>

<code>        </code><code>echo -n $</code><code>"Stop $desc: "</code> 

<code>        </code><code>killproc $prog</code>

<code>        </code><code>[ $RETVAL -eq 0 ] &amp;&amp; rm -f /var/lock/subsys/$prog $PIDFILE</code>

<code>restart() {</code>

<code>        </code><code>stop</code>

<code>        </code><code>start</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>  </code><code>start)</code>

<code>        </code><code>;;</code>

<code>  </code><code>stop)</code>

<code>  </code><code>restart)</code>

<code>        </code><code>restart</code>

<code>  </code><code>condrestart)</code>

<code>        </code><code>[ -e /var/lock/subsys/$prog ] &amp;&amp; restart</code>

<code>  </code><code>status)</code>

<code>        </code><code>status $prog</code>

<code>   </code><code>*)</code>

<code>        </code><code>echo $</code><code>"Usage: $0 {start|stop|restart|condrestart|status}"</code> 

<code>        </code><code>RETVAL=1</code>

<code>esac</code>

<code>exit</code> <code>$RETVAL</code>

增加為服務清單并設定開機啟動

<code># chmod +x /etc/init.d/redis </code>

<code># chkconfig --add redis</code>

<code># chkconfig --level 345 redis on</code>

6、啟動redis服務

<code># redis-server</code>

<code># redis-server /etc/redis/redis.conf &amp;</code>

<code># service redis start</code>

7、檢視redis服務監聽的位址和端口

<code># netstat -tnlp |grep redis</code>

<code>tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      25350/redis-server</code>

三、用戶端測試Redis服務

<code>第一種方法:通過redis用戶端指令redis-cli</code>

<code># redis-cli </code>

<code># redis-cli -h 192.168.1.127 -p 6379</code>

<code>127.0.0.1:6379&gt; set name zhengyansheng</code>

<code>OK</code>

<code>127.0.0.1:6379&gt; get name</code>

<code>"zhengyansheng"</code>

<code>127.0.0.1:6379&gt; quit</code>

<code># redis-cli set mykey 'hello world!'</code>

<code># redis-cli get mykey</code>

<code>"hello world!"</code>

<code># redis-cli type mykey</code>

<code>string</code>

<code># redis-cli strlen mykey</code>

<code>(integer) 12</code>

<code>第二種方法:通過telnet方法</code>

<code># telnet 127.0.0.1 6379</code>

<code>Trying 127.0.0.1...</code>

<code>Connected to 127.0.0.1.</code>

<code>Escape character is </code><code>'^]'</code><code>.</code>

<code>set test </code><code>"Welcome to BeiJing."</code> 

<code>+OK</code>

<code>get test</code>

<code>$19</code>

<code>Welcome to BeiJing.</code>

<code>strlen</code> <code>test</code>

<code>:19</code>

<code>quit</code>

<code>Connection closed by foreign host.</code>

四、phpredis擴充安裝

1、下載下傳phpredis擴充包

<code>wget https:</code><code>//github.com/nicolasff/phpredis/archive/master.zip</code>

2、安裝phpredis擴充

<code># unzip phpredis-master.zip </code>

<code># cd phpredis-master</code>

<code># /usr/local/php/bin/phpize </code>

<code># ./configure --with-php-config=/usr/local/php/bin/php-config </code>

<code># make </code>

<code>#安裝完成後會輸出一下資訊,提示redis.so生成的目錄路徑</code>

<code>Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/</code>

3、添加redis擴充

<code># vim /usr/local/php/etc/php.ini </code>

<code>添加一行</code>

<code>extension = </code><code>"redis.so"</code>

4、重新開機nginx服務

<code># service nginx restart</code>

5、通路phpinfo檢視redis擴充的詳細資訊

<a href="http://s3.51cto.com/wyfs02/M02/4C/7E/wKiom1Q-gEeB_aOQAABpXOd0WbI218.jpg" target="_blank"></a>

四、Redis的使用者認證

redis沒有實作通路控制這個功能,但是它提供了一個輕量級的認證方式,可以編輯redis.conf配置來啟用認證。

Redis的使用者認證有兩種方法

1、臨時的使用者認證密碼

2、永久的使用者認證密碼

<code>臨時設定Redis使用者認證,重新啟動Redis服務後就會失效</code>

<code>[root@Redis ~]# redis-cli </code>

<code>127.0.0.1:6379&gt; config set requirepass zhengyansheng</code>

<code>127.0.0.1:6379&gt; config get requirepass</code>

<code>(error) NOAUTH Authentication required.</code>

<code>127.0.0.1:6379&gt; auth zhengyansheng</code>

<code>1) "requirepass"</code>

<code>2) "zhengyansheng"</code>

<code>#重新開機Redis服務</code>

<code>[root@Redis ~]# service redis restart</code>

<code>Stop Redis Server:                                         [确定]</code>

<code>Starting Redis Server:                                     [确定]</code>

<code>#再次認證是否還要認證?</code>

<code>[root@Redis ~]# redis-cli</code>

<code>127.0.0.1:6379&gt; set name tomcat</code>

<code>"tomcat"</code>

<code>永久設定Redis使用者,重新開機動Redis服務後依然生效</code>

<code>1、設定Redis密碼</code>

<code>requirepass zhengyansheng13260071987</code>

<code>2、重新加載Redis服務</code>

<code># service redis restart</code>

<code>3、登陸Redis通路測試</code>

<code>(error) NOAUTH Authentication required. #錯誤:提示沒有認證通過</code>

<code>127.0.0.1:6379&gt; auth zhengyansheng13260071987   #采用認證方式</code>

五、與Memcache的比較

memcache和redis都是記憶體型資料庫,資料儲存在記憶體中,通過tcp直接存取,memcached優勢是速度快,并發高,缺點是資料類型有限,查詢功能不強,一般用作緩存。在我們團隊的項目中,一開始用的是memcached,後來用redis替代。

相比memcached:

1、redis具有持久化機制,可以定期将記憶體中的資料持久化到硬碟上。

2、redis具備binlog功能,可以将所有操作寫入日志,當redis出現故障,可依照binlog進行資料恢複。

3、redis支援virtual memory,可以限定記憶體使用大小,當資料超過門檻值,則通過類似LRU的算法把記憶體中的最不常用資料儲存到硬碟的頁面檔案中。

4、redis原生支援的資料類型更多,使用的想象空間更大。

5、前面有位朋友所提及的一緻性哈希,用在redis的sharding中,一般是在負載非常高需要水準擴充時使用。我們還沒有用到這方面的功能,一般的項目,單機足夠支撐并發了。redis 3.0将推出cluster,功能更加強大

六、redis-clie的指令行參數

<code>SET                      建立一個key;</code>

<code>GET                      擷取一個key的值;</code>

<code>DEL                      ***一個key;</code>

<code>TYPE                     擷取一個key的類型;</code>

<code>EXISTS                   判斷一個key是否存在,</code><code>0</code><code>:存在,</code><code>1</code><code>,不存在;</code>

<code>KEYS                     擷取給定模糊比對的key;</code>

<code>EXPIRE                   設定一個key過期的秒數;</code>

<code>PERSTST                  ***一個key過期的秒數;</code>

<code>PEXPIRE                  設定一個key過期的毫秒數;</code>

<code>RENAME                   将一個key重命名;</code>

<code>RENAMENX                 将一個key重命名,且新的key必須是不存在的可以;</code>

<code>TTL                      擷取key的有效時間;</code>

<code></code>

     本文轉自zys467754239 51CTO部落格,原文連結:http://blog.51cto.com/467754239/1564581,如需轉載請自行聯系原作者