zoukankan      html  css  js  c++  java
  • Redis Master/Slave 实践

    本次我们将模拟 Master(1) + Slave(4) 的场景,并通过ASP.NET WEB API进行数据的提交及查询,监控 Redis Master/Slave 数据分发情况,只大致概述,不会按照step by step的方式一一列举.

    API List:

    [POST]:http://localhost:53964/api/persons
    Accept:application/json ,Content-Type:application/json

    {
        "Id": 2,
        "Name": "Leo.J.Liu"
    }
    

      

    [GET]:http://localhost:53964/api/persons/1
    Accept:application/json ,Content-Type:application/json

    {
        "Id": 2,
        "Name": "Leo.J.Liu"
    }
    

      

    AutoMapper 自动转换Request DTO 与 DomainEntity

    private readonly IPersonService personService;
    
    public PersonsController(IPersonService personService)
    {
         this.personService = personService;
    }
    

      

     public HttpResponseMessage GetPerson(int id)
            {
                var person = personService.GetPersonById(id);
                if (person == null)
                {
                    var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
                    {
                        Content = new StringContent(string.Format("No person with ID = {0}", id)),
                        ReasonPhrase = "Person ID Not Found"
                    };
                    throw new HttpResponseException(resp);
                };
                return Request.CreateResponse(HttpStatusCode.OK, person);
            }
    

      

    public HttpResponseMessage AddPerson([FromBody] PersonRequestDto personDto)
            {
                Person person = Mapper.Map<PersonRequestDto,Person>(personDto);
                var persons = personService.AddPerson(person);
                return Request.CreateResponse(HttpStatusCode.OK, persons);
            }
    
    Application_Start 中完成AutoMapper注册
    
    public class AutoMapperConfig
        {
            public static void RegisterMappings()
            {
                Mapper.Initialize(c =>
                {
                    c.CreateMap<PersonRequestDto,Person>().ForMember(s=>s.UserAge,d=>d.MapFrom(e=>e.Age));
                });
            }
        }

    采用StackExchange.Redis 作为Redis的Client,其中(6379为Master,提供写操作),(6380~6382为Slave,提供查询操作)
    public  class RedisService<T> where T : new()
        {
            public static ConfigurationOptions QueryConfig = new ConfigurationOptions
            {
                EndPoints =
                    {
                        { "localhost", 6380 },
                        { "localhost", 6381 },
                        { "localhost", 6382 }
                    },
            };
    
            public static ConfigurationOptions SaveConfig = new ConfigurationOptions
            {
                EndPoints =
                    {
                        { "localhost", 6379 }
                    },
            };
    
            public static T Get(string type,string key)
            {
                ConnectionMultiplexer redis =
                    ConnectionMultiplexer.Connect(QueryConfig);
    
                IDatabase db = redis.GetDatabase();
    
                string value = db.StringGet(string.Format("{0}:{1}",type,key));
    
                return JsonConvert.DeserializeObject<T>(value);
            }
    
    
            public static bool Save(string type, string key, T reqDto)
            {
                ConnectionMultiplexer redis =
                    ConnectionMultiplexer.Connect(SaveConfig);
    
                IDatabase db = redis.GetDatabase();
    
                string json = JsonConvert.SerializeObject(reqDto);
    
                return db.StringSet(string.Format("{0}:{1}", type, key), json);
            }
        }
    
    SimpleInjector 作为Ioc Container
    public static class SimpleInjectorWebApiInitializer
        {
            public static void Initialize()
            {
                var container = new Container();
                
                InitializeContainer(container);
    
                container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
           
                container.Verify();
                
                GlobalConfiguration.Configuration.DependencyResolver =
                    new SimpleInjectorWebApiDependencyResolver(container);
            }
         
            private static void InitializeContainer(Container container)
            {
                container.Register<IPersonService, PersonService>();
                container.Register<IRepository<Person>, PersonRepository>();
            }
        }
    

      

    public class PersonRepository : IRepository<Person>
        {
    
            public List<Person> GetAll()
            {
                return RedisService<List<Person>>.Get("persons",string.Empty);
            }
    
            public Person GetById(int id)
            {
                return RedisService<Person>.Get("persons",id.ToString());
            }
    
            public bool Add(Person reqDto)
            {
                return RedisService<Person>.Save("persons", reqDto.Id.ToString(), reqDto);
            }
    
            public bool Update(Person reqDto)
            {
                throw new NotImplementedException();
            }
    
            public bool Remove(Person reqDto)
            {
                throw new NotImplementedException();
            }
        }
    

      


    Redis 配置介绍:

    Step1: 下载Redis

    Step2: 分别创建如下图所示目录 data_1~data_4,redis_1.config~redis_4.config

    data_1,redis_1.config 为Master 存储目录及配置文件

    data_2~data_4,redis_2.config~ redis_4.config为Slave 存储目录及配置文件

    redis_2.config~ redis_4.config配置说明:

    port:6380~6381

    dir:./data_2/~./data_4/

    slaveof localhost 6379

    Redis Desktop Manager 监控:

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    基于分布式锁解决定时任务重复问题
    基于Redis的Setnx实现分布式锁
    基于数据库悲观锁的分布式锁
    使用锁解决电商中的超卖
  • 原文地址:https://www.cnblogs.com/darjuan/p/4120670.html
Copyright © 2011-2022 走看看