Net分布式系統之五:C#使用Redis集群緩存


本文介紹系統緩存組件,采用NOSQL之Redis作為系統緩存層。

一、背景

  系統考慮到高並發的使用場景。對於並發提交場景,通過上一章節介紹的RabbitMQ組件解決。對於系統高並發查詢,為了提供性能減少數據庫壓力,我們加入緩存機制,可以不同層次加入緩存支持,本文主要介紹應用服務層和數據層之間加入緩存機制提升性能。業界緩存組件有Redis、Memcached、MemoryCache。本系統采用Redis緩存組件,有些系統將Redis當作MQ使用,此場景本系統用RabbitMQ,Redis主要用於系統緩存應用。


 

二、Redis簡介

  Redis是一個開源的Key-Value數據庫,使用C語言編寫、支持網絡、可基於內存亦可持久化的NOSQL數據庫,並提供多種語言的API,例如:Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等語言驅動。自Redis3.0開始支持集群方案。

   相關Redis Cluster 原理在此不多介紹,網絡上有很多資料。


 

三、Redis集群應用

  (一)環境介紹

    本系統基於Linux之CentOS搭建Redis3.0集群。將三個Instance部署於一台虛擬機,應用部署於windows平台。

序號 服務IP 說明
1 192.168.1.110

Redis節點A端口:7000(M),7003(S)

Redis節點B端口:7001(M),7004(S)

Redis節點C端口:7002(M),7005(S)

  

 

 

 

  

  (二)安裝Redis

  1、安裝相關依賴工具

1
[root@andoncentos 桌面]# yum -y install gcc openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel gcc-c++ automake autoconf

  2、安裝Redis 3.0.6

1
[root@andoncentos 桌面]# cd /usr/loacal
1
[root@andoncentos loacal]# wget http: //download.redis.io/releases/redis-3.0.6.tar.gz
1
[root@andoncentos 桌面]# tar xvf redis-3.0.6.tar.gz
1
[root@andoncentos 桌面]# cd redis-3.0.6/
1
[root@andoncentos 桌面]# make MALLOC=libc
1
[root@andoncentos redis-3.0.6]# make install

  3、由於我們使用不同端口號區分,在兩個服務各自建立以端口命名的文件夾。配置7000節點服務,將redis-server和redis.conf復制到/etc/redis/7000

1
[root@andoncentos 桌面]# mkdir /etc/redis/7000
1
[root@andoncentos 桌面]# mkdir /etc/redis/7001
1
[root@andoncentos 桌面]# mkdir /etc/redis/7002
1
[root@andoncentos 桌面]# mkdir /etc/redis/7003
1
[root@andoncentos 桌面]# mkdir /etc/redis/7004
1
[root@andoncentos 桌面]# mkdir /etc/redis/7005
1
[root@andoncentos redis-3.0.6]# cp /usr/local/redis-3.0.6/src/redis-server /usr/local/redis-3.0.6/redis.conf /etc/redis/7000
1
[root@andoncentos redis-3.0.6]# vim /etc/redis/7000/redis.conf

  port 7000
  daemonize yes 
  pidfile /var/run/redis_7000.pid
  cluster-enabled yes
  cluster-config-file nodes.conf
  logfile "/var/log/redisd7000.log"
  dir /etc/redis/7000/
  cluster-node-timeout 5000
  appendonly yes

  4、修改redis服務的啟動腳本,修改內容,並復制相關其他的節點配置

1
2
[root@andoncentos redis-3.0.6]# cp /usr/local/redis-3.0.6/utils/redis_init_script /etc/init.d/redis7000
[root@andoncentos redis-3.0.6]# vim /etc/init.d/redis7000

#!/bin/sh
# chkconfig 2345 90 10
# description:Redis is a persistent key-value database
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=7000
# EXEC=/usr/local/bin/redis-server
EXEC=/etc/redis/${REDISPORT}/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}/redis.conf"

1
2
3
[root@andoncentos redis-3.0.6]# cp /etc/init.d/redis7000 /etc/init.d/redis7001
[root@andoncentos redis-3.0.6]# cp /etc/init.d/redis7000 /etc/init.d/redis7003
[root@andoncentos redis-3.0.6]# cp /etc/init.d/redis7000 /etc/init.d/redis7004

  5、設置為開機自啟動服務器

1
2
3
4
[root@andoncentos redis-3.0.6]# chkconfig redis7000  on
[root@andoncentos redis-3.0.6]# chkconfig redis7001  on
[root@andoncentos redis-3.0.6]# chkconfig redis7003  on
[root@andoncentos redis-3.0.6]# chkconfig redis7004  on

  6、重啟系統,並檢查redis7000,redis7001,redis7003,redis7004服務情況

1
[root@andoncentos redis-3.0.6]# reboot<br>[root@andoncentos 桌面]# systemctl status redis7004.service

 

  (三)配置Redis集群

  1、按照 ruby tree 工具,因為redis集群需要ruby

1
[root@andoncentos redis-3.0.6]# yum -y install tcl ruby tree<br>[root@andoncentos 桌面]# gem install redis --version 3.0.6

Fetching: redis-3.0.6.gem (100%)
Successfully installed redis-3.0.6
Parsing documentation for redis-3.0.6
Installing ri documentation for redis-3.0.6
1 gem installed

  2、redis-trib.rb 配置集群

1
2
3
4
5
6
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
[root@andoncentos 桌面]# /usr/local/redis-3.0.6/src/redis-trib.rb create --replicas 1 192.168.1.110:7000 192.168.1.110:7001 192.168.1.110:7002 192.168.1.110:7003 192.168.1.110:7004 192.168.1.110:7005
>>> Creating cluster
>>> Performing hash slots allocation  on  6 nodes...
Using 3 masters:
192.168.1.110:7000
192.168.1.110:7001
192.168.1.110:7002
Adding replica 192.168.1.110:7003 to 192.168.1.110:7000
Adding replica 192.168.1.110:7004 to 192.168.1.110:7001
Adding replica 192.168.1.110:7005 to 192.168.1.110:7002
M: b164701893bfbdc078e2f7e3b16f1216c1bf65ff 192.168.1.110:7000
    slots:0-5460 (5461 slots) master
M: 4c2d36c55cff692a7bbeccb663197b555747d15d 192.168.1.110:7001
    slots:5461-10922 (5462 slots) master
M: b147e4dfcd63c5ce059540db55a9d7cb9fa093eb 192.168.1.110:7002
    slots:10923-16383 (5461 slots) master
S: 757381aa5cc5c8ba70f3798f6de6cb7b2e97f924 192.168.1.110:7003
    replicates b164701893bfbdc078e2f7e3b16f1216c1bf65ff
S: fecc8edf32fc72cd4a5d8ae5306fe4083abfe8e9 192.168.1.110:7004
    replicates 4c2d36c55cff692a7bbeccb663197b555747d15d
S: 98bd8e1aff631a3bee7f92a39764decea16ee955 192.168.1.110:7005
    replicates b147e4dfcd63c5ce059540db55a9d7cb9fa093eb
Can I  set  the above configuration? (type  'yes'  to accept): <strong>yes</strong>          
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to  join  the cluster
Waiting  for  the cluster to  join ....
>>> Performing Cluster Check ( using  node 192.168.1.110:7000)
M: b164701893bfbdc078e2f7e3b16f1216c1bf65ff 192.168.1.110:7000
    slots:0-5460 (5461 slots) master
M: 4c2d36c55cff692a7bbeccb663197b555747d15d 192.168.1.110:7001
    slots:5461-10922 (5462 slots) master
M: b147e4dfcd63c5ce059540db55a9d7cb9fa093eb 192.168.1.110:7002
    slots:10923-16383 (5461 slots) master
M: 757381aa5cc5c8ba70f3798f6de6cb7b2e97f924 192.168.1.110:7003
    slots: (0 slots) master
    replicates b164701893bfbdc078e2f7e3b16f1216c1bf65ff
M: fecc8edf32fc72cd4a5d8ae5306fe4083abfe8e9 192.168.1.110:7004
    slots: (0 slots) master
    replicates 4c2d36c55cff692a7bbeccb663197b555747d15d
M: 98bd8e1aff631a3bee7f92a39764decea16ee955 192.168.1.110:7005
    slots: (0 slots) master
    replicates b147e4dfcd63c5ce059540db55a9d7cb9fa093eb
[OK] All nodes agree about slots configuration.
>>> Check  for  open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

  3、檢查集群狀態

1
[root@andoncentos 桌面]# /usr/local/redis-3.0.6/src/redis-trib.rb check  192.168.1.110:7000

  4、若出錯的話,通過如下命令行修復

1
[root@andoncentos 桌面]# /usr/local/redis-3.0.6/src/redis-trib.rb fix 192.168.1.110:7000

  5、防火牆開放端口,並重啟防火牆

1
2
3
4
[root@andoncentos 桌面]# firewall-cmd --zone= public  --add-port=7000-7005/tcp --permanent
success
[root@andoncentos 桌面]# firewall-cmd --reload
success

  6、檢查集群情況

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@andoncentos 桌面]# redis-cli -c -p 7000
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:2492
cluster_stats_messages_received:2492

 

四、使用說明

   (一)使用命令行測試緩存

  

 

  (二)通過C#代碼測試緩存

  1、通過使用stackexchang.redis組件,將數據緩存到集群redis服務。

1
2
3
4
5
6
7
var  cfg = RedisCachingSectionHandler.GetConfig();
var  serializer =  new  NewtonsoftSerializer();
var  redis =  new  StackExchangeRedisCacheClient(serializer, cfg);
 
var  cls =  new  Cls(){ ID = 1, Name = txt };
string  key =  "tkey"  new  Random().Next(1000, 9999).ToString();
redis.Add<Cls>(key, cls);

  2、通過key獲取數據

1
2
3
4
5
var  cfg = RedisCachingSectionHandler.GetConfig();
var  serializer =  new  NewtonsoftSerializer();
var  redis =  new  StackExchangeRedisCacheClient(serializer, cfg);
var  entity =  redis.Get<Cls>(key);
  ViewBag.KV = entity !=  null  ? entity.Name :  "" ;

  3、redis緩存情況

 

 


 

五、總結

   redis cluster 默認支持HA,但是對於單個Instance故障,使用者需要自行判斷處理的機制,后續有待於研究,但是redis codis 這方面提供了方便的支持。

 

引用:http://www.cnblogs.com/Andon_liu/p/5460374.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM