• 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 监控:

  • 相关阅读:
    理解HashSet及使用
    Java 集合类详解
    Java-泛型编程-使用通配符? extends 和 ? super
    回调函数及其用法
    log4j.properties 详解与配置步骤
    约瑟夫环
    泛型的约束与局限性
    把代码字体加大的办法
    System.arraycopy方法
    泛型数组列表与反射
  • 原文地址:https://www.cnblogs.com/darjuan/p/4120670.html
Copyright © 2020-2023  润新知