从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目

1、了解Redis

Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。Redis的键值可以包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。
为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。根据使用场景的不同,你可以每隔一段时间将数据集转存到磁盘上来持久化数据,或者在日志尾部追加每一条操作命令。
Redis同样支持主从复制(master-slave replication),并且具有非常快速的非阻塞首次同步(non-blocking first synchronization)、网络断开自动重连等功能。同时Redis还具有其它一些特性,其中包括简单的check-and-set机制、pub/sub和配置设置等,以便使得Redis能够表现得更像缓存(cache)。
Redis还提供了丰富的客户端,以便支持现阶段流行的大多数编程语言。详细的支持列表可以参看Redis官方文档:http://redis.io/clients。Redis自身使用ANSI C来编写,并且能够在不产生外部依赖(external dependencies)的情况下运行在大多数POSIX系统上,例如:Linux、*BSD、OS X和Solaris等。
Redis 由四个可执行文件:redis-benchmark、redis-cli、redis-server、redis-stat 这四个文件,加上一个redis.conf就构成了整个redis的最终可用包。它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况

2、Redis下载地址:https://github.com/rgl/redis/downloads,安装服务版,安装后的效果图,启动服务,开始--services.msc,启动Redis服务

从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目_第1张图片

 3、安装后测试是否正常,双击安装文件夹下的 redis-cli文件,敲命令,如出现以下情况属于正常

从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目_第2张图片

4、使用C#第三方类库 StackExchange.Redis 操作Redis,右键 VS 项目,使用 NuGet 获取StackExchange 到项目中,新建Service.cs类实现 redis 方法
4.1、封装Redis操作的 Service.cs 代码

public class Service 
    {
        private static int DEFAULT_TMEOUT = 600;//默认超时时间(单位秒)
        private static ConnectionMultiplexer _redis;
        private static IDatabase _db;
        private static IServer _server;
        private static bool needSave = false;
        string address; //redis服务地址
        JsonSerializerSettings jsonConfig = new JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore };

        public Service()
        {//获取web.config配置文件中的redis服务地址
            this.address = ConfigurationManager.AppSettings["RedisServer"];
            if (string.IsNullOrWhiteSpace(address))
                this.address = "localhost";

            var options = ConfigurationOptions.Parse(address);
            options.SyncTimeout = int.MaxValue;
            options.AllowAdmin = true;

            if (_redis == null)
                _redis = ConnectionMultiplexer.Connect(options);
            if (_server == null)
                _server = _redis.GetServer(address + ":6379");
            if (_db == null)
                _db = _redis.GetDatabase();

            if (_db == null)
                throw new ApplicationException("Redis未取到Database");
        }

        /// 
        /// 初始化redis
        /// 
        /// 主机、服务地址
        /// 端口
        /// 密码
        private void Init(string host, int port, string pwd)
        {
            var options = ConfigurationOptions.Parse(host + ":" + port);
            options.SyncTimeout = int.MaxValue;
            options.AllowAdmin = true;
            if (!string.IsNullOrEmpty(pwd))
            {
                options.Password = pwd;
            }
            if (_redis == null)
                _redis = ConnectionMultiplexer.Connect(options);
            if (_server == null)
                _server = _redis.GetServer(host + ":" + port);
            if (_db == null)
                _db = _redis.GetDatabase();
            needSave = false;
        }

        public int TimeOut
        {
            get
            {
                return DEFAULT_TMEOUT;
            }
            set
            {
                DEFAULT_TMEOUT = value;
            }
        }

        class CacheObject
        {
            /// 
            /// 过期时间
            /// 
            public int ExpireTime { get; set; }

            /// 
            /// 是否的指定时间后强制过期
            /// 
            public bool ForceOutofDate { get; set; }

            public T Value { get; set; }
        }

        public object Get(string key)
        {
            return Get(key);
        }

        public T Get(string key)
        {
            var value = default(T);
            var cacheValue = _db.StringGet(key);
            if (!cacheValue.IsNull)
            {
                var cacheObject = JsonConvert.DeserializeObject>(cacheValue, jsonConfig);
                if (!cacheObject.ForceOutofDate)
                    _db.KeyExpire(key, new TimeSpan(0, 0, cacheObject.ExpireTime));
                value = cacheObject.Value;
            }
            return value;
        }

        public void Insert(string key, object data)
        {
            var currentTime = DateTime.Now;
            var timeSpan = currentTime.AddSeconds(TimeOut) - currentTime;
            var jsonData = GetJsonData(data, TimeOut, false);
            _db.StringSet(key, jsonData, timeSpan);
        }

        public void Insert(string key, object data, DateTime cacheTime, bool forceOutOfDate = false)
        {
            var timeSpan = cacheTime - DateTime.Now;
            var jsonData = GetJsonData(data, (int)timeSpan.TotalSeconds, forceOutOfDate);
            _db.StringSet(key, jsonData, timeSpan);
        }

        public void Insert(string key, object data, int cacheTime, bool forceOutOfDate = false)
        {
            var currentTime = DateTime.Now;
            var timeSpan = currentTime.AddSeconds(cacheTime) - currentTime;
            var jsonData = GetJsonData(data, (int)timeSpan.TotalSeconds, forceOutOfDate);//序列化对象
            _db.StringSet(key, jsonData, timeSpan);
        }

        string GetJsonData(object data, int cacheTime, bool forceOutOfDate)
        {
            var cacheObject = new CacheObject() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate };
            return JsonConvert.SerializeObject(cacheObject, jsonConfig);//序列化对象
        }

        public void Remove(string key)
        {
            _db.KeyDelete(key, CommandFlags.HighPriority);
        }
    }4.2、新建一个测试项目,测试上面封装的代码,右键解决方案-新建项目,测试---单元测试 
  

从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目_第3张图片
4.3、新建测试类,添加测试方法

 /// 
    /// 测试缓存
    /// 
    [TestClass]
    public class CacheRedis
    {
        [TestMethod]
        public void InsertData()
        {
            List users = new List();
            for (int i = 0; i < 10; i++)
            {
                User user = new User() {
                    Name = "zy" + i,
                    Age = i+1
                };
                users.Add(user);
            }
            Cache.Insert("zy", users , 60);
        }

        class User
        {
            public string Name { get; set; }

            public int Age { get; set; }
        }

        [TestMethod]
        public void GetData()
        {
            var users = Cache.Get>("zy");
            foreach (var item in users)
            {
                Console.Write(item.Name);
            }
        }

        [TestMethod]
        public void RemoveData()
        {
            Cache.Remove("zy");
        }
    }
4.4、在测试方法上,右键,调试测试,可以调试刚刚封装的方法,发现测试项目非常有用,谁用谁知道,哈哈

从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目_第4张图片

你可能感兴趣的:(从零开始写C#,MVC框架)