首页 > 代码库 > Redis Master/Slave 实践
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 = http://www.mamicode.com/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 监控:
Redis Master/Slave 实践