金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > MemoryCache缓存的用法学习,GPS数据处理

MemoryCache缓存的用法学习,GPS数据处理

发布时间:2019-11-03 23:19编辑:编程浏览(97)

    一、单例模式

    题目内容:

          在完成了DNS解析模块之后,我意识到了DNS缓存机制也很有必要。在Redis,Memcache,和.Net自带的Cache之间,考虑到部署问题,最终选择了后者,之前在学习Web及开发的过程中用过System.Web.Caching.Cache.aspx)这个类库,但是这次的爬虫程序我打算部署为桌面软件,所以选用了System.Runtime.Caching.MemoryCache(后期如有必要也会加入System.Web.Caching.Cache来适配Web端程序)。

          MemoryCache的使用网上介绍的不多,不过这个是.NET4.0新引入的缓存对象,估计主要是替换原来企业库的缓存模块,使得.NET的缓存可以无处不在,而不用基于特定的Windows版本上使用。

          出于方便考虑,我们将不再实例化新的MemoryCache对象,只对MemoryCache的默认示例Memory.Default进行增删查操作。

    基础篇

    增加:

    图片 1

    增加缓存需要提供两个参数,CacheItem类表示缓存中的单个缓存项,

    构造函数:
    CacheItem(String, Object, String)            用缓存项的指定键、值和区域初始化新的 CacheItem 实例。

    三个参数分别为:键、值和区域。

    CacheItemPolicy类则表示缓存项的过期信息,只含有默认的构造函数。

    增加一条缓存:

    var item = new CacheItem("习大大", "两学一做");
    var policy = new CacheItemPolicy();
    policy.SlidingExpiration = new TimeSpan(500);
    //插入一条key为"习大大",value为"两学一做",500毫秒后自动销毁的缓存
    MemoryCache.Default.Add(item, policy);
    //重新设置policy的过期时间为当前时间+十分钟
    policy.AbsoluteExpiration = DateTimeOffset.Now + TimeSpan.FromMinutes(10);
    //注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero
    policy.SlidingExpiration = TimeSpan.Zero;
    //重新插入,覆盖前一条数据
    MemoryCache.Default.Add(item, policy);
    
    注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero 
    

    查询:

    缓存对象类似于字典集,查询可以直接采用memoryCache[key]来进行,例如我们查询一下前面插入的那条数据:

    var idea = MemoryCache.Default["习大大"];
    

    移除:

    图片 2

    参数

    key:要移除的缓存项的唯一标识符。

    regionName:缓存中的一个添加了缓存项的命名区域。不要为该参数传递值。默认情况下,此参数为null,因为 MemoryCache 类未实现区域。

    返回值
    Type: System.Object  如果在缓存中找到该项,则为已移除的缓存项;否则为 null。

    删除前面加入的那一项:

    MemoryCache.Default.Remove("习大大");
    

    进阶篇

    明白了基本的用法之后,我们就可以对它做进一步的封装,使之使用起来更为便捷:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Caching;
    


    namespace Crawler.Common { ///

    /// 基于MemoryCache的缓存辅助类 /// public static class MemoryCacheHelper { private static readonly object _locker = new object();
    public static bool Contains(string key) { return MemoryCache.Default.Contains(key); }

    /// /// 获取Catch元素 /// /// 所获取的元素的类型 /// 元素的键 /// 特定的元素值 public static T Get(string key) { if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("不合法的key!"); if (!MemoryCache.Default.Contains(key)) throw new ArgumentException("获取失败,不存在该key!"); if (!(MemoryCache.Default[key] is T)) throw new ArgumentException("未找到所需类型数据!"); return (T)MemoryCache.Default[key]; }
    /// /// 添加Catch元素 /// /// 元素的键 /// 元素的值 /// 元素过期时间(时间间隔) /// 元素过期时间(绝对时间) /// public static bool Add(string key, object value, TimeSpan? slidingExpiration = null, DateTime? absoluteExpiration = null) { var item = new CacheItem(key, value); var policy = CreatePolicy(slidingExpiration, absoluteExpiration); lock (_locker) return MemoryCache.Default.Add(item, policy); }
    /// /// 移出Cache元素 /// /// 待移出元素的类型 /// 待移除元素的键 /// 已经移出的元素 public static T Remove(string key) { if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("不合法的key!"); if (!MemoryCache.Default.Contains(key)) throw new ArgumentException("获取失败,不存在该key!"); var value = MemoryCache.Default.Get(key); if (!(value is T)) throw new ArgumentException("未找到所需类型数据!"); return (T)MemoryCache.Default.Remove(key); }
    /// /// 移出多条缓存数据,默认为所有缓存 /// /// 待移出的缓存类型 /// /// public static List RemoveAll(IEnumerable keyList = null) { if (keyList != null) return (from key in keyList where MemoryCache.Default.Contains(key) where MemoryCache.Default.Get(key) is T select (T)MemoryCache.Default.Remove(key)).ToList(); while (MemoryCache.Default.GetCount() > 0) MemoryCache.Default.Remove(MemoryCache.Default.ElementAt(0).Key); return new List(); }
    /// /// 设置过期信息 /// /// /// /// private static CacheItemPolicy CreatePolicy(TimeSpan? slidingExpiration, DateTime? absoluteExpiration) { var policy = new CacheItemPolicy();
    if (absoluteExpiration.HasValue) { policy.AbsoluteExpiration = absoluteExpiration.Value; } else if (slidingExpiration.HasValue) { policy.SlidingExpiration = slidingExpiration.Value; }
    policy.Priority = CacheItemPriority.Default;
    return policy; } } }

        a、单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现

    NMEA-0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。

        b、类实现如下:

     

    class Sigletion(objects):
        import time
        def __init__(self):
            time.sleep(1)
        @classmethod
        def instance(cls,*args,**kwargs)
            if not hasattr(Sigletion,'_instance'):
                Sigletion._instance=Sigletion(*args,**kwargs)
            return Sigletion._instance
    
    import threading
    
    daf task(arg):
        obj=Sigletion.instance()
        print(obj)
    
    for i in range(10):
        t=threading.Thread(target=task,args=[i,])
        t.start()
    

    NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。

        c、基于__new__方法实现单例模式

     

    import time
    import threading
    class Singleton(object):
       _instance_lock=threading.Lock()
       def __init__(self):
           pass
       def __new__(cls, *args, **kwargs):
           if not hasattr(Singleton,"_instance"):
               with Singleton._instance_lock:
                   if not hasattr(Singleton,"_instance"):
                       Singleton._instance=object.__new__(cls,*args,**kwargs)
           return Singleton._instance
    
    
    obj1=Singleton()
    obj2=Singleton()
    print(obj1,obj2)
    
    def task(arg):
        obj = Singleton()
        print(obj)
    
    for i in range(10):
        t = threading.Thread(target=task,args=[i,])
        t.start()
    

    NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。

        d、基于metaclass方式实现单例模式

     

    """
    1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法
    2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
    
    # 第0步: 执行type的 __init__ 方法【类是type的对象】
    class Foo:
        def __init__(self):
            pass
    
        def __call__(self, *args, **kwargs):
            pass
    
    # 第1步: 执行type的 __call__ 方法
    #        1.1  调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
    #        1.2  调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
    obj = Foo()
    # 第2步:执行Foodef __call__ 方法
    obj()
    """
    
    import threading
    
    class SingletonType(type):
        _instace_lock=threading.Lock()
        def __call__(cls, *args, **kwargs):
            if not hasattr(cls, "_instance"):
                with SingletonType._instace_lock:
                    if not hasattr(cls, "_instance"):
                        cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
            return cls._instance
    class Foo(metaclass=SingletonType):
        def __init__(self,name):
            self.name=name
    
    
    obj1 = Foo('name')
    obj2 = Foo('name')
    print(obj1,obj2)
    

    其中$GPRMC语句的格式如下:

     

        $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

     

    这里整条语句是一个文本行,行中以逗号“,”隔开各个字段,每个字段的大小(长度)不一,这里的示例只是一种可能,并不能认为字段的大小就如上述例句一样。

        字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息

        字段1:UTC时间,hhmmss.sss格式

        字段2:状态,A=定位,V=未定位

        字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

        字段4:纬度N(北纬)或S(南纬)

        字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)

        字段6:经度E(东经)或W(西经)

    本文由金沙国际官网发布于编程,转载请注明出处:MemoryCache缓存的用法学习,GPS数据处理

    关键词:

上一篇:双击获取当前行的控件,计算机名

下一篇:没有了