using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; namespace WorkSample.StackExchange.Redis { class Program { // static readonly ConcurrentQueue<VehicleStationStatement> vehicleStationStatementsCenter = new ConcurrentQueue<VehicleStationStatement>(); static void Main(string[] args) { // 1 001 广州东东信息技术有限公司 // 2 002 广州西西信息技术有限公司 var settlementCompanies = new List<SettlementCompany> { new SettlementCompany { Id = 1, Code = "001", Name = "广州东东信息技术有限公司" }, new SettlementCompany { Id = 2, Code = "002", Name = "广州西西信息技术有限公司" } }; // 汽车站场信息 // 1 001 东站 conn001token12 // 2 002 西站 conn002token12 var vehicleStations = new List<VehicleStation> { new VehicleStation { Id = 1, Code = "001", Name = "东站", Token = @" Data Source = (localdb)MSSQLLocalDB; Initial Catalog = VehicleStationEast; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; ApplicationIntent = ReadWrite; MultiSubnetFailover = False" }, new VehicleStation { Id = 2, Code = "002", Name = "西站", Token = @" Data Source = (localdb)MSSQLLocalDB; Initial Catalog = VehicleStationWest; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; ApplicationIntent = ReadWrite; MultiSubnetFailover = False" } }; // 校准配置信息 // 1 001 东站 001 广州东东信息技术有限公司 00010 东东 // 2 001 东站 002 广州西西信息技术有限公司 00012 西西 // 3 002 西站 001 广州东东信息技术有限公司 00001 广州东东信息技术有限公司 // 4 002 西站 002 广州西西信息技术有限公司 00002 广州西西信息技术有限公司 var correctionConfigurations = new List<CorrectionConfiguration> { new CorrectionConfiguration { Id = 1, VehicleStationCode = "001", VehicleStationName = "东站", SettlementCompanyCode = "001", SettlementCompanyName = "广州东东信息技术有限公司", CorrectionSettlementCompanyCode = "00010", CorrectionSettlementCompanyName = "东东" }, new CorrectionConfiguration { Id = 2, VehicleStationCode = "001", VehicleStationName = "东站", SettlementCompanyCode = "002", SettlementCompanyName = "广州西西信息技术有限公司", CorrectionSettlementCompanyCode = "00012", CorrectionSettlementCompanyName = "西西" }, new CorrectionConfiguration { Id = 3, VehicleStationCode = "002", VehicleStationName = "西站", SettlementCompanyCode = "001", SettlementCompanyName = "广州东东信息技术有限公司", CorrectionSettlementCompanyCode = "00001", CorrectionSettlementCompanyName = "广州东东信息技术有限公司" }, new CorrectionConfiguration { Id = 4, VehicleStationCode = "002", VehicleStationName = "西站", SettlementCompanyCode = "002", SettlementCompanyName = "广州西西信息技术有限公司", CorrectionSettlementCompanyCode = "00002", CorrectionSettlementCompanyName = "广州西西信息技术有限公司" }, }; // 东站结算信息 // 1 [东站。100.0。东东] 00010 东东 2018-08-24 01:01 null // 2 [东站。123.0。西西] 00012 西西 2018-08-24 01:02 null /* var vehicleStationStatementsEast = new List<VehicleStationStatement> { new VehicleStationStatement { Id = 1, Detail = "[东站。100.0。东东]", Code = "00010", Name = "东东", CreateTime = DateTime.Parse("2018-08-24 01:01:00"), UpdateTime = DateTime.Parse("2018-08-24 01:05:00") }, new VehicleStationStatement { Id = 2, Detail = "[东站。123.0。西西]", Code = "00012", Name = "西西", CreateTime = DateTime.Parse("2018-08-24 01:02:00"), UpdateTime = DateTime.Parse("2018-08-24 01:05:00") } }; */ // 西站结算信息 // 1 [西站。101.0。广州东东信息技术有限公司] 00001 广州东东信息技术有限公司 2018-08-24 01:04 null // 2 [西站。124.0。广州西西信息技术有限公司] 00002 广州西西信息技术有限公司 2018-08-24 01:03 null /* var vehicleStationStatementsWest = new List<VehicleStationStatement> { new VehicleStationStatement { Id = 1, Detail = "[西站。101.0。广州东东信息技术有限公司]", Code = "00001", Name = "广州东东信息技术有限公司", CreateTime = DateTime.Parse("2018-08-24 01:04:00"), UpdateTime = DateTime.Parse("2018-08-24 01:05:00") }, new VehicleStationStatement { Id = 2, Detail = "[西站。124.0。广州西西信息技术有限公司]", Code = "00002", Name = "广州西西信息技术有限公司", CreateTime = DateTime.Parse("2018-08-24 01:03:00"), UpdateTime = DateTime.Parse("2018-08-24 01:05:00") } }; */ /* Parallel.Invoke( () => { // 1 [东站。99。东东] 00010 东东 2018-08-24 01:01:00 2018-08-24 01:01:00 var code = "00010"; var name = "东东"; for (var i = 0; i < 10000; i++) { using (var connection = new SqlConnection(vehicleStations[0].Token)) { var command = new SqlCommand(@" INSERT INTO [VehicleStationStatement](Detail,Code,Name,CreateTime,UpdateTime) VALUES(@Detail,@Code,@Name,@CreateTime,@UpdateTime) ", connection); command.Parameters.AddWithValue("Detail", $"[{vehicleStations[0].Name}。{new Random().Next(1, 100)}。{name}。{i}]"); command.Parameters.AddWithValue("Code", code); command.Parameters.AddWithValue("Name", name); command.Parameters.AddWithValue("CreateTime", DateTime.Now); command.Parameters.AddWithValue("UpdateTime", DateTime.Now); connection.Open(); command.ExecuteNonQuery(); } } }, () => { // 2 [东站。99。西西] 00012 西西 2018-08-24 01:01:00 2018-08-24 01:01:00 var code = "00012"; var name = "西西"; for (var i = 0; i < 20000; i++) { using (var connection = new SqlConnection(vehicleStations[0].Token)) { var command = new SqlCommand(@" INSERT INTO [VehicleStationStatement](Detail,Code,Name,CreateTime,UpdateTime) VALUES(@Detail,@Code,@Name,@CreateTime,@UpdateTime) ", connection); command.Parameters.AddWithValue("Detail", $"[{vehicleStations[0].Name}。{new Random().Next(1, 100)}。{name}。{i}]"); command.Parameters.AddWithValue("Code", code); command.Parameters.AddWithValue("Name", name); command.Parameters.AddWithValue("CreateTime", DateTime.Now); command.Parameters.AddWithValue("UpdateTime", DateTime.Now); connection.Open(); command.ExecuteNonQuery(); } } }, () => { // 1 [西站。99。广州东东信息技术有限公司] 00001 广州东东信息技术有限公司 2018-08-24 01:01:00 2018-08-24 01:01:00 var code = "00001"; var name = "广州东东信息技术有限公司"; for (var i = 0; i < 30000; i++) { using (var connection = new SqlConnection(vehicleStations[1].Token)) { var command = new SqlCommand(@" INSERT INTO [VehicleStationStatement](Detail,Code,Name,CreateTime,UpdateTime) VALUES(@Detail,@Code,@Name,@CreateTime,@UpdateTime) ", connection); command.Parameters.AddWithValue("Detail", $"[{vehicleStations[1].Name}。{new Random().Next(1, 100)}。{name}。{i}]"); command.Parameters.AddWithValue("Code", code); command.Parameters.AddWithValue("Name", name); command.Parameters.AddWithValue("CreateTime", DateTime.Now); command.Parameters.AddWithValue("UpdateTime", DateTime.Now); connection.Open(); command.ExecuteNonQuery(); } } }, () => { // 2 [西站。99。广州西西信息技术有限公司] 00002 广州西西信息技术有限公司 2018-08-24 01:01:00 2018-08-24 01:01:00 var code = "00002"; var name = "广州西西信息技术有限公司"; for (var i = 0; i < 40000; i++) { using (var connection = new SqlConnection(vehicleStations[1].Token)) { var command = new SqlCommand(@" INSERT INTO [VehicleStationStatement](Detail,Code,Name,CreateTime,UpdateTime) VALUES(@Detail,@Code,@Name,@CreateTime,@UpdateTime) ", connection); command.Parameters.AddWithValue("Detail", $"[{vehicleStations[1].Name}。{new Random().Next(1, 100)}。{name}。{i}]"); command.Parameters.AddWithValue("Code", code); command.Parameters.AddWithValue("Name", name); command.Parameters.AddWithValue("CreateTime", DateTime.Now); command.Parameters.AddWithValue("UpdateTime", DateTime.Now); connection.Open(); command.ExecuteNonQuery(); } } } ); */ var database = RedisHelper.GetConnectionMultiplexer().GetDatabase(); Parallel.ForEach(vehicleStations, (vehicleStation) => { var connection = new SqlConnection(vehicleStation.Token); var command = new SqlCommand(@" SELECT Id,Detail,Code,Name,CreateTime,UpdateTime FROM [VehicleStationStatement]", connection); connection.Open(); using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { var id = reader.GetInt32(0); var detail = reader.GetString(1); var code = reader.GetString(2); var name = reader.GetString(3); var createTime = reader.GetDateTime(4); var updateTime = reader.GetDateTime(5); var config = correctionConfigurations.SingleOrDefault(v => v.VehicleStationCode == vehicleStation.Code && v.CorrectionSettlementCompanyCode == code); if (config == null) break; // vehicleStationStatementsCenter.Enqueue(new VehicleStationStatement // { // Id = 0, // Detail = detail, // Code = config.SettlementCompanyCode, // Name = config.SettlementCompanyName, // CreateTime = createTime, // UpdateTime = updateTime // }); database.ListRightPush("VehicleStationStatement", JsonConvert.SerializeObject(new VehicleStationStatement { Id = 0, Detail = detail, Code = config.SettlementCompanyCode, Name = config.SettlementCompanyName, CreateTime = createTime, UpdateTime = updateTime })); } } }); // Console.WriteLine(vehicleStationStatementsCenter.Count); Console.WriteLine(database.ListLength("VehicleStationStatement")); Parallel.Invoke( () => { while (database.ListLength("VehicleStationStatement") > 0) { Console.WriteLine($"[01] {database.ListLeftPop("VehicleStationStatement")}"); } }, () => { while (database.ListLength("VehicleStationStatement") > 0) { Console.WriteLine($"[02] {database.ListLeftPop("VehicleStationStatement")}"); } }, () => { while (database.ListLength("VehicleStationStatement") > 0) { Console.WriteLine($"[03] {database.ListLeftPop("VehicleStationStatement")}"); } } ); } } public class SettlementCompany { public int Id { get; set; } public string Code { get; set; } public string Name { get; set; } } public class VehicleStation { public int Id { get; set; } public string Code { get; set; } public string Name { get; set; } public string Token { get; set; } } public class CorrectionConfiguration { public int Id { get; set; } public string VehicleStationCode { get; set; } public string VehicleStationName { get; set; } public string SettlementCompanyCode { get; set; } public string SettlementCompanyName { get; set; } public string CorrectionSettlementCompanyCode { get; set; } public string CorrectionSettlementCompanyName { get; set; } } public class VehicleStationStatement { public int Id { get; set; } public string Detail { get; set; } public string Code { get; set; } public string Name { get; set; } public DateTime CreateTime { get; set; } public DateTime? UpdateTime { get; set; } } public static class RedisHelper { private static readonly ConcurrentDictionary<string, ConnectionMultiplexer> _connectionMultiplexers = new ConcurrentDictionary<string, ConnectionMultiplexer>(); private static readonly object _locker = new object(); private static ConnectionMultiplexer _connectionMultiplexer; public static ConnectionMultiplexer GetConnectionMultiplexer(string connectionString = "localhost") { if (_connectionMultiplexer == null) { lock (_locker) { if (_connectionMultiplexer == null || _connectionMultiplexer.IsConnected == false) { if (_connectionMultiplexers.ContainsKey(connectionString) == false) { var connectionMultiplexer = ConnectionMultiplexer.Connect(connectionString); connectionMultiplexer.ConfigurationChanged += ConfigurationChanged; connectionMultiplexer.ConfigurationChangedBroadcast += ConfigurationChangedBroadcast; connectionMultiplexer.ConnectionFailed += ConnectionFailed; connectionMultiplexer.ConnectionRestored += ConnectionRestored; connectionMultiplexer.ErrorMessage += ErrorMessage; connectionMultiplexer.HashSlotMoved += HashSlotMoved; connectionMultiplexer.InternalError += InternalError; _connectionMultiplexers[connectionString] = connectionMultiplexer; } _connectionMultiplexer = _connectionMultiplexers[connectionString]; } } } return _connectionMultiplexer; } private static void ConfigurationChanged(object sender, EndPointEventArgs e) { Console.WriteLine($"ConfigurationChanged"); // e.EndPoint } private static void ConfigurationChangedBroadcast(object sender, EndPointEventArgs e) { Console.WriteLine($"ConfigurationChangedBroadcast"); } private static void ConnectionFailed(object sender, ConnectionFailedEventArgs e) { Console.WriteLine($"ConnectionFailed"); } private static void ConnectionRestored(object sender, ConnectionFailedEventArgs e) { Console.WriteLine($"ConnectionRestored"); } private static void ErrorMessage(object sender, RedisErrorEventArgs e) { Console.WriteLine($"ErrorMessage"); } private static void HashSlotMoved(object sender, HashSlotMovedEventArgs e) { Console.WriteLine($"HashSlotMoved"); } private static void InternalError(object sender, InternalErrorEventArgs e) { Console.WriteLine($"InternalError"); } } } // Install-Package StackExchange.Redis // Install-Package Newtonsoft.Json