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

来源:互联网 发布:如何查看电脑的端口号 编辑:程序博客网 时间:2024/06/02 01:49

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服务


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


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");        }        /// <summary>        /// 初始化redis        /// </summary>        /// <param name="host">主机、服务地址</param>        /// <param name="port">端口</param>        /// <param name="pwd">密码</param>        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<T>        {            /// <summary>            /// 过期时间            /// </summary>            public int ExpireTime { get; set; }            /// <summary>            /// 是否的指定时间后强制过期            /// </summary>            public bool ForceOutofDate { get; set; }            public T Value { get; set; }        }        public object Get(string key)        {            return Get<object>(key);        }        public T Get<T>(string key)        {            var value = default(T);            var cacheValue = _db.StringGet(key);            if (!cacheValue.IsNull)            {                var cacheObject = JsonConvert.DeserializeObject<CacheObject<T>>(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<object>() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate };            return JsonConvert.SerializeObject(cacheObject, jsonConfig);//序列化对象        }        public void Remove(string key)        {            _db.KeyDelete(key, CommandFlags.HighPriority);        }    }
4.2、新建一个测试项目,测试上面封装的代码,右键解决方案-新建项目,测试---单元测试


4.3、新建测试类,添加测试方法

 /// <summary>    /// 测试缓存    /// </summary>    [TestClass]    public class CacheRedis    {        [TestMethod]        public void InsertData()        {            List<User> users = new List<User>();            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<List<User>>("zy");            foreach (var item in users)            {                Console.Write(item.Name);            }        }        [TestMethod]        public void RemoveData()        {            Cache.Remove("zy");        }    }
4.4、在测试方法上,右键,调试测试,可以调试刚刚封装的方法,发现测试项目非常有用,谁用谁知道,哈哈


0 0
原创粉丝点击