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 桌面]#<span? class = "line" > tar xvf redis-3.0.6.tar.gz<br></span> |
| 1 | [root@andoncentos 桌面]# <span? class = "line" >cd redis-3.0.6/</span> |
| 1 | [root@andoncentos 桌面]# <span? class = "line" >make MALLOC=libc</span> |
| 1 | <span? class = "line" >[root@andoncentos redis-3.0.6]# make install</span> |
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
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的C#使用Redis集群缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为TFS配置跨平台的生成服务器Xplat
- 下一篇: IIS负载均衡-Application