从零开始写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、在测试方法上,右键,调试测试,可以调试刚刚封装的方法,发现测试项目非常有用,谁用谁知道,哈哈
- 从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目
- 从零开始写C# MVC框架之--- 项目结构
- 从零开始写C# MVC框架之--- 服务接口与实现
- 从零开始写C# MVC框架之--- 开篇
- 从零开始写C# MVC框架之--- 使用Areas分离ASP.NET MVC项目
- 从零开始写C# MVC框架之--- 主框架页
- 从零开始写C# MVC框架之--- 配置log4日志
- 从零开始写C# MVC框架之--- 数据库表设计
- 从零开始写C# MVC框架之--- 用autofac ioc 容器实现依赖注入
- 从零开始写C# MVC框架之--- 定义基类控制器、实现全局异常捕获
- 从零开始写C# MVC框架之--- 设计用户、菜单、组织机构、角色等表
- 从零开始写C# MVC框架之--- 集成DataGrid、layer弹出层、ZTree
- 从零开始写C# MVC框架之--- 根据用户角色权限获取菜单
- 在webForm项目加添加asp.net mvc项目同时开发
- MVC框架之从零开始(一)
- MVC框架之从零开始(二)
- [笔记]架构探险-从零开始写JavaWeb框架-1. 之搭建轻量级mvc框架
- C# MVC项目开发
- 音乐播放器中activity 与service 交互
- Sift算子特征点提取、描述及匹配全流程解析
- 升级xcode8加密失败的问题
- 简单C++工程架构
- 3-D Mapping With an RGB-D Camera粗译
- 从零开始写C# MVC框架之--- C# Redis 实现加添加测试项目
- MongoDB学习笔记:(2)、MongoDB主从复制
- 1212 无向图最小生成树
- 6.自己动手写Java Web框架-Model
- java中使用SAX生成XML文件
- C++之一个程序学懂链表
- 第四周项目3——单链表应用(1)
- JAVA进阶4.4——食品库存管理
- 存储班长信息的学生类