夫天地者,万物之逆旅;光阴者,百代之过客。而浮生若梦,为欢几何?
EnyimMemcached源码解读:keyTransformer

keyTransformer 介绍

和EnyimMemcached相关的API文档资料非常少,官方也没有给出任何语言版本的API使用介绍,我们想要深度使用这个类库中提供的高级功能,必须通过阅读源码的方式进行提取。

这里提供EnyimMemcached在GitHub的托管地址和简要的文档介绍地址:

源码托管地址:https://github.com/enyim/EnyimMemcached

使用介绍地址:https://github.com/enyim/EnyimMemcached/wiki

keyTransformer 是一个EnyimMemcached提供的对缓存Key进行校验和重新构建的配置接口,接口声明代码如下:

接口中只提供了一个 Transform 方法,并且返回一个经过转换后的缓存Key。类库中已经提供了4个 该接口的实现,分别是:DefaultKeyTransformer(默认的配置)、Base64KeyTransformer、SHA1KeyTransformer、TigerHashKeyTransformer 。这4个在普通开发环境中足够我们使用了,同样我们也可以定义自己的keyTransformer 。


自定义 keyTransformer

案例中我们定义一个实现IMemcachedKeyTransformer接口的类,命名为MyMemcachedKeyTransformer,这个类的主要作用是判断缓存Key是否满足我们项目约束的命名规则。假如传入的key不满足规范,我们抛出一个ArgumentException的异常。该类的代码实现如下:

/// <summary>
    /// 自定义Memcached key的验证规则
    /// </summary>
    public class MyMemcachedKeyTransformer : IMemcachedKeyTransformer
    {
        /// <summary>
        /// 定义 缓存key 必须以 LK_ 开头
        /// </summary>
        private string _keyStartStr = "LK_";

        public string Transform(string key)
        {
            if (string.IsNullOrWhiteSpace(key))
            {
                throw new ArgumentException("key 不能为空");
            } else if (!key.StartsWith(_keyStartStr))
            {
                throw new ArgumentException("key的命名规则约定 必须以 LK_ 开头");
            }
            return key;
        }
    }

然后我们在实例化MemcachedClient的时候修改config的如下配置:

MemcachedClientConfiguration config = new MemcachedClientConfiguration();
//服务的终结点可以有多个(意味着可以有多个Memcached实例服务器)
//client会对key进行hash算法 , 自动将数据保存到对应的实列服务器上
config.Servers.Add(new IPEndPoint(IPAddress.Loopback, 11211));//配置连接的IP地址和端口
config.Protocol = MemcachedProtocol.Binary;//配置与Memcached协议的数据交互方式

//使用自定义的KeyTransformer对key进行校验
config.KeyTransformer = new MyMemcachedKeyTransformer();
var mc = new MemcachedClient(config);
try
  {
     mc.Store(StoreMode.Set, "key1", "12122");//写入缓存数据
   }
   catch (Exception ex)
   
     Console.WriteLine(ex.Message);
     Console.ReadKey();
     return;
   }

也可以通过config配置文件的形式:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
  </configSections>
  <memcached protocol="Binary">
    <servers>
      <!--<add address="127.0.0.1" port="11211" />-->
      <add address="127.0.0.1" port="11212" />
    </servers>
    <keyTransformer type="MemcachedDemo.MyMemcachedKeyTransformer,MemcachedDemo" />
    <socketPool minPoolSize="2" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
  </memcached>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

运行结果如下:


案例中对keyTransformer 的使用比较简单,只为起到抛砖引玉的作用,实际开发中可以视情况而定。

作者:暗夜余晖

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

2

支持

0

反对

posted @2018-1-12  拜读(1294)

评论列表

评论内容:



喜欢请打赏

支付宝 微信

请放心支付