本文介绍系统缓存组件,采用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集群缓存相关推荐

  1. Net分布式系统之五:C#使用Redis集群缓存

    本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层. 一.背景 系统考虑到高并发的使用场景.对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决.对于系统高并发查询,为了提供性能减 ...

  2. 阿里云Redis之:配置程序接入阿里云Redis集群缓存数据(十七)

    文章目录 1.配置Redis白名单及账号密码 1.1.配置白名单 1.2.配置Redis账号密码 1.3.在ECS中测试是否能连接Redis 2.设置Redis集群为免密登录 3.配置KodCloud ...

  3. 理解并从头搭建redis集群

    部分开发人员工作当中只是在应用中使用redis,比如用来做数据结果的缓存.而且现在有很多不错的redis客户端工具(redisson),基本上可以不用关注redis命令就可以完成相当部分的功能.所以可 ...

  4. Redis集群~StackExchange.redis连接Sentinel服务器并订阅相关事件

    对于redis-sentinel我在之前的文章中Redis集群~StackExchange.redis连接Twemproxy代理服务器 已经说过,它是一个仲裁者,当主master挂了后,它将在所有sl ...

  5. Redis集群~StackExchange.redis连接Twemproxy代理服务器

    本文是Redis集群系列的一篇文章,主要介绍使用StackExchange.Redis进行Twemproxy(文中简称TW)代理服务的连接过程,事务上,对于TW来说,我们需要理解一下它的物理架构,它类 ...

  6. Redis集群——利用Gearman在Lnmp架构中做MySQL的缓存服务器

    一.概述 Redis的集群主要是使用切片技术来搭建的,简单来说就是把所有KEY分散存放到不同的redis节点上(不要把鸡蛋都放在一个篮子里). 1. 集群基本原理 Redis集群中内置了16384个槽 ...

  7. redis 集群搭建_Redis分布式缓存分布式集群搭建

    当你试图解决一个你不理解的问题时,复杂化就产成了.-Andy Boothe Redis集群安装部署 Redis是一个运行在内存的非关系型数据库,因为其速度快(效率高),支持数据的持久化(安全),事务操 ...

  8. 高性能网站架构设计之缓存篇(6)- Redis 集群(中)

    昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势. 我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我 ...

  9. 高性能网站架构之缓存篇—Redis集群搭建

    看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...

最新文章

  1. spring使用AOP注解三步曲
  2. 关于Tomcat上请求的编解码问题
  3. iOS从零开始学习直播之音频2.后台播放和在线播放
  4. 店宝宝电脑版_起名字 测名字神器 电脑安卓全有了
  5. scrapy 动态IP、随机UA、验证码
  6. 武大金融工程和计算机专业,求解!武大的金融工程可以排第几
  7. mysql5.6初级使用方法学习第三天
  8. VS2010下安装Opencv
  9. 全球及中国创新药产业研发格局及应用价值分析报告2021-2027年
  10. 初识 Hbase 数据库
  11. yum安装zabbix包失败问题
  12. 三级联动的数据库(贼多)
  13. 读研究生应该做什么?导师会帮你什么?
  14. 网页版在线使用PS网站源码
  15. Grafana图标嵌入第三方系统及可选择四种模式(kiosk)
  16. 谷歌表格图表 横坐标 滚动_如何将图表从Google表格同步到文档或幻灯片
  17. Python实操笔记(2)——海龟绘图法绘制有层次感的奥运五环
  18. mysql连接耗尽_避免数据库连接被耗尽的三种配置
  19. 构建自己的gym训练环境
  20. 安卓13开发者模式怎么开?

热门文章

  1. 4. MyBatis几个可以优化的地方
  2. crontab执行shell脚本日志中出现乱码
  3. 51CTO交流摘录(1):SOC的定义、适用性和组成
  4. 【鉴权/授权】一步一步实现一个简易JWT鉴权
  5. ASP.NET Core使用编译时依赖关系注入(DI)
  6. WPF XAML 为项目设置全局样式
  7. WPF GridControl控件的用法举例
  8. C# 无意间写了一段线程死锁的代码
  9. 谈谈MySQL面试的45个常见问题
  10. Web通用令牌JwtBuilder