1、安装了一下Redis,有绿色版,很方便,配置也很简单;
2、试验了一下主从复制,效果没大规模进行,不是很了解,Master可以读写,但Slave只能读,利用这个性质可以进行读写分离,提高吞吐性能;
3、用C#(ServiceStack.Redis)访问了一下,没什么很特别的;
4、ServiceStack并不是传统意义上的线程安全,仅仅适用每个线程用自己的RedisClient才会安全,多个线程用同一个Client还是会有问题的。潜在问题当然是死锁。
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); } } }
时间: 2024-10-29 12:09:12