天天看點

redis記憶體資料庫

===> Redis記憶體資料庫簡介:

                 Redis 是完全開源免費的,遵守BSD協定,是一個高性能的key-value資料庫。

===> Redis 的特點:

            ->基于記憶體

    -> 持久化: RDB、AOF

            -> 消息機制:支援String,隻支援Topic的消息(廣播)  

            -> 豐富的資料類型

            -> 支援簡單的事務

            -> 支援主從複制

            -> HA(哨兵): 對版本有要求,需要 2.4 版本以上

===> Redis的安裝和配置: 需要gcc的編譯器

            -> Redis 單機部署:

<code>        </code><code>tar </code><code>-</code><code>zxvf redis</code><code>-</code><code>3.0</code><code>.</code><code>5.tar</code><code>.gz        </code>

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

<code>        </code><code>make PREFIX</code><code>=</code><code>/</code><code>app</code><code>/</code><code>redis install</code>

            -&gt; Redis的相關指令

                    redis-benchmark       提供的一個壓力測試工具,模拟:10萬操作

                    redis-check-aof       檢查AOF日志檔案

                    redis-check-dump      檢查RDB快照檔案

                    redis-cli                     指令行

                    redis-sentinel        哨兵(Redis的HA) -----&gt; 配置檔案:sentinel.conf 2.4版本以上

                    redis-server      伺服器

            -&gt; 配置檔案    

                    --- redis.conf

                            daemonize yes  改成yes 後,啟動後會在背景運作

                            port 6379

            -&gt; 服務啟動指令:redis-server conf/redis.conf

            -&gt; 用戶端連接配接指令: redis-cli -p 6379  |  redis-cli  -h 192.168.10.210 -p 6379

===&gt; Redis 叢集的安裝和配置:(星型架構,線型架構)

            -&gt; 此處隻講解星型架構(此架構結構為單台伺服器上使用不同端口啟動三個服務組成叢集,多台伺服器同理)

                --- 主:6379端口               (關閉 RDB 和 AOF)

                --- 從:6380, 6381端口  (開啟 RDB 和 AOF)

            -&gt; 配置檔案:

<code>    </code><code>redis6379.conf</code>

<code>    </code><code>daemonize yes</code>

<code>    </code><code>#save 900 1</code>

<code>    </code><code>#save 300 10</code>

<code>    </code><code>#save 60 10000</code>

<code>            </code> 

<code>    </code><code>pidfile </code><code>/</code><code>app</code><code>/</code><code>redis</code><code>/</code><code>pids</code><code>/</code><code>redis_6379.pid</code>

<code>    </code><code>logfile </code><code>"/app/redis/logs/redis_6379/redis.log"</code>

<code>    </code><code>dbfilename dump.rdb</code>

<code>    </code><code>dir</code> <code>"/data/redis_data/redis_6379"</code>

<code>        </code> 

<code>    </code><code>appendonly no</code>

<code>    </code><code>appendfilename </code><code>"appendonly6379.aof"</code>

<code>    </code><code>redis6380.conf</code>

<code>    </code><code>port </code><code>6380</code>

<code>    </code><code>slaveof </code><code>192.168</code><code>.</code><code>157.11</code> <code>6380</code>

<code>    </code><code>pidfile </code><code>/</code><code>app</code><code>/</code><code>redis</code><code>/</code><code>pids</code><code>/</code><code>redis_6380.pid</code>

<code>    </code><code>logfile </code><code>"/app/redis/logs/redis_6380/redis.log"</code>

<code>    </code><code>dir</code> <code>"/data/redis_data/redis_6380"</code>

<code>    </code><code>appendonly yes</code>

<code>    </code><code>appendfilename </code><code>"appendonly6380.aof"</code>

<code>    </code><code>redis6381.conf</code>

<code>    </code><code>port </code><code>6381</code>

<code>    </code><code>slaveof </code><code>192.168</code><code>.</code><code>157.11</code> <code>6379</code>

<code>    </code><code>pidfile </code><code>/</code><code>app</code><code>/</code><code>redis</code><code>/</code><code>pids</code><code>/</code><code>redis_6381.pid</code>

<code>    </code><code>logfile </code><code>"/app/redis/logs/redis_6381/redis.log"</code>

<code>    </code><code>dir</code> <code>"/data/redis_data/redis_6381"</code>

<code>    </code><code>appendfilename </code><code>"appendonly6381.aof"</code>       

                 (*)注意:預設:從節點隻讀

<code>(error) READONLY You can't write against a read only slave.</code>

<code>修改參數:</code>

<code>slave</code><code>-</code><code>read</code><code>-</code><code>only yes</code>

            -&gt; Redis的HA:哨兵機制(要在解壓的安裝包中copy sentinel.conf 檔案到 /conf 目錄下)

<code>      </code><code>sentinel monitor mymaster  </code><code>192.168</code><code>.</code><code>10.210</code>  <code>6379</code>  <code>1</code>

<code>      </code><code>#                              IP            端口   哨兵個數</code>

<code>      </code><code>sentinel auth</code><code>-</code><code>pass</code>  <code>&lt;master</code><code>-</code><code>name&gt;  &lt;password&gt;</code>

<code>      </code><code># 配置連接配接主節點的密碼</code>

<code>      </code><code>sentinel down</code><code>-</code><code>after</code><code>-</code><code>milliseconds  mymaster  </code><code>30000</code>

<code>      </code><code># 表示 30 秒内如果沒有收到主節點的心跳,哨兵就認為主節點down</code>

<code>      </code><code>sentinel  parallel</code><code>-</code><code>syncs  mymaster </code><code>1</code>

<code>      </code><code># 選舉出新的主節點後,可以同時連接配接其他從節點的個數</code>

<code>      </code><code>sentinel  failover</code><code>-</code><code>timeout  mymaster  </code><code>180000</code>

<code>      </code><code># 失敗切換時,允許的最大時間</code>

                    ---哨兵啟動指令:redis-sentinel sentinel.conf

            -&gt; Redis的分片:

                    ---Twemproxy 是一種代理分片機制, 由 Twitter 開源

                        Twemproxy 作為代理,可接受來自多個程式 的通路,按照路由規則,轉發給背景的各個 Redis 伺服器, 再原路傳回

                    --- 安裝Twemproxy

<code>       </code><code>git clone https:</code><code>/</code><code>/</code><code>github.com</code><code>/</code><code>twitter</code><code>/</code><code>twemproxy.git</code>

<code>       </code><code>cd twemproxy</code><code>/</code>

<code>       </code> 

<code>       </code><code>CFLAGS</code><code>=</code><code>"-ggdb3 -O0"</code> <code>autoreconf </code><code>-</code><code>fvi &amp;&amp; .</code><code>/</code><code>configure </code><code>-</code><code>-</code><code>prefix</code><code>=</code><code>/</code><code>app</code><code>/</code><code>proxy </code><code>-</code><code>-</code><code>enable</code><code>-</code><code>debug</code><code>=</code><code>log &amp;&amp; make &amp;&amp;  make install</code>

                    --- 配置檔案:nutcracker.yml  (需要在解壓的安裝包/conf 目錄下copy 到安裝目錄的 conf 目錄下)

<code>       </code><code>alpha:</code>

<code>       </code><code>listen: </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>22121</code>

<code>       </code><code>hash</code><code>: fnvla_64</code>

<code>       </code><code>distribution: ketama</code>

<code>         </code><code>auto_eject_hosts: true</code>

<code>         </code><code>redis: true</code>

<code>         </code><code>server_retry_timeout: </code><code>2000</code>

<code>         </code><code>server_failure_limit: </code><code>1</code>

<code>         </code><code>servers:</code>

<code>         </code><code>-</code> <code>192.168</code><code>.</code><code>10.210</code><code>:</code><code>6380</code>

<code>         </code><code>-</code> <code>192.168</code><code>.</code><code>10.210</code><code>:</code><code>6381</code>

                    --- 檢查配置檔案是否正确:  ./nutcracker  -t  conf/nutcracker.yml

                    --- 啟動代理伺服器: ./nutcracker -d -c  conf/nutcracker.yml

                    --- 此時連接配接Redis 需要使用 Twemproxy 配置的端口連接配接: redis-cli  -p  22121

===&gt; Redis的操作:基于key-value形式 

            -&gt; 

                    --- 

===&gt; Redis的事務: 不是真正的事務

            -&gt; Redis的事務的本質:将一組操作放入隊列中,批量執行

            -&gt; 對比Oracle和Redis的事務

            -&gt; Redis 的事務執行個體:(銀行轉賬)

<code>      </code><code>set</code> <code>tom </code><code>1000</code>

<code>      </code><code>set</code> <code>mike </code><code>1000</code>

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

<code>      </code><code>decrby tom </code><code>100</code>

<code>      </code><code>incrby mike </code><code>100</code>

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

===&gt; Redis的鎖機制

            -&gt; 核心:當事務送出的時候,如果監控的值,發生變化,則送出失敗

         指令:watch

            -&gt; Redis 的鎖執行個體:(買票)

<code>      </code><code>set</code> <code>ticket </code><code>1</code>        

<code>          </code> 

<code>      </code><code>使用者一:tom</code>

<code>      </code><code>decr ticket</code>

<code>      </code><code>exec</code>  <code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>&gt; 送出的時候,慢了一點</code>

<code>      </code><code>1</code><code>) (integer) </code><code>-</code><code>1</code>   <code>=</code><code>=</code><code>=</code><code>=</code><code>&gt; 票數不可能是</code><code>-</code><code>1</code>

<code>      </code><code>2</code><code>) (integer) </code><code>900</code>

<code>      </code><code>使用者二:在tom送出前,已經把票買走了  </code>

===&gt; Redis的消息機制

            -&gt; Redis 消息系統類型

                    --- 同步消息系統:需要對方的回答

                    --- 異步消息系統:不需要等待對方回答

            -&gt; Redis 消息類型

                    --- Queue: 隊列(點對對)

                    --- Topic: 主題 (廣播)

                    (*)Redis和Kafka:隻支援Topic

                    (*)  JMS: Java Message Service ----&gt; 都支援:Queue和Topic

 推薦:Weblogic

            -&gt; Redis 消息相關指令

                    publish: 釋出消息 指定頻道

                    subscribe:訂閱消息 指定頻道

                    psubscribe:訂閱消息 使用通配符指定頻道

===&gt; Redis的持久化:  RDB、AOF

            -&gt; 持久化作用:進行恢複

            -&gt; RDB:快照的方式。每隔一段時間,把記憶體中的資料寫到rdb檔案中

                    --- 優點:恢複的速度快

                    --- 缺點:如果在兩次RDB之間發生了掉電,資料肯定丢失

                    --- 參數:

                            規則:從下往上

                            save 900 1      在15分鐘内,如果有1個key的value發生了變化,就産生RDB檔案

                            save 300 10     在5分鐘内,如果有10個key的value發生了變化,就産生RDB檔案

                            save 60 10000   在60秒内,如果有1w個key的value發生了變化,就産生RDB檔案

                            stop-writes-on-bgsave-error yes 如果在寫RDB檔案的時候産生了錯誤,停止新的資料寫入

                            rdbcompression yes 是否壓縮(優點:節約了空間  缺點:恢複的效率低),可以設定為:no

                            rdbchecksum yes  校驗和來檢查RDB檔案是否是好的

                            dbfilename dump.rdb  如果在叢集下,一台主機上運作多個Redis的執行個體,建議差別rdb檔案

                            dir ./    儲存的目錄

            -&gt; AOF:append only file(記錄日志)

                    --- 優點:資料安全性高

                    --- 缺點:恢複速度慢,需要重做日志,達到恢複的目的

                    --- 預設禁用

<code>        </code><code>appendonly no  </code><code>=</code><code>=</code><code>=</code><code>&gt; yes     </code><code>#開啟AOF                </code>

<code>        </code><code>appendfilename </code><code>"appendonly.aof"</code>  <code># 如果在叢集下,一台主機上運作多個Redis的執行個體,建議差別aof檔案</code>

<code>                  </code> 

<code>        </code><code># 什麼時候記錄日志???</code>

<code>        </code><code># appendfsync always  # 每個操作都記錄日志。最安全,性能最差</code>

<code>        </code><code>appendfsync everysec  </code><code># 預設:每秒</code>

<code>        </code><code># appendfsync no      # 由作業系統決定</code>

<code>        </code><code>no</code><code>-</code><code>appendfsync</code><code>-</code><code>on</code><code>-</code><code>rewrite no </code><code># 重寫發生的時候,是否寫入aof的新日志</code>

<code>        </code><code># 什麼時候執行AOF重寫?</code>

<code>        </code><code>auto</code><code>-</code><code>aof</code><code>-</code><code>rewrite</code><code>-</code><code>percentage </code><code>100</code>

<code>        </code><code>auto</code><code>-</code><code>aof</code><code>-</code><code>rewrite</code><code>-</code><code>min</code><code>-</code><code>size </code><code>64mb</code>

<code>                            </code> 

<code>        </code><code># 什麼是AOF的重寫:rewrite</code>

<code>        </code><code>set</code> <code>i </code><code>0</code>

<code>        </code><code>incr i</code>

<code>                                </code><code>=</code><code>=</code><code>=</code><code>=</code><code>=</code><code>=</code><code>&gt; 問題: AOF檔案太大了</code>

<code>        </code><code>100</code><code>次</code>

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

<code>        </code><code>最終:i </code><code>=</code> <code>100</code>

<code>                </code> 

<code>        </code><code># 示範:AOF的重寫</code>

<code>        </code><code>模拟:</code><code>10</code><code>萬個操作</code>

<code>        </code><code>bin</code><code>/</code><code>redis</code><code>-</code><code>benchmark </code><code>-</code><code>n </code><code>100000</code>        

===&gt; Redis 問題連結:(找了幾個比較經典的問題處理連結,留作收藏,以後備用)

            -&gt; http://blog.csdn.net/a491857321/article/details/52006376

本文轉自 菜鳥的征程 51CTO部落格,原文連結:http://blog.51cto.com/songqinglong/2066611