1、安装了一下Redis,有绿色版,很方便,配置也很简单;
2、试验了一下主从复制,效果没大规模进行,不是很了解,Master可以读写,但Slave只能读,利用这个性质可以进行读写分离,提高吞吐性能;
3、用C#(ServiceStack.Redis)访问了一下,没什么很特别的;
4、ServiceStack并不是传统意义上的线程安全,仅仅适用每个线程用自己的RedisClient才会安全,多个线程用同一个Client还是会有问题的。潜在问题当然是死锁。
5、Redis本身并不提供分布式,但只要进行简单封装,也很容易得到分布式效果,不过真正要做到好,高可靠也不是容易的事情,当然事情也不要想得过于复杂,适合就好。
using (RedisClient redisClient = new RedisClient(host, 6379))
{
//获取指定Key的值,没有为空null;
string theV = redisClient.Get<string>(elementKey);
this.textBox1.Text = theV;
//设置一个Key-value对,Key存在则修改.
//这个泛型封装是作者库里专门为C#类型做了转换,可以简化你的编程,Redis本身没有这么丰富的类型.
redisClient.Set<string>("KeyAAA","sadfsdffdsa");
//事务
using (IRedisTransaction IRT = redisClient.CreateTransaction())
{
try
{
IRT.QueueCommand(r => r.Set("keyA", 20));
IRT.QueueCommand(r => r.Increment("keyA", 1));
//注意,如果有下面这条语句,提交事务会报错,这说明启动事务后的
//Client操作都必须在IRT内调用.
//redisClient.Set<string>("KeyABC", "sadfsdffdsa");
//throw new Exception("数据库操作错误!");
// 提交事务
IRT.Commit();
}
catch
{
IRT.Rollback();
}
//keyA不存在,但KeyABC的值存在.
string theV1 = redisClient.Get<int>("keyA").ToString();
string theV2 = redisClient.Get<string>("KeyABC");
//并发锁
redisClient.Add("mykey", 1);
// 支持IRedisTypedClient和IRedisClient
//注意这里是Form调用,测试不出效果,如果是网页程序,则可获得锁效果.
using (redisClient.AcquireLock("testlock"))
{
var counter = redisClient.Get<int>("mykey");
Thread.Sleep(100);
redisClient.Set("mykey", counter + 1);
}
}
}