公司统一走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. java基础-泛型的优点

    1.性能 对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作.装箱和拆箱的操作很容易实现,但是性能损失较大.假如使用泛型,就可以避免装箱和拆箱操作. ...

  2. 今天 运营同事发现的bug记录 上传商品时商品名称带双引号 导致输出页面时 双引号被转义

    例如  ”sk||““美白”淡化 这样输出表单页面时显示出来的只有sk||  解决办法 把输出文字对双引号进行转义

  3. 寒假day04

    今天编写了毕设系统中的专家画像模块,实现了人员标签的建立与划分,同时刷了牛客网的面试相关题目. 1.如果系统的umask设置为244,创建一个新文件后,它的权限:(C) --w-r--r-- -r-x ...

  4. switch-case的用法

    case 值1: 表达式的值和 值1匹配上了,需要执行的代码; break; case 值2: 表达式的值和 值2匹配上了,需要执行的代码; break; case 值3: 表达式的值和 值3匹配上了 ...

  5. 可视化---matplotlib

    中文乱码 # 解决matplotlib显示中文问题 # 指定默认字体 plt.rcParams[font.sans-serif]=['SimHei'] # 解决保存图像是负号'-'显示为方块的问题 p ...

  6. PID<->Port[转]

    //Netstat -anb #include <Windows.h> #include "Psapi.h" #include <Iprtrmib.h> # ...

  7. div 命名规范! (野路子出来的好好看看)

    DIV命名规范   DIV命名规范 企业DIV使用频率高的命名方法 网页内容类 --- 注释的写法: /* Footer */ 内容区/* End Footer */ 摘要: summary 箭头:  ...

  8. F - Fraction Formula Gym - 102307F

    Mr. Potato Head has been promoted and now is a math professor at the UNAL. For his first course he i ...

  9. Linux c 操作MySQL

    #include <mysql/mysql.h>#include <stdio.h>#include <stdlib.h>int main() { MYSQL *c ...

  10. 用命令修改Oracle数据库密码

    1.改密码    (1).打开doc命令框键入:sqlplus /nolog     (2).输入:connect / as sysdba     (3).修改密码:alter user userNa ...