公司统一走redis缓存,也将之前的memcache迁移到redis
碰到问题是redis的dataset缓存。

memcache底层封装了dataset的序列化。

而redis引的DLL包,未支持。所以封装一个类,提供dataset的set,get功能。

dataset以转为byte[]保存,读取byte[] 转为dataset

代码如下

   /// <summary>
/// 获取缓存(从2进制流)
/// </summary>
/// <param name="key">缓存键</param>
/// <returns></returns>
public static object Get(string key)
{
byte[] buffer = _redisClient.Get(key);
return GetObjFromBytes(buffer);
} /// <summary>
/// 从二进制流得到对象(dataset专用,dataset要序列化为二进制才可保存)
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
private static object GetObjFromBytes(byte[] buffer) {
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer))
{
stream.Position = ;
System.Runtime.Serialization.IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
Object reobj = bf.Deserialize(stream);
return reobj;
}
} /// <summary>
/// 获取DATASET缓存
/// </summary>
/// <param name="key">缓存键</param>
/// <returns></returns>
public static DataSet GetMemByDataSet(string key)
{
var item = Get(key);
return (DataSet)item;
}
/// <summary>
/// 获取DATASET缓存(如果没有,则调用Func<T>方法返回对象并加入到缓存)
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="func">委托方法,返回指定对象类型,用于缓存不存在时回调该方法获取数据并插入到缓存</param>
/// <param name="minute">过期时间(分钟)</param>
/// <returns></returns>
public static DataSet GetMemByDataSet(string key, Func<DataSet> func, int minute)
{
DataSet item = GetMemByDataSet(key);
if (item == null)
{
item = func();
if (item != null)
{
SetMemByDataSet(key, item, minute);
}
}
return item;
}
/// <summary>
/// 插入DATASET缓存
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="item">缓存对象</param>
/// <param name="minute">过期时间(分钟)</param>
public static void SetMemByDataSet(string key, DataSet ds, int minute)
{
DateTime expiryTime = DateTime.Now.AddMinutes(minute);
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
formatter.Serialize(ms, ds);//把DataSet对象序列化到内存流
byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
ms.Close();//关闭内存流对象
ms.Dispose();//释放资源
_redisClient.Set(key, buffer, expiryTime);
} /// <summary>
/// 插入dictionary dataset缓存。
/// </summary>
/// <param name="key">redis保存键</param>
/// <param name="dicdss">Dictionary string 键 dataset 值 </param>
/// <param name="minute">缓存时间</param>
public static void SetDicDataSets(string key, Dictionary<string, DataSet> dicdss, int minute)
{
//dataset转为二进制流
Dictionary<string, byte[]> ndic = new Dictionary<string, byte[]>();
DateTime expiryTime = DateTime.Now.AddMinutes(minute);
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
foreach (var dsentry in dicdss)
{
formatter.Serialize(ms, dsentry.Value);//把DataSet对象序列化到内存流
byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
ndic.Add(dsentry.Key, buffer);
//清空流
ms.SetLength(); ms.Position = ;
}
ms.Close();//关闭内存流对象
ms.Dispose();//释放资源
_redisClient.Set(key, ndic, expiryTime);
} /// <summary>
/// 插入List. dictionary .dataset缓存。
/// </summary>
/// <param name="key">redis保存键</param>
/// <param name="dicdss">Dictionary string 键 dataset 值 </param>
/// <param name="minute">缓存时间</param>
public static void SetListDicDataSets(string key,List<Dictionary<string, DataSet>> Listdicdss, int minute)
{
DateTime expiryTime = DateTime.Now.AddMinutes(minute);
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
List<Dictionary<string, byte[]>> nlistdic=new List<Dictionary<string,byte[]>>();
System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
foreach (var dicdss in Listdicdss) {
//dataset转为二进制流
Dictionary<string, byte[]> ndic = new Dictionary<string, byte[]>();
foreach (var dsentry in dicdss)
{
formatter.Serialize(ms, dsentry.Value);//把DataSet对象序列化到内存流
byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
ndic.Add(dsentry.Key, buffer);
//清空流
ms.SetLength(); ms.Position = ;
}
nlistdic.Add(ndic);
}
ms.Close();//关闭内存流对象
ms.Dispose();//释放资源
_redisClient.Set(key, nlistdic, expiryTime);
}
/// <summary>
/// 得到Dictionary【string, DataSet】
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static List<Dictionary<string, DataSet>> GetListDicDataSets(string key)
{
List<Dictionary<string, DataSet>> resutl = new List<Dictionary<string, DataSet>>();
List<Dictionary<string, byte[]>> rebytes = Get<List<Dictionary<string, byte[]>>>(key);
foreach (var item in rebytes) { Dictionary<string, DataSet> dss = new Dictionary<string, DataSet>();
foreach (var itementry in item)
{
DataSet ds = (DataSet)GetObjFromBytes(itementry.Value);
dss.Add(itementry.Key, ds);
}
resutl.Add(dss);
}
return resutl;
}

redis保存dataset的更多相关文章

  1. Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  2. laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到

    laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...

  3. [PHP] Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  4. 你的项目真的需要Session吗? redis保存session性能怎么样?

    在web开发中,Session这个东西一直都很重要,至少伴随我10年之久, 前一段时间发生一个性能问题,因为Redis session 问题,后来想想 其实我的项目session 是不需要的. 先看看 ...

  5. 在Tomat7上使用Redis保存Session

    源博客http://my.oschina.net/gccr/blog/321083 当用户量大.应用服务器使用集群来布署时,使用Tomcat默认自带的Session就不能满足需求了.当然解决方法有很多 ...

  6. php用redis保存session

    1.修改php.ini中session配置: ini_set('session.save_handler', 'redis');ini_set('session.save_path', 'tcp:// ...

  7. CentOS7下Nginx搭建反向代理,并使用redis保存session

    1.启动两个tomcat,端口分别为8080,8081 2.配置nginx,vim /usr/local/nginx/conf/nginx.conf 添加如下配置: 3.启动nginx或热加载 启动: ...

  8. linux系统中 redis 保存数据的5种形式 linux后端模式启动 jedis无法通过IP地址和端口号访问如何修改linux防火墙

    vim修改redis.conf配置文件(我的已经复制到虚拟机的/usr/local/redis/bin目录下)为daemonize yes, 以后端模式启动 ./redis-server redis. ...

  9. mysql表如何使用redis保存?

    mysql表: userid username password email 9 Lisi 111111 lisi@163.com 对应redis存储: 127.0.0.1:6379> set ...

随机推荐

  1. Nginx安全优化

    一.隐藏版本号 http { server_tokens off; } 经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及时升级修复漏洞. ...

  2. 计蒜客 王子救公主(DFS)

    一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了.于是蒜头君动用全国的力量得知,自己的公主被巫婆抓进一个迷宫里面.由于全国只有蒜头君自己可以翻越迷宫外的城墙,蒜头君便自己一人 ...

  3. [原]排错实战——解救加载调试符号失败的IDA

    原调试IDA排错troubleshootsymbolspdbsysinternalprocess monitor 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windb ...

  4. LGOJ3747 六省联考2017 分手是祝愿

    这两天遇到不少这种"人类智慧题"了,感觉都是很巧妙的 Description link 现在有 \(n\) 盏灯,设每一次操作控制第 \(i\) 占灯,而改变状态的灯就是 \(i\ ...

  5. 频率类组件-认证规图分析-JWT认证-drf-jwt插件

    频率类源码 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(re ...

  6. 关于SG函数

    Sprague-Grundy定理(SG定理): 游戏和的SG函数等于各个游戏SG函数的Nim和.这样就可以将每一个子游戏分而治之,从而简化了问题.而Bouton定理就是Sprague-Grundy定理 ...

  7. lambda concurrent List<Map> to Map

    Object c = Stream.of( CompletableFuture.supplyAsync(() -> { Map m = new HashMap(); try { Thread.s ...

  8. 爬虫笔记(一)——快速使用urllib库

    本人以前用的都是python2.7,但看网上很多教程都是以python3为例的,所以便切换版本,导入urllib.lxml.beautifulsoup4等库. 下面介绍下两个版本对urllib库的区别 ...

  9. UI自动化(selenium+python)之元素定位的三种等待方式

    前言 在UI自动化过程中,常遇到元素未找到,代码报错的情况.这种情况下,需要用等待wait. 在selenium中可以用到三种等待方式即sleep,implicitly_wait,WebDriverW ...

  10. swift中的坑

    1.NSClassFromString //获取工程名称 let group = Bundle.main.infoDictionary let fileName = group?[kCFBundleE ...