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