Redis 系列 (一) StackExchange.Redis的使用
一、DLL安装
用NuGet搜索StackExchange.Redis,然后下载就可以。
ConnectionMultiplexer对象是StackExchange.Redis最中枢的对象。这个类的实例需要被整个应用程序域共享和重用的,不要在每个操作中不停的创建该对象的实例,所以使用单例来创建和存放这个对象。
代码:
private static ConfigurationOptions configurationOptions = ConfigurationOptions.Parse("127.0.0.1" + ":" + "6379"); private static readonly object Locker = new object();
private static ConnectionMultiplexer redisConn; /// <summary> /// 单例获取 /// </summary> public static ConnectionMultiplexer RedisConn { get { if (redisConn == null) { lock (Locker) { if (redisConn == null || !redisConn.IsConnected) { redisConn = ConnectionMultiplexer.Connect(configurationOptions); } } } return redisConn; } }
IDatabase db = redis.GetDatabase();
这里的GetDatabase() 返回的db对象是很轻量级别的,不需要被缓存起来,每次用每次取即可。IDatabase 的所有方法都有同步和异步的实现。其中的异步实现都是可以await的。
二、Strings的相关方法
具体代码:
var db = conn.GetDatabase(); #region Strings命令 string key = "keyTest1"; //SET命令 db.StringSet(key, "10"); //GET命令 string value = db.StringGet(key); Console.WriteLine(value); //APPEND命令 db.StringAppend(key, "10"); value = db.StringGet(key); Console.WriteLine(value); //有第二个参数(整数,参看StringIncrement方法)为DECRBY命令 //没有第二个参数为DECR命令 db.StringDecrement(key); value = db.StringGet(key); Console.WriteLine(value); //有第二个参数为INCRBY命令 //没有第二个参数为INCR命令 db.StringIncrement(key, 2); value = db.StringGet(key); Console.WriteLine(value); string key2 = "keyTest"; //SETEX命令,带过期时间 db.StringSet(key2, "keyTest2", new TimeSpan(0, 0, 5)); string value2 = db.StringGet(key2); Console.WriteLine(value2); Thread.Sleep(5 * 1000); //超过5s后,查不到该值 value2 = db.StringGet(key2); Console.WriteLine("5s later:" + value2); //GETSET命令,读出原来的值,并附新值 //下面两个是测试 value = db.StringGetSet(key, "2000"); Console.WriteLine(value); value = db.StringGet(key); Console.WriteLine(value); //MSET命令 db.StringSet(new KeyValuePair<RedisKey, RedisValue>[] { new KeyValuePair<RedisKey, RedisValue>("key1", "value1"), new KeyValuePair<RedisKey, RedisValue>("key2", "value2"), }); //MGET命令 RedisValue[] values = db.StringGet(new RedisKey[] { "key1", "key2" }); Console.WriteLine(values[0] + "&&" + values[1]); #endregion
运行结果:
三、Hashes的相关方法
具体代码:
var db = conn.GetDatabase(); #region Hash命令 string key = "mykey"; //避免key重复 db.KeyDelete(key); //HSET命令 db.HashSet(key, "a", "1"); //HGET命令 string value = db.HashGet(key, "a"); Console.WriteLine(value); //HMSET db.HashSet(key, new HashEntry[] { new HashEntry("b", "2"), new HashEntry("c", "3") }); //HMGET HashEntry[] values = db.HashGetAll(key); Console.WriteLine(values[0].Name + "///" + values[0].Value); //HDEL db.HashDelete(key, "c"); string valuec = db.HashGet(key, "c"); Console.WriteLine("c:" + valuec); //HEXISTS Console.WriteLine(db.HashExists(key, "a")); #endregion
运行结果:
四、Lists的相关方法
具体代码:
var db = conn.GetDatabase(); #region List命令 string key = "mykey"; db.KeyDelete(key); //LPUSH long index = db.ListLeftPush(key, "test"); //LINDEX,index返回总的长度,index必须减一 string value = db.ListGetByIndex(key, index - 1); Console.WriteLine(value); //LINSTER long index2 = db.ListInsertAfter(key, "test", "testright"); string value2 = db.ListGetByIndex(key, index2 - 1); Console.WriteLine(value2); long index3 = db.ListInsertBefore(key, "test", "testleft"); string value3 = db.ListGetByIndex(key, index - 1); //LRANGE RedisValue[] values = db.ListRange(key); Console.WriteLine("values:begin"); values.ToList().ForEach((v) => { Console.WriteLine(v); }); Console.WriteLine("values:end"); //LREM long index4 = db.ListRemove(key, "test"); values = db.ListRange(key); Console.WriteLine("values2:begin"); values.ToList().ForEach((v) => { Console.WriteLine(v); }); Console.WriteLine("values2:end"); //LPOP string value5 = db.ListLeftPop(key); Console.WriteLine(value5); values = db.ListRange(key); Console.WriteLine("values3:begin"); values.ToList().ForEach((v) => { Console.WriteLine(v); }); Console.WriteLine("values3:end"); Console.WriteLine(value3); #endregion
运行结果:
五、最后
现在只简单学会使用Strings、Hashes和Lists,还有很多以后再研究使用。