mg4155com > mg4155线路检测手机版 > 数字三角排序,从登记到推送成功

原标题:数字三角排序,从登记到推送成功

浏览次数:89 时间:2019-10-04

源代码: 分支)前提:已安装并运营redis服务器

显示:

源代码:

1.C#程序运转过程?第一步:走入static void Main()第二步:运转static void Main() 中的Application.Run(new Form1;在那中间对窗体进行布局。第三步:实行后出示窗体,实行程序的运维,等待事件发生,并相应事件。第四步:关闭窗体.exit Application.Run(恐怕相当于WINDOWS中的新闻循环机制)函数,程序甘休。2.C#语法糖?轻松说,语法糖便是为着制止coder现身谬误并提升效能的语法层面包车型客车一种高贵的施工方案。语法糖就是一种便利写法。最基本的for(var i = 0;i < 5;i++){......}语法糖大汇总: as 重临null并非引发那贰个。有了AS小编想现在就毫无再用try-catch来做类型转换的剖断了。因此as转变到功要看清是不是为null。b、AS是援用类型类型的转移恐怕装箱调换,不可能用与值类型的更改。要是是值类型只可以结合is来强制调换c、IS只是做项目包容剖断,并不试行真正的类型转变。再次回到true或false,不会回到null,对象为null也会再次来到false。d、AS形式的频率要比IS形式的高,因为依赖IS实行类型转变的化,需求实施三次品种包容检查。而AS只需求做三次品种包容,二遍null检查,null检查要比项目宽容检查快。5.switch下的default后要加break;6.String的援引类型测量检验。

展示 C# 服务端集成极光推送的手续,多图少字,有图有实质。使用极光推送, C# 服务端推送到 德姆o App,Android 手提式有线话机械收割到推送,整理为十三个步骤,使用非常钟左右,完成从注册账号到 Android 手机上的 德姆o App 收到推送。

redis 缓存

通过 《C# 缓存》 能够精通到,缓存其实,正是一体系的 key-value,而 redis 是杰出的key-value数据库之一,那么,大家是还是不是足以信任redis来达成缓存呢?答案是自然的!

图片 1数字排序

介绍

缓存,在自然水准上,是能够坚实程序品质的二个应用方案,举个例子,大家从数据库读数据,即便老是都从数据库读取的话,每便都亟需开展 网络IO操作,要求拭目以待互连网数据重回,如若在60s内,有成千上百个访谈进行同样的数量进行查询,将会更加的耗费时间耗力……假若,大家将首先个报事人查询的数额,先保存起来,然后60s内,别的访问者均读取保存起来的数据,那样无需再去重新查询数据库,收缩一定的网络操作,所以说,缓存,一定水准上得以升高程序品质!这里将介绍如何使用C# 中的MemoryCache 来促成内部存款和储蓄器缓存!

图片 2String的引用类型测量试验

登记页面:

实现

代码是在 《C# 缓存》基础上修修改改的,代码分支为:dev_redis。在 《C# 缓存》中,是用C#自带的类库达成的缓存,那么,大家假使继续自 cachebase,同仁一视写相关方法,就可以达成选取redis作为缓存服务器,在实现在此以前,大家先约定key值为 “n:name,c:key”来作为redis的key值,启用name为自定义的,因为可能两样的道岔会利用不一致的name名称,key便是急需保留的缓存项的key,代码如下

 protected virtual string GetLocalizedKey(string key) { return "n:" + "RandomRedis" + ",c:" + key; }

redis中保存的value值,格式是 "类名,程序集名 | 系列化后的值" 作为value的保存格式,具体完成代码如下

 protected virtual string Serialize(object value, Type type) { var serialized = JsonConvert.SerializeObject; return string.Format( "{0}{1}{2}", type.AssemblyQualifiedName, TypeSeperator, serialized ); } 

既然如此,大家针对保存的值进行了格式约定,那么久须要剖析约定,解析代码如下

 protected virtual object Deserialize(RedisValue objbyte) { var serializedObj = objbyte.ToString(); var typeSeperatorIndex = serializedObj.IndexOf(TypeSeperator); var type = Type.GetType(serializedObj.Substring(0, typeSeperatorIndex)); var serialized = serializedObj.Substring(typeSeperatorIndex + 1); return JsonConvert.DeserializeObject(serialized, type); }

透过以上五个函数,大家得以显示取值和安装值得函数,如下

 public override object GetOrDefault(string key) { var objbyte = this._database.StringGet(this.GetLocalizedKey; return objbyte.HasValue ? this.Deserialize : null; } public override void Set(string key, object value, TimeSpan? slidingExpireTime = null, TimeSpan? absoluteExpireTime = null) { if (value == null) { throw new Exception("不可以插入null到缓存!"); } var type = value.GetType(); // 以string类型保存缓存值 this._database.StringSet( this.GetLocalizedKey, this.Serialize(value, type), absoluteExpireTime ?? slidingExpireTime ?? TimeSpan.FromSeconds; }

那正是说全数缓存达成的代码如下

 public class RedisCache :CacheBase { private readonly IDatabase _database; private ConnectionMultiplexer redisClient = ConnectionMultiplexer.Connect("localhost"); private const char TypeSeperator = '|'; public RedisCache() { this._database = this.redisClient.GetDatabase(); } public override object GetOrDefault(string key) { var objbyte = this._database.StringGet(this.GetLocalizedKey; return objbyte.HasValue ? this.Deserialize : null; } public override void Set(string key, object value, TimeSpan? slidingExpireTime = null, TimeSpan? absoluteExpireTime = null) { if (value == null) { throw new Exception("不可以插入null到缓存!"); } var type = value.GetType(); // 以string类型保存缓存值 this._database.StringSet( this.GetLocalizedKey, this.Serialize(value, type), absoluteExpireTime ?? slidingExpireTime ?? TimeSpan.FromSeconds; } public override void Remove(string key) { this._database.KeyDelete(this.GetLocalizedKey; } public override void Clear() { this._database.KeyDeleteWithPrefix(this.GetLocalizedKey; } protected virtual object Deserialize(RedisValue objbyte) { var serializedObj = objbyte.ToString(); var typeSeperatorIndex = serializedObj.IndexOf(TypeSeperator); var type = Type.GetType(serializedObj.Substring(0, typeSeperatorIndex)); var serialized = serializedObj.Substring(typeSeperatorIndex + 1); return JsonConvert.DeserializeObject(serialized, type); } protected virtual string Serialize(object value, Type type) { var serialized = JsonConvert.SerializeObject; return string.Format( "{0}{1}{2}", type.AssemblyQualifiedName, TypeSeperator, serialized ); } protected virtual string GetLocalizedKey(string key) { return "n:" + "RandomRedis" + ",c:" + key; } }

代码超越百分之五十落到实处,是和democache类想通,只不过,democache通过封装memory实现缓存保存,而 类 RedisCache 封装 redis客户端,作为缓存 容器!

代码:

确立项目

用vs 新建 命令行程序,然后,引进 system.running.cache类库

代码:

图片 3登记页面

利用缓存

在《C# 缓存》 已经写好了测量试验进程,大家只须要将代码ICache cache = new DemoCache(); 替换为 ICache cache = new RedisCache();就可以使用新的缓存实现方式。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace NumberSort{ class Program { static void Main(string[] args) { int i, j; for (i = 1; i <= 6; i++) { for (j = 1; j <= i; j++) { Console.Write; } Console.WriteLine(); } Console.ReadLine(); } }}

Cache 实现

概念二个ICache 接口

 public interface ICache { /// <summary> /// 获取缓存项,当没有缓存时,使用factory提供的值 /// </summary> /// <param name="key"></param> /// <param name="factory"></param> /// <returns></returns> object Get(string key, Func<string, object> factory); /// <summary> /// 获取缓存项,没有缓存时返回默认数据 /// </summary> /// <param name="key"></param> /// <returns></returns> object GetOrDefault(string key); /// <summary> /// 设置缓存项并设置过期时间 /// </summary> /// <param name="key">key</param> /// <param name="value">值</param> /// <param name="slidingExpireTime">多久未访问则失效</param> /// <param name="absoluteExpireTime">超时失效</param> void Set(string key, object value, TimeSpan? slidingExpireTime = null,TimeSpan?absoluteExpireTime=null); /// <summary> /// 移除缓存项 /// </summary> /// <param name="key"></param> void Remove(string key); /// <summary> /// 清空缓存 /// </summary> void Clear(); }

该接口提供了获得缓存、设置缓存、移除缓存和清空缓存操作,且 get 方法,若是缓存中并未有项,则能够透过 factory再次来到数据并保留到缓存!缓存基类:CacheBase

 public abstract class CacheBase : ICache { protected readonly object SyncObj = new object(); protected CacheBase() { } public virtual object Get(string key, Func<string, object> factory) { var cacheKey = key; var item = this.GetOrDefault; if (item == null) { lock (this.SyncObj)// TODO: 为何要锁定 { item = this.GetOrDefault; if (item != null) { return item; } item = factory; if (item == null) { return null; } this.Set(cacheKey, item); } } return item; } public abstract object GetOrDefault(string key); public abstract void Set(string key, object value, TimeSpan? slidingExpireTime = null, TimeSpan? absoluteExpireTime = null); public abstract void Remove(string key); public abstract void Clear(); public virtual void Dispose() { } }

数字三角排序,从登记到推送成功。缓存基类为虚类,只兑现了 Get(string key, Func<string, object> factory) 方法, 这里开展了锁定,首假使为着二十三八线程操作,在安装缓存的时候,只会有二个报事人在设置缓存项,其余办法均为虚方法,等待具体贯彻类达成

缓存具体贯彻类:德姆oCache

 public class DemoCache : CacheBase { private MemoryCache _memoryCache; public DemoCache() : base() { this._memoryCache = new MemoryCache("DemoCache"); } public override object GetOrDefault(string key) { return this._memoryCache.Get; } public override void Set(string key, object value, TimeSpan? slidingExpireTime = null, TimeSpan? absoluteExpireTime = null) { if (value == null) { throw new Exception("Can not insert null values to the cache!"); } var cachePolicy = new CacheItemPolicy(); if (absoluteExpireTime != null) { cachePolicy.AbsoluteExpiration = DateTimeOffset.Now.Add(absoluteExpireTime.Value); } else if (slidingExpireTime != null) { cachePolicy.SlidingExpiration = slidingExpireTime.Value; } else { cachePolicy.AbsoluteExpiration = DateTimeOffset.Now.Add(TimeSpan.FromSeconds; } this._memoryCache.Set(key, value, cachePolicy); } public override void Remove(string key) { this._memoryCache.Remove; } public override void Clear() { // 将原来的释放,并新建一个cache this._memoryCache.Dispose(); this._memoryCache = new MemoryCache("DemoCache"); } public override void Dispose() { this._memoryCache.Dispose(); base.Dispose(); } }

在切实落到实处类内,维护二个 MemoryCache, 别的形式,均操作MemoryCache 举行缓存操作!在现实的设置缓存项中,设置了,就算过期时间为空的话,则设置多长期为访谈超时,假使两则都为空的话,则设置 按时超时,这里私下认可为 60 秒。清空缓存的时候,则释放 memorycache,并新建具体cache实例来落到实处

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace helloworld{ class Program { static void Main(string[] args) { int [] arrA = {1,2,3}; int [] arrB = arrA; foreach(int x in arrA){ Console.WriteLine; } Console.WriteLine(); foreach(int x in arrB){ Console.WriteLine; } Console.WriteLine(); //改变内存中的一个数值 arrA[0] = 10; foreach (int x in arrA) { Console.WriteLine; } Console.WriteLine(); foreach (int x in arrB) { Console.WriteLine; } //测试String的引用类型 String s1 = "aaaaaa"; String s2 = s1; Console.WriteLine; Console.WriteLine; //更改s1 s1 = "abbbb"; Console.WriteLine; Console.WriteLine; Console.ReadLine(); } }}

控制台:

运行结果

现实的周转结果如下

图片 4图片.png

和 《C# 缓存》 中运作期待一向,表达大家早就成功采纳redis来作为缓存容器了!

选择缓存

概念一个方式,用来取多少

private static int GetCacheRandom(ICache cache) { var cacheItem = cache.Get("random",  => { Random random = new Random(); return random.Next; }); return int.Parse(cacheItem.ToString; }

这么些措施,提供了取1到1000的轻便值,并保留到缓存中。定义二个切实函数,用来具体 哪一天取到的数字

 private static void ShowCacheItem(int value) { Console.WriteLine("{0} 取数:{1}",DateTime.Now.ToString("HH:mm:ss"), value); }

现实应用

 static void Main(string[] args) { ICache cache = new DemoCache(); var cacheItem = GetCacheRandom; Console.Write; ShowCacheItem(cacheItem); Stopwatch watch=new Stopwatch(); watch.Start(); while  { if (watch.ElapsedMilliseconds < 10000) { continue; } cacheItem = GetCacheRandom; Console.Write("10s后取值 "); ShowCacheItem(cacheItem); break; } while  { if (watch.ElapsedMilliseconds < 40000) { continue; } cacheItem = GetCacheRandom; Console.Write("40s后取值 "); ShowCacheItem(cacheItem); break; } while  { if (watch.ElapsedMilliseconds < 70000) { continue; } cacheItem = GetCacheRandom; Console.Write("70s后取值,此时应该是新值 "); ShowCacheItem(cacheItem); break; } watch.Stop(); Console.WriteLine("输入任意键退出!"); Console.ReadKey(); }

率先创立DemoCache的实例,然后拿走一回数值,然后10s取一回数据,40s取一回数据,70s取壹次数据,若是缓存生效,则前一次,即首先次,10s到手二回,40s拿走数字,应该是完全一样的,70s获得数据应该和前三遍不一致样。运营结果如下:

图片 5图片.png

透过结果大家得以窥见,前壹次的取值是大同小异的,也便是说,缓存是一蹴而就的

图片 6创造应用

总结

经过上述描述,我们就足以借助redis来落实缓存容器了。本片小说和《C# 缓存》中行使了大气ABP的代码。

qq:1260825783转发备注:

总结

珍视是透过memoryCache来达成缓存,以及轻松的缓存用法!

qq:1260825783源代码:

创办之后重临应用管理:

本文由mg4155com发布于mg4155线路检测手机版,转载请注明出处:数字三角排序,从登记到推送成功

关键词:

上一篇:没有了

下一篇:没有了