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说明
1192.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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十四.15)之捕获Oracle服务器异常

一、异常类型 本课讨论预定义和非预定义的Oracle服务器异常。&#xff08;1&#xff09;使用PL / SQL处理异常有两种提出异常的方法&#xff1a; •Oracle服务器隐式&#xff08;自动&#xff09;&#xff1a;- 发生Oracle错误并自动引发相关异常。- 例如&#xff0c;如果在SEL…

萤石云好友分享的监控怎么看_萤石S1:英超赛场上雄起的中国品牌

北京时间4月26日20:30&#xff0c;英超2014/15赛季第34轮&#xff0c;曼联客场0比3不敌埃弗顿&#xff0c;麦卡锡、斯通斯和米拉拉斯先后进球。曼联在连败的情况下积分榜跌至第四。后弗格森时代的曼联最近刚刚有点起色&#xff0c;似乎这场惨败又让曼联球迷的信心跌到了低谷。在…

2.es与mongodb的区别

【1】es vs mongo 图片转自&#xff1a; MongoDB和Elasticsearch的对比 参考文档&#xff1a; MongoDB和Elasticsearch的对比 10亿数据&#xff0c;数据库选Mongo还是Elalsticsearch&#xff1f;-51CTO.COM ElasticSearch可以替代Mongo么&#xff1f; - 知乎 https://www.j…

taro 缺点_Taro小程序富文本解析4种方法

最近遇到一个富文本解析的问题&#xff0c;尝试了很多办法&#xff0c;终于成功了&#xff01;最后本人选择Parser。1.Taro组件rich-text优点&#xff1a;使用极其方便&#xff0c;引用一下就行了。缺点&#xff1a;不支持视频&#xff0c;放弃&#xff01;2.wxParse https://g…

IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm

自从本系列发布之后&#xff0c;收到了很多的朋友的回复&#xff01;非常感谢&#xff0c;同时很多朋友问到了一些问题&#xff0c;有些问题是一些比较基本的问题&#xff0c;由于时间的缘故&#xff0c;不会一一的为大家回复&#xff0c;如果有不明白的&#xff0c;希望大家勤…

Oracle入门(十四.16)之捕获用户定义的异常

一、异常类型 本文讨论用户定义的错误。二、捕获用户定义的异常 PL / SQL允许你定义你自己的异常。 您根据应用程序的要求定义异常。输入数据期间需要用户定义的异常的一个示例。 假设您的程序提示用户输入部门编号和名称&#xff0c;以便它可以更新部门的名称。 当用户进入无效…

以太坊地址和公钥_以太坊交易签名解析源码解读

上篇文章《以太坊交易签名过程源码解析[1]》从源码角度分析了一个合约调用的的签名过程&#xff0c;签名后的交易发送到以太坊节点后&#xff0c;节点需要从签名交易中还原出公钥(从公钥中单向计算出账号地址)&#xff0c;进而将交易放入交易池中。本文从go-ethereum源码的出发…

IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡

在前两篇文章中&#xff0c;我们已经讲述如何配置与安装ARR&#xff0c;从本篇文章开始&#xff0c;我们将重点的来讲述如何在使用ARR进行负载均衡。 本篇文章的目的主要是一步步的带领大家如何配置和使用ARR来进行Http请求的负载均衡&#xff0c;从而实现高可用与高扩展性。同…

Oracle入门(十四.17)之procedure传递参数

一、PROCEDURE 参数模式参数模式在形式参数声明中指定&#xff0c;位于参数名称之后&#xff0c;位于其数据类型之前。 参数传递模式&#xff1a; •IN参数&#xff08;默认值&#xff09;为子程序提供处理值。 •OUT参数将值返回给调用者。•IN OUT参数提供一个输入值&#xf…

1.elasticsearch文档存储(保存|修改|删除)

【README】 0.本文部分内容&#xff08;数据&#xff09;总结自 es 开发文档&#xff0c; Document APIs | Elasticsearch Guide [7.2] | Elastic &#xff1b; 1.本文的es版本是7.2.1&#xff1b; 2.elasticsearch 是一个数据存储&#xff0c;检索和分析引擎&#xff1b;本…

db9针232接口波特率标准_理解串口通信以及232,485,422常见问题

下面先讲一讲串口通信的一些基本概念&#xff0c;术语。如果对串口通信比较熟悉的&#xff0c;就当复习复习&#xff0c;如果哪里讲错或不到位&#xff0c;也可以及时指出&#xff0c;当作一块交流交流。这里并不对串口的编程作讲解&#xff0c;主要是从应用的角度去讲一讲。因…

理解 .NET Platform Standard

.NET Platform Standard&#xff1a;https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md .NET Platform Standard 是什么&#xff1f;直译过来就是 .NET 平台规范或标准&#xff0c;它的目的就是使 .NET 各个平台之间更加统一…

Oracle入门(十四.18)之使用动态SQL

一、SQL的执行流程数据库中的所有SQL语句都经历了不同的阶段&#xff1a; •解析&#xff1a;预执行“这可能吗&#xff1f;”检查包括语法&#xff0c;对象存在&#xff0c;权限等 •绑定&#xff1a;获取语句中引用的任何变量的实际值 •执行&#xff1a;语句被执行。•提取&…

天平游码读数例题_初二上册物理实验——托盘天平使用的注意事项

今天给大家讲讲托盘天平的使用和注意事项。(1)首先&#xff0c;我们回忆一下什么是托盘天平如下图托盘天平由底座、横梁、分度盘、托盘、平衡螺母、标尺、游码、托盘等组成&#xff0c;当然还有砝码。托盘天平是称量物体的质量的工具(质量符号m&#xff0c;单位&#xff1a;国际…

3.elasticsearch文档查询dsl

【README】 1.本文elasticsearch版本是 7.2.1&#xff1b; 2.文档查询语句叫做 DSL&#xff0c; domain structure language&#xff0c; 领域特定语言&#xff1b;dsl&#xff0c;参见 Query DSL | Elasticsearch Guide [7.2] | Elastic 3.elasticsearch 基于json 提供了完…

Oracle入门(十四.19)之触发器简介

一、触发器的需求让我们从一个例子开始吧&#xff1a;一条业务规则规定&#xff0c;只要员工的工资发生变化&#xff0c;变更就必须记录在日志记录表中。 可以创建两个过程来执行此操作&#xff1a;UPD_EMP_SAL更新工资&#xff0c;LOG_SAL_CHANGE将行插入日志表。可以从UPD_EM…

搜狐视频Redis私有云cachecloud开源了

项目地址&#xff1a;https://github.com/sohutv/cachecloud/ 一、CacheCloud是做什么的 CacheCloud提供一个Redis云管理平台&#xff1a;实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减…

springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

在实际的开发项目中&#xff0c;一个对外暴露的接口往往会面临&#xff0c;瞬间大量的重复的请求提交&#xff0c;如果想过滤掉重复请求造成对业务的伤害&#xff0c;那就需要实现幂等&#xff01;我们来解释一下幂等的概念&#xff1a;任意多次执行所产生的影响均与一次执行的…

Oracle入门(十四.21)之创建DML触发器:第二部分

一、使用条件谓词 在上文中&#xff0c;看到了一个触发器&#xff0c;可以防止在周末插入EMPLOYEES&#xff1a; CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGINIF TO_CHAR(SYSDATE,DY) IN (SAT,SUN) THENRAISE_APPLICATION_ERROR(-20500,You may ins…

【直播预告】创享未来 2016微软开发者峰会

感谢所有中国开发者对2016微软开发者峰会的热情关注&#xff0c;目前活动已经截止报名了&#xff0c;不过M姐为大家带来新的福利&#xff1a; 2016微软开发者峰会将全程线上直播&#xff01; 2016微软开发者峰会将全程线上直播&#xff01; 2016微软开发者峰会将全程线上直播…