public void GetLockAge_ValidTicks()
        {
            var mockRedisClient = A.Fake<IRedisClientConnection>();
            RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;

            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), "");
            Assert.NotNull(redisConn.GetLockAge(DateTime.Now.Ticks));
        }
        public void GetLockAge_InValidTicks()
        {
            var mockRedisClient = A.Fake<IRedisClientConnection>();
            RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;

            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), "");
            Assert.NotEqual(0, redisConn.GetLockAge("Invalid-tics").TotalHours);
        }
 private RedisConnectionWrapper GetRedisConnectionWrapperWithUniqueSession(ProviderConfiguration pc)
 {
     string id = Guid.NewGuid().ToString();
     uniqueSessionNumber++;
     // Initial connection with redis
     RedisConnectionWrapper.sharedConnection = null;
     RedisConnectionWrapper redisConn = new RedisConnectionWrapper(pc, id);
     return redisConn;
 }
 public void UpdateExpiryTime_Valid()
 {
     string sessionId = "session_id";
     var mockRedisClient = A.Fake<IRedisClientConnection>();
     RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
     RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
     RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), sessionId);
     redisConn.UpdateExpiryTime(90);
     A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 2),
         A<object[]>.That.Matches(o => o.Length == 1))).MustHaveHappened();
 }
 public void Set_NullData()
 {
     var mockRedisClient = A.Fake<IRedisClientConnection>();
     RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
     RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
     
     string sessionId = "session_id";
     RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), sessionId);
     redisConn.Set(null, 90);
     A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.Ignored, A<object[]>.Ignored)).MustNotHaveHappened();
 }
 public void Set_ValidData()
 {
     string sessionId = "session_id";
     var mockRedisClient = A.Fake<IRedisClientConnection>();
     RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
     RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
     RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), sessionId);
     ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection();
     data["key"] = "value";
     redisConn.Set(data, 90);
     A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 2), 
         A<object[]>.That.Matches(o => o.Length == 4))).MustHaveHappened();
 }
        public void Set_ValidData_WithCustomSerializer()
        {
            // this also tests host:port config part
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            pc.RedisSerializerType = typeof(TestSerializer).AssemblyQualifiedName;
            pc.ApplicationName     = "APPTEST";
            pc.Port = 6379;
            RedisUtility testSerializerRedisUtility = new RedisUtility(pc);

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession(pc);

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(testSerializerRedisUtility);
                data["key"]  = "value";
                data["key1"] = "value1";
                redisConn.Set(data, 900);

                // Get actual connection and get data blob from redis
                IDatabase   actualConnection     = GetRealRedisConnection(redisConn);
                HashEntry[] sessionDataFromRedis = actualConnection.HashGetAll(redisConn.Keys.DataKey);

                // Check that data shoud be same as what inserted
                Assert.Equal(2, sessionDataFromRedis.Length);
                ChangeTrackingSessionStateItemCollection dataFromRedis = new ChangeTrackingSessionStateItemCollection(testSerializerRedisUtility);
                foreach (HashEntry entry in sessionDataFromRedis)
                {
                    dataFromRedis[entry.Name] = testSerializerRedisUtility.GetObjectFromBytes(entry.Value).ToString();
                }
                Assert.Equal("value", dataFromRedis["key"]);
                Assert.Equal("value1", dataFromRedis["key1"]);

                // remove data from redis
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
        public void TryTakeWriteLockAndGetData_Valid()
        {
            string   id          = "session_id";
            DateTime lockTime    = DateTime.Now;
            int      lockTimeout = 90;
            object   lockId;
            ISessionStateItemCollection data;

            RedisConnectionWrapper.sharedConnection = A.Fake <RedisSharedConnection>();
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);

            redisConn.redisConnection = A.Fake <IRedisClientConnection>();

            object[] sessionData     = { "Key", RedisUtility.GetBytesFromObject("Key", "value") };
            object[] returnFromRedis = { lockTime.Ticks.ToString(), sessionData, "15", false };
            ChangeTrackingSessionStateItemCollection sessionDataReturn = Utility.GetChangeTrackingSessionStateItemCollection();

            sessionDataReturn["key"] = "value";

            A.CallTo(() => redisConn.redisConnection.Eval(A <string> .Ignored, A <string[]> .That.Matches(s => s.Length == 3),
                                                          A <object[]> .That.Matches(o => o.Length == 2))).Returns(returnFromRedis);
            A.CallTo(() => redisConn.redisConnection.GetLockId(A <object> .Ignored)).Returns(lockTime.Ticks.ToString());
            A.CallTo(() => redisConn.redisConnection.IsLocked(A <object> .Ignored)).Returns(false);
            A.CallTo(() => redisConn.redisConnection.GetSessionData(A <object> .Ignored)).Returns(sessionDataReturn);
            A.CallTo(() => redisConn.redisConnection.GetSessionTimeout(A <object> .Ignored)).Returns(15);

            int sessionTimeout;

            Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out data, out sessionTimeout));
            Assert.Equal(lockTime.Ticks.ToString(), lockId);
            Assert.Equal(1, data.Count);
            Assert.Equal(15, sessionTimeout);
            A.CallTo(() => redisConn.redisConnection.Eval(A <string> .Ignored, A <string[]> .That.Matches(s => s.Length == 3),
                                                          A <object[]> .That.Matches(o => o.Length == 2))).MustHaveHappened();
            A.CallTo(() => redisConn.redisConnection.GetLockId(A <object> .Ignored)).MustHaveHappened();
            A.CallTo(() => redisConn.redisConnection.IsLocked(A <object> .Ignored)).MustHaveHappened();
            A.CallTo(() => redisConn.redisConnection.GetSessionData(A <object> .Ignored)).MustHaveHappened();
            A.CallTo(() => redisConn.redisConnection.GetSessionTimeout(A <object> .Ignored)).MustHaveHappened();
        }
Exemple #9
0
        public static IServiceCollection AddBasicServices(this IServiceCollection collection)
        {
            var config = collection.GetConfiguration();
            var env    = collection.GetHostingEnvironment();

            if (collection.Where(x => x.ServiceType == typeof(ISerializeProvider)).IsEmpty_())
            {
                AddBasicNoDependencyServices(collection);
            }
            //加密相关
            var data_protect_builder = collection.AddFileBasedDataProtection_(config, env);
            //----------------------------------------------------------------------------------
            //redis-connection
            var redis_server = config.GetRedisConnectionString();

            if (ValidateHelper.IsNotEmpty(redis_server))
            {
                var redis_wrapper = new RedisConnectionWrapper(redis_server);
                collection.AddDisposableSingleInstanceService(redis_wrapper);
                //redis kv存储
                collection.AddScoped <IRedisAll>(provider =>
                {
                    var kv_db      = (int)ConfigSet.Redis.KV存储;
                    var serializer = provider.Resolve_ <ISerializeProvider>();
                    var helper     = new RedisHelper(redis_wrapper.Connection, kv_db, serializer);
                    return(helper);
                });
                //使用redis替换内存缓存
                collection.AddRedisCacheProvider_(redis_server);
                //加密私钥
                var db       = (int)ConfigSet.Redis.加密KEY;
                var app_name = config.GetAppName();
                data_protect_builder.PersistKeysToStackExchangeRedis(
                    () => redis_wrapper.Connection.SelectDatabase(db),
                    $"data_protection_key:{app_name}");
            }

            return(collection);
        }
Exemple #10
0
        public void Set_ExpireData()
        {
            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();
                // Inserting data into redis server that expires after 1 second
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection();
                data["key"] = "value";
                redisConn.Set(data, 1);

                // Wait for 2 seconds so that data will expire
                System.Threading.Thread.Sleep(1100);

                // Get actual connection and get data blob from redis
                IDatabase   actualConnection     = GetRealRedisConnection(redisConn);
                HashEntry[] sessionDataFromRedis = actualConnection.HashGetAll(redisConn.Keys.DataKey);

                // Check that data shoud not be there
                Assert.Equal(0, sessionDataFromRedis.Length);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
        public void TryUpdateIfLockIdMatch_ExpiryTime_OnValidData()
        {
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                data["key"]  = "value";
                data["key1"] = "value1";
                redisConn.Set(data, 900);

                // Check that data shoud exists
                int      lockTimeout = 90;
                DateTime lockTime    = DateTime.Now;
                object   lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out dataFromRedis, out sessionTimeout);
                Assert.Equal(2, dataFromRedis.Count);

                // Update expiry time to only 1 sec and than verify that.
                redisConn.TryUpdateAndReleaseLockIfLockIdMatch(lockId, dataFromRedis, 1);

                // Wait for 1.1 seconds so that data will expire
                System.Threading.Thread.Sleep(1100);

                // Get data blob from redis
                IDatabase   actualConnection = GetRealRedisConnection(redisConn);
                HashEntry[] sessionDataFromRedisAfterExpire = actualConnection.HashGetAll(redisConn.Keys.DataKey);

                // Check that data shoud not be there
                Assert.Equal(0, sessionDataFromRedisAfterExpire.Length);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
Exemple #12
0
        public void TryTakeWriteLockAndGetData_WriteLockWithOtherWriteLockWithSameLockId()
        {
            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection();
                data["key"] = "value";
                redisConn.Set(data, 900);

                int lockTimeout = 900;
                // Same LockId
                DateTime lockTime = DateTime.Now;

                // Takewrite lock successfully first time
                object lockId_1;
                ISessionStateItemCollection dataFromRedis_1;
                int sessionTimeout;
                Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId_1, out dataFromRedis_1, out sessionTimeout));
                Assert.Equal(lockTime.Ticks.ToString(), lockId_1.ToString());
                Assert.Equal(1, dataFromRedis_1.Count);

                // try to take write lock and fail and get earlier lock id
                object lockId_2;
                ISessionStateItemCollection dataFromRedis_2;
                Assert.False(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId_2, out dataFromRedis_2, out sessionTimeout));
                Assert.Equal(lockTime.Ticks.ToString(), lockId_2.ToString());
                Assert.Equal(null, dataFromRedis_2);

                // Get actual connection
                IDatabase actualConnection = GetRealRedisConnection(redisConn);
                // remove data and lock from redis
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                actualConnection.KeyDelete(redisConn.Keys.LockKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
        public void TryTakeReadLockAndGetData_WithOtherWriteLock()
        {
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                data["key"] = "value";
                redisConn.Set(data, 900);

                int lockTimeout = 900;

                DateTime lockTime_1 = DateTime.Now;
                object   lockId_1;
                ISessionStateItemCollection dataFromRedis_1;
                int sessionTimeout;
                Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime_1, lockTimeout, out lockId_1, out dataFromRedis_1, out sessionTimeout));
                Assert.Equal(lockTime_1.Ticks.ToString(), lockId_1.ToString());
                Assert.Equal(1, dataFromRedis_1.Count);

                object lockId_2;
                ISessionStateItemCollection dataFromRedis_2;
                Assert.False(redisConn.TryCheckWriteLockAndGetData(out lockId_2, out dataFromRedis_2, out sessionTimeout));
                Assert.Equal(lockTime_1.Ticks.ToString(), lockId_2.ToString());
                Assert.Equal(null, dataFromRedis_2);

                // Get actual connection
                // remove data and lock from redis
                IDatabase actualConnection = GetRealRedisConnection(redisConn);
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                actualConnection.KeyDelete(redisConn.Keys.LockKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
        public void TryReleaseLockIfLockIdMatch_InvalidWriteLockRelease()
        {
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                data["key"] = "value";
                redisConn.Set(data, 900);

                int lockTimeout = 900;

                DateTime lockTime = DateTime.Now;
                object   lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out dataFromRedis, out sessionTimeout));
                Assert.Equal(lockTime.Ticks.ToString(), lockId.ToString());
                Assert.Equal(1, dataFromRedis.Count);

                object wrongLockId = lockTime.AddSeconds(1).Ticks.ToString();
                redisConn.TryReleaseLockIfLockIdMatch(wrongLockId, 900);

                // Get actual connection and check that lock do not exists
                IDatabase actualConnection   = GetRealRedisConnection(redisConn);
                string    lockValueFromRedis = actualConnection.StringGet(redisConn.Keys.LockKey);
                Assert.Equal(lockId, lockValueFromRedis);

                // remove data from redis
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                actualConnection.KeyDelete(redisConn.Keys.LockKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
        public void TryCheckWriteLockAndGetData_Valid()
        {
            string id = "session_id";
            object lockId;
            ISessionStateItemCollection data;

            object[] sessionData     = { "Key", RedisUtility.GetBytesFromObject("value") };
            object[] returnFromRedis = { "", sessionData, "15" };
            ChangeTrackingSessionStateItemCollection sessionDataReturn = new ChangeTrackingSessionStateItemCollection();

            sessionDataReturn["key"] = "value";

            var mockRedisClient = A.Fake <IRedisClientConnection>();

            A.CallTo(() => mockRedisClient.Eval(A <string> .Ignored, A <string[]> .That.Matches(s => s.Length == 3),
                                                A <object[]> .That.Matches(o => o.Length == 0))).Returns(returnFromRedis);
            A.CallTo(() => mockRedisClient.GetLockId(A <object> .Ignored)).Returns("");
            A.CallTo(() => mockRedisClient.GetSessionData(A <object> .Ignored)).Returns(sessionDataReturn);
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A <object> .Ignored)).Returns(15);

            RedisConnectionWrapper.sharedConnection            = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);

            int sessionTimeout;

            Assert.True(redisConn.TryCheckWriteLockAndGetData(out lockId, out data, out sessionTimeout));
            Assert.Equal(null, lockId);
            Assert.Equal(1, data.Count);
            Assert.Equal(15, sessionTimeout);
            A.CallTo(() => mockRedisClient.Eval(A <string> .Ignored, A <string[]> .That.Matches(s => s.Length == 3),
                                                A <object[]> .That.Matches(o => o.Length == 0))).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetLockId(A <object> .Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionData(A <object> .Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A <object> .Ignored)).MustHaveHappened();
        }
        public void TryTakeWriteLockAndGetData_ExpireWriteLock()
        {
            ProviderConfiguration pc = Utility.GetDefaultConfigUtility();

            using (RedisServer redisServer = new RedisServer())
            {
                RedisConnectionWrapper redisConn = GetRedisConnectionWrapperWithUniqueSession();

                // Inserting data into redis server
                ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection(new RedisUtility(pc));
                data["key"] = "value";
                redisConn.Set(data, 900);

                int lockTimeout = 1;

                DateTime lockTime = DateTime.Now;
                object   lockId;
                ISessionStateItemCollection dataFromRedis;
                int sessionTimeout;
                Assert.True(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out dataFromRedis, out sessionTimeout));
                Assert.Equal(lockTime.Ticks.ToString(), lockId.ToString());
                Assert.Equal(1, dataFromRedis.Count);

                // Wait for 2 seconds so that lock will expire
                System.Threading.Thread.Sleep(1100);

                // Get actual connection and check that lock do not exists
                IDatabase actualConnection   = GetRealRedisConnection(redisConn);
                string    lockValueFromRedis = actualConnection.StringGet(redisConn.Keys.LockKey);
                Assert.Equal(null, lockValueFromRedis);

                // remove data from redis
                actualConnection.KeyDelete(redisConn.Keys.DataKey);
                DisposeRedisConnectionWrapper(redisConn);
            }
        }
 private void DisposeRedisConnectionWrapper(RedisConnectionWrapper redisConn)
 {
     redisConn.redisConnection.Close();
     RedisConnectionWrapper.sharedConnection = null;
 }
 private void DisposeRedisConnectionWrapper(RedisConnectionWrapper redisConn)
 {
     redisConn.redisConnection.Close();
     RedisConnectionWrapper.sharedConnection = null;
 }
        public void TryTakeWriteLockAndGetData_UnableToLock()
        {
            string id = "session_id";
            DateTime lockTime = DateTime.Now;
            int lockTimeout = 90;
            object lockId;
            ISessionStateItemCollection data;

            object[] returnFromRedis = { "Diff-lock-id", "", "15", true };

            var mockRedisClient = A.Fake<IRedisClientConnection>();
            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3),
                 A<object[]>.That.Matches(o => o.Length == 2))).Returns(returnFromRedis);
            A.CallTo(() => mockRedisClient.GetLockId(A<object>.Ignored)).Returns("Diff-lock-id");
            A.CallTo(() => mockRedisClient.IsLocked(A<object>.Ignored)).Returns(true);
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A<object>.Ignored)).Returns(15);

            RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);

            int sessionTimeout;
            Assert.False(redisConn.TryTakeWriteLockAndGetData(lockTime, lockTimeout, out lockId, out data, out sessionTimeout));
            Assert.Equal("Diff-lock-id", lockId);
            Assert.Null(data);
            Assert.Equal(15, sessionTimeout);
            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3),
                A<object[]>.That.Matches(o => o.Length == 2))).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetLockId(A<object>.Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.IsLocked(A<object>.Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionData(A<object>.Ignored)).MustNotHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A<object>.Ignored)).MustHaveHappened();
        }
Exemple #20
0
 public RedisCacheProvider_(IServiceProvider provider, RedisConnectionWrapper con, int db, ILogger <RedisCacheProvider_> logger)
 {
     this._redis  = new RedisHelper(con.Connection, db, provider.ResolveSerializer());
     this._db     = this._redis.Database;
     this._logger = logger;
 }
        public RedisDatabaseSelector(RedisConnectionWrapper redisConnectionWrapper)
        {
            var db = (int)WCloud.Core.ConfigSet.Redis.消息队列;

            this.database = redisConnectionWrapper.Connection.GetDatabase(db);
        }
Exemple #22
0
        static void Main(string[] args)
        {
            var redisConnectionWrapper = new RedisConnectionWrapper("***,defaultDatabase=0,password=***");

            #region 手动发布-信道a

            //using (var redisManager = new RedisCacheManager(redisConnectionWrapper))
            //{
            //    for (int i = 0; i < 10000; i++)
            //    {
            //        Thread.Sleep(1000);
            //        redisManager.PublishAsync("a", i.ToString()).Wait();
            //        Console.WriteLine($"发布信道a...值:{i}");
            //    }
            //}

            #endregion

            #region 修改键mykey,测试键监听订阅

            //因为开启键空间通知功能需要消耗一些 CPU , 所以在默认配置下, 该功能处于关闭状态。

            //可以通过修改 redis.conf 文件, 或者直接使用 CONFIG SET 命令来开启或关闭键空间通知功能:

            //当 notify-keyspace - events 选项的参数为空字符串时,功能关闭。
            //另一方面,当参数不是空字符串时,功能开启。
            //notify - keyspace - events 的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:

            //\begin{ array}
            //            [b] {| c |}
            //\hline 字符 &发送的通知  \\ 
            //\hline K  &键空间通知,所有通知以 `__keyspace@< db > __` 为前缀  \\ 
            //\hline E  &键事件通知,所有通知以 `__keyevent@< db > __` 为前缀  \\ 
            //\hline g  &DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知 \\ 
            //\hline $  &字符串命令的通知 \\ 
            //\hline l  &列表命令的通知 \\ 
            //\hline s  &集合命令的通知 \\ 
            //\hline h  &哈希命令的通知 \\ 
            //\hline z  &有序集合命令的通知 \\ 
            //\hline x  &过期事件:每当有过期键被删除时发送 \\ 
            //\hline e  &驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送 \\ 
            //\hline A  &参数 g$lshzxe 的别名,即all \\ 
            //\end{ array} \\
            //输入的参数中至少要有一个 K 或者 E , 否则的话, 不管其余的参数是什么, 都不会有任何通知被分发。
            //举个例子, 如果只想订阅键空间中和列表相关的通知, 那么参数就应该设为 Kl , 诸如此类。
            //将参数设为字符串 "AKE" 表示发送所有类型的通知。

            using (var redis = new RedisCacheManager(redisConnectionWrapper))
            {
                for (int i = 0; i < 100000; i++)
                {
                    Thread.Sleep(1000);
                    redis.Set("mykey", i, 1000);
                    Console.WriteLine($"写入mykey:{i}");
                }
            }

            #endregion

            Console.ReadKey();
        }
Exemple #23
0
 public RedisCacheProvider_(RedisConnectionWrapper con, int db)
 {
     this._redis = new RedisHelper(con.Connection, db);
     this._db    = this._redis.Database;
 }
Exemple #24
0
 private void DisposeRedisConnectionWrapper(RedisConnectionWrapper redisConn)
 {
     RedisConnectionWrapper.sharedConnection = null;
 }
        public void TryUpdateIfLockIdMatchPrepare_Valid_OneUpdateOneDelete()
        {
            string id = "session_id";
            int sessionTimeout = 900;
            object lockId = DateTime.Now.Ticks;
            ChangeTrackingSessionStateItemCollection data = new ChangeTrackingSessionStateItemCollection();
            data["KeyDel"] = "valueDel";
            data["Key"] = "value";
            data.Remove("KeyDel");

            
            var mockRedisClient = A.Fake<IRedisClientConnection>();
            RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);
            redisConn.TryUpdateAndReleaseLockIfLockIdMatch(lockId, data, sessionTimeout);

            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3), A<object[]>.That.Matches(
               o => o.Length == 11 &&
                    o[2].Equals(1) &&
                    o[3].Equals(9) &&
                    o[4].Equals(9) &&
                    o[5].Equals(1) &&
                    o[6].Equals(10) &&
                    o[7].Equals(11)
                ))).MustHaveHappened();
        }
        /// <summary>
        /// Helper method for serializing objects to Redis
        /// </summary>
        /// <param name="confirmedChangedObjects">keys and values that have definitely changed</param>
        /// <param name="allObjects">keys and values that have been accessed during the current HttpContext</param>
        /// <param name="allObjectsOriginalState">keys and serialized values before we tampered with them</param>
        /// <param name="deletedObjects">keys that were deleted during the current HttpContext</param>
        /// <param name="currentRedisHashId">The current Redis key name</param>
        /// <param name="redisConn">A connection to Redis</param>
        public static void SerializeToRedis(
            HttpContextBase context,
            RedisSessionStateItemCollection redisItems,
            string currentRedisHashId,
            TimeSpan expirationTimeout)
        {
            List <HashEntry>  setItems = new List <HashEntry>();
            List <RedisValue> delItems = new List <RedisValue>();

            RedisConnectionWrapper rConnWrap = RedisSessionStateStoreProvider.RedisConnWrapperFromContext(
                context);

            // Determine if we are adding or removing keys, separate them into their own lists
            //      note that redisItems.GetChangedObjectsEnumerator contains complex logic
            foreach (KeyValuePair <string, string> changedObj in
                     redisItems.GetChangedObjectsEnumerator())
            {
                if (changedObj.Value != null)
                {
                    setItems.Add(
                        new HashEntry(
                            changedObj.Key,
                            changedObj.Value));
                }
                else
                {
                    delItems.Add(changedObj.Key);
                }
            }

            IDatabase redisConn = rConnWrap.GetConnection();

            if (setItems.Count > 0)
            {
                HashEntry[] writeItems = setItems.ToArray();
                redisConn.HashSet(
                    currentRedisHashId,
                    writeItems,
                    CommandFlags.FireAndForget);

                // call appropriate delegate if set for changing keys
                if (RedisSessionConfig.RedisWriteFieldDel != null)
                {
                    RedisSessionConfig.RedisWriteFieldDel(
                        context,
                        writeItems,
                        currentRedisHashId);
                }
            }
            if (delItems != null && delItems.Count > 0)
            {
                RedisValue[] removeItems = delItems.ToArray();
                redisConn.HashDelete(
                    currentRedisHashId,
                    removeItems,
                    CommandFlags.FireAndForget);

                // call appropriate delegate if set for removing keys
                if (RedisSessionConfig.RedisRemoveFieldDel != null)
                {
                    RedisSessionConfig.RedisRemoveFieldDel(
                        context,
                        removeItems,
                        currentRedisHashId);
                }
            }

            // always refresh the timeout of the session hash
            redisConn.KeyExpire(
                currentRedisHashId,
                expirationTimeout,
                CommandFlags.FireAndForget);
        }
Exemple #27
0
        public MainHub()
        {
            var wrapper = new RedisConnectionWrapper("redisblorem");

            _cache = new RedisCacheManager(wrapper);
        }
 private IDatabase GetRealRedisConnection(RedisConnectionWrapper redisConn)
 {
     return((IDatabase)((StackExchangeClientConnection)redisConn.redisConnection).RealConnection);
 }
        public void TryCheckWriteLockAndGetData_Valid()
        {
            string id = "session_id";
            object lockId;
            ISessionStateItemCollection data;

            object[] sessionData = { "Key", RedisUtility.GetBytesFromObject("value") };
            object[] returnFromRedis = { "", sessionData, "15" };
            ChangeTrackingSessionStateItemCollection sessionDataReturn = new ChangeTrackingSessionStateItemCollection();
            sessionDataReturn["key"] = "value";

            var mockRedisClient = A.Fake<IRedisClientConnection>();
            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3),
                 A<object[]>.That.Matches(o => o.Length == 0))).Returns(returnFromRedis);
            A.CallTo(() => mockRedisClient.GetLockId(A<object>.Ignored)).Returns("");
            A.CallTo(() => mockRedisClient.GetSessionData(A<object>.Ignored)).Returns(sessionDataReturn);
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A<object>.Ignored)).Returns(15);

            RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);

            int sessionTimeout;
            Assert.True(redisConn.TryCheckWriteLockAndGetData(out lockId, out data, out sessionTimeout));
            Assert.Equal(null, lockId);
            Assert.Equal(1, data.Count);
            Assert.Equal(15, sessionTimeout);
            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3),
                A<object[]>.That.Matches(o => o.Length == 0))).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetLockId(A<object>.Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionData(A<object>.Ignored)).MustHaveHappened();
            A.CallTo(() => mockRedisClient.GetSessionTimeout(A<object>.Ignored)).MustHaveHappened();
        }
 private IDatabase GetRealRedisConnection(RedisConnectionWrapper redisConn)
 {
     return (IDatabase)((StackExchangeClientConnection)redisConn.redisConnection).RealConnection;
 }
        public void TryRemoveIfLockIdMatch_Valid()
        {
            string id = "session_id";
            object lockId = DateTime.Now.Ticks;

            var mockRedisClient = A.Fake<IRedisClientConnection>();
            RedisConnectionWrapper.sharedConnection = new RedisSharedConnection(null, null);
            RedisConnectionWrapper.sharedConnection.connection = mockRedisClient;
            RedisConnectionWrapper redisConn = new RedisConnectionWrapper(Utility.GetDefaultConfigUtility(), id);
            
            redisConn.TryRemoveAndReleaseLockIfLockIdMatch(lockId);
            A.CallTo(() => mockRedisClient.Eval(A<string>.Ignored, A<string[]>.That.Matches(s => s.Length == 3),
                 A<object[]>.That.Matches(o => o.Length == 1))).MustHaveHappened();
        }