1. 程式人生 > >學習Redis(六)

學習Redis(六)

ids 情況下 cal nbsp 都是 cor sin dism 裝配

分布式存儲之-Redis

一、簡介
redis常用於數據庫讀緩存和寫緩存,通常寫緩存需要考慮到數據一致性的問題,讀緩存應用較多
redis是一個開源的,使用c語言編寫的,支持網絡交互的,可基於內存也可持久化的key-value數據庫

技術分享圖片

二、安裝部署

1、安裝
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
tar xf redis-3.0.7.tar.gz
cd redis-3.0.7
make PREFIX=/usr/local/redis install
cp redis_init_script /etc/init.d/redis
chmod +x /etc/init.d/redis

2、修改配置文件 vim /etc/init.d/redis EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/redis/bin/redis-cli cp /usr/local/redis-3.0.7/redis.conf /etc/redis/6379.conf vim /etc/redis/6379.conf daemonize yes 3、啟動服務 /etc/init.d/redis start

通過salt-master批量安裝:

cp redis-3.0.7.tar.gz   salt/redis/files/
cp 6379.conf              salt/redis/files/
cp 
/etc/init.d/redis salt/redis/files/

vim redis.sls

redis-install:
  file.managed: #調用file模塊的managed方法
    - name: /usr/local/src/redis-3.0.7.tar.gz #客戶端的文件路徑
    - source: salt://init/files/redis-3.0.7.tar.gz  #在服務器的路徑
    - user: root
    - group: root
    - mode: 755
    
  cmd.run: #執行遠程命令,使用cmd的run方法
    
- name: cd /usr/local/src/ && tar xvf redis-3.0.7.tar.gz && cd redis-3.0.7 && make PREFIX=/usr/local/redis install #編譯安裝 - unless: test -d /usr/local/redis #如果目錄存在就不安裝了 - require: #依賴 - file: redis-install #編譯之前需要依賴redis-install執行成功 redis-config: file.managed: - name: /etc/redis/6379.conf #客戶端的配置文件路徑 - source: salt://init/files/6379.conf #服務器的配置文件路徑 - user: root - group: root - mode: 644 redis-service: file.managed: - name: /etc/init.d/redis - source: salt://init/files/redis - user: root - group: root - mode: 755 cmd.run: - name: chkconfig --add redis && chkconfig redis on #設置服務開機啟動 - unless: chkconfig --list | grep redis #如果已經在chkconfig --list列表就不執行上一步驟 service.running: #這是服務啟動 - name: redis - enable: True - watch: #監控的文件 - file: redis-config - require: 服務啟動依賴 redis-install和redis-service - cmd: redis-install - cmd: redis-service

三:redis數據類型格式

1、字符串數據格式

SET: 設置key,設置的值都是字符串格式string:

GET: 獲取key的值:

KEYS: 顯示所有的key

EXISTS: 判斷key是否存在:返回1表示存在,0表示不存在

DEL: 刪除指定的key:返回0表示沒有指定的key可以刪除,返回其他整數表示成功刪除的key的數量,沒有的key不報錯

TYPE: 獲取key的類型

INFO: 當前服務器的狀態

SELECT: 更換數據庫,redis默認支持16個數據庫,默認在數據庫0,可以使用sekect 進行更換數據庫

FLUSHALL: 清空整個數據庫

APPEND:追加

INCR:自增,如果key不存在就創建並設置value默認為1

DECR:自減,value自減1:

INCRBY :指定自增value的整數值:

DECRBY:指定自減value的值:

INCRBYFLOAT :設置浮點數的value

MSET 和 MGET:批量創建和獲取key

STRLEN:獲取key字符串的長度

2、散列數據類型:

HSET:命令用於為哈希表中的字段賦值,如果哈希表不存在,一個新的哈希表被創建並進行 HSET 操作,如果字段已經存在於哈希表中,舊值將被覆蓋

HGET:獲取key:

HGETALL:獲取key的所有值

HMSET、HMGET、HMGETALL:批量創建、批量獲取並獲取所有的key:

HDEL:刪除指定的key

3、列表數據類型

不同的數據類型的命令是不通用的,如list與string的命令是不能通用的。出了set命令之外

LPUSH:從左側添加

RPUSH:從右側添加

LLEN:獲取列表的長度:

LPOP:從左側彈出列表中的值

RPOP:從右側彈出列表中的值

LINDEX:獲取最後一個元素:

LRANGE :獲取指定範圍的元素

4、集合數據類型的操作

集合默認是無序的,列表是有序的,有序是只按照添加的循序保持位置

SADD:創建並給集合賦值

SMEMBERS:獲取集合中的所有值

SISMEMBER:判斷一個值是不是在集合當中,在返回1,否則返回0

SDIFF:求兩個集合的差集:

SINTER:求並集,即在多個集合當中共同包含的值,可以是多個集合

SUNION:求並集,即在每個元素都出現的值只統計一次

ZADD:創建有序隊列,保持值的位置固定

ZSCORE:獲取值的分數

ZRANGE:根據值的分數排序獲取值

四、持久化

redis支持兩種持久化,分別是rdb和aof

rdb:指定的時間內快照存放在本地

aof: 將所有執行過的命令保存在本地,這種方式更像mysql的binlog

在服務器宕機時,如果是快照的方式,數據將會丟失一部分,而aof則損失的較小,並且在後臺會進行重寫

save 900 1               #900秒以內有1個key發生變化就快照
save 300 10              #300秒以內有10個key發生變化就快照
save 60 10000            #60秒內有10000個key變化就快照
rdbcompression yes       #持久化到RDB文件時,是否壓縮,“yes”為壓縮,“no”則反之
rdbchecksum yes          #讀取和寫入的時候是否支持CRC64校驗,默認是開啟的
dbfilename dump.rdb      #保存的文件的名稱
dir  /usr/local/redis    #快照文件的保存路徑

SAVE:阻塞保存

BGSAVE:在後臺保存,不阻塞

使用AOF進行持久化:

appendonly yes                    #默認為no,改為yes
appendfilename "appendonly.aof"   #保存的文件名,路徑為rdb指定的file目錄

五、Redis主從

一個主服務器可以有多個從服務器,而且從服務器也可以有主服務器,主從復制時非阻塞的,通過fork主進程主服務器收到從服務器的sync命令,就在後臺執行bgsave,執行完畢後將保持的rdb文件發給客戶端,客戶端收到後將rdb載入到內存,新版本的支持增量備份

在從服務器執行命令:

SLAVEOF 192.168.4.100 6379       #主服務器的地址和端口

查看從服務器的info信息

六、Redis集群:

1、簡介

四種大方案:

1)客戶端分片,優勢是比較靈活,不存在單點故障,缺點是添加節點需要重新配置,數據要手動同步

2)代理:代理分片,有proxy代理取數據,可以為proxy配置算法,如Twemproxy

3)Redis Cluster:在3.0版本以後支持,無中心,在某種情況下會造成數據丟失

4)Coodis:豌豆莢的開源方案

2、配置集群

使用redis cluster:

需要至少6個機器,3主3從,下面創建8個客戶端,另外2個做備用

先將配置文件復制到/opt,然後創建8個目錄並生成8個不同端口、不同pid和不同rdb文件的redis.conf配置文件:

cd /opt/
mkdir `seq 7001 7008`
cp /etc/redis/6379.conf  .
sed s/6379/7001/g 6379.conf >> 7001/redis.conf
sed s/7001/7002/g 6379.conf >> 7002/redis.conf
sed s/7002/7003/g 6379.conf >> 7003/redis.conf
sed s/7003/7004/g 6379.conf >> 7004/redis.conf
sed s/7004/7005/g 6379.conf >> 7005/redis.conf
sed s/7005/7006/g 6379.conf >> 7006/redis.conf
sed s/7006/7007/g 6379.conf >> 7007/redis.conf
sed s/7007/7008/g 6379.conf >> 7008/redis.conf

批量啟動redis:

for i in `seq 7001 7008`;do cd /opt/$i && /usr/local/redis/bin/redis-server  /opt/$i/redis.conf;done

netstat -lntp|grep :700*

安裝ruby管理工具:

yum install ruby rubygems -y
gem install redis

復制ruby的管理腳本:

cp /root/redis-3.0.7/src/redis-trib.rb  /usr/local/bin/redis-trib #是一個ruby腳本,方便redis管理

創建集群:

redis-trib  help
redis-trib  create --replicas 1 192.168.10.205:7001 192.168.10.205:7002 192.168.10.205:7003 192.168.10.205:7004 192.168.10.205:7005 192.168.10.205:7006
M: 9db0386330f3d66d0c7cac48dbf2dda1972c96c4 192.168.10.205:7001 #ID及IP和端口
   slots:0-5460 (5461 slots) master                             #本機對應的分片位置,0-5460

插入的數據是輪訓寫入到各個redis server

集群操作:

cluster nodes                  #列出當前的主從
cluster info                   #當前的狀態

向集群中添加節點:

redis-trib  add-node 192.168.10.205:7007  192.168.10.205:7001
redis-trib  add-node   要添加的節點和端口       添加到的目的節點和端口

添加主機以後需要重新分片:

redis-trib  reshard 192.168.10.205:7007

七、Redis的管理工具

1)phpredisadmin工具

2)rdbtools管理工具

3)saltstack管理redis

4)通過codis完成redis管理

1、phpredisadmin工具

類似於mysqladmin管理mysql一樣

安裝部署

1、安裝環境:
yum install httpd php php-redis -y
2、下載管理包:
git clone https://github.com/erikdubbelboer/phpRedisAdmin.git
3、更改名稱並解決依賴:
mv phpRedisAdmin admin
cd admin
git clone https://github.com/nrk/predis.git vendor #解決依賴包
4、啟動http服務
/etc/init.d/httpd  restart
5、訪問
http://192.168.4.100/admin:

報錯解決:

cd /var/www/html/admin/includes/
vim config.inc.php 
      name   => 7001,                #名稱
      host   => 192.168.10.205,  #配置為自己的主機IP
      port   => 7001,

vim /var/www/html/admin/includes/common.inc.php
#mb_internal_encoding(utf-8);   將此行改為註釋

可以配置多個reids Server

2、rdbtools管理工具:

安裝部署

yum install python-pip
pip install rdbtools
https://github.com/sripathikrishnan/redis-rdb-tools
cd /opt/7001/
rdb -c memory dump_7001.rdb  >  memory.csv #然後將memory.csv文件下載到本地,即可用excel打開分析了

databases,key,大小,格式,長度,如下所示:

技術分享圖片

3、通過saltstack管理redis:

模塊名稱:redismod

官方文檔地址:https://docs.saltstack.com/en/latest/ref/modules/all/index.html

4、通過codis完成redis管理:

codis簡介:

豌豆莢,快速分布式緩存git地址:https://github.com/CodisLabs/codis

所有內容借鑒gitlab-豌豆莢

Codis 由四部分組成:

Codis Proxy (codis-proxy): 代理服務器做請求轉發,codis-proxy 本身實現了 Redis 協議,codis-proxy 本身是無狀態的.可以執行多個

Codis Dashboard (codis-config): codis工具,包括添加刪除節點,並且自帶一個dashboard,點一點即可

Codis Redis (codis-server): 基於2.8.13開發的分支,只能使用codis-server

ZooKeeper/Etcd: Codis 依賴 ZooKeeper 來存放數據路由表和 codis-proxy 節點的元信息, codis-config 發起的命令都會通過 ZooKeeper 同步到各個存活的 codis-proxy.

安裝部署

1、安裝go語言並設置環境變量:
yum install golang -y        #codis是基於go語言編寫的,因此要安裝go語言環境
mkdir /opt/gopath            #保存go環境的路徑
vim /etc/profile
   export GOPATH=/opt/gopath
source  /etc/profile

2、安裝配置zookeeper,需要有java環境: wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz mv zookeeper-3.4.6 /usr/local/zookeeper cd /usr/local/zookeeper/conf/ cp zoo_sample.cfg /opt/zoo.cfg #復制配置文件 cd /opt/ mkdir zk1 zk2 zk3 #準備zookeeper 服務ID,每個服務器的ID是不同的 echo 1 > zk1/myid echo 2 > zk2/myid cho 3 > zk3/myid vim zoo.cfg #編輯配置文件
dataDir
=/opt/zk1 #保存數據的命令
clientPort
=2181 #客戶端連接的端口   server.1 = 192.168.10.205:2887:3887   server.2 = 192.168.10.205:2888:3888   server.3 = 192.168.10.205:2889:3889
cp zoo.cfg zk1/zk1.cfg cp zoo.cfg zk2/zk2.cfg cp zoo.cfg zk3/zk3.cfg vim zk2/zk2.cfg #每個服務對應不同的目錄
dataDir
=/opt/zk2
clientPort
=2182 vim zk3/zk3.cfg
dataDir
=/opt/zk3
clientPort
=2183

啟動每個zookeeper 服務:

/usr/local/zookeeper/bin/zkServer.sh  start  /opt/zk1/zk1.cfg 
/usr/local/zookeeper/bin/zkServer.sh  start  /opt/zk2/zk2.cfg 
/usr/local/zookeeper/bin/zkServer.sh  start  /opt/zk3/zk3.cfg 

查看每個節點的狀態:

/usr/local/zookeeper/bin/zkServer.sh  status /opt/zk1/zk1.cfg
/usr/local/zookeeper/bin/zkServer.sh  status /opt/zk2/zk2.cfg 
/usr/local/zookeeper/bin/zkServer.sh  status /opt/zk3/zk3.cfg 

連接到zookeeper節點:

/usr/local/zookeeper/bin/zkCli.sh  -server  192.168.10.205:2181

學習Redis(六)