redis保存dataset
公司统一走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的更多相关文章
- Laravel使用redis保存SESSION
Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...
- laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到
laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...
- [PHP] Laravel使用redis保存SESSION
Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...
- 你的项目真的需要Session吗? redis保存session性能怎么样?
在web开发中,Session这个东西一直都很重要,至少伴随我10年之久, 前一段时间发生一个性能问题,因为Redis session 问题,后来想想 其实我的项目session 是不需要的. 先看看 ...
- 在Tomat7上使用Redis保存Session
源博客http://my.oschina.net/gccr/blog/321083 当用户量大.应用服务器使用集群来布署时,使用Tomcat默认自带的Session就不能满足需求了.当然解决方法有很多 ...
- php用redis保存session
1.修改php.ini中session配置: ini_set('session.save_handler', 'redis');ini_set('session.save_path', 'tcp:// ...
- CentOS7下Nginx搭建反向代理,并使用redis保存session
1.启动两个tomcat,端口分别为8080,8081 2.配置nginx,vim /usr/local/nginx/conf/nginx.conf 添加如下配置: 3.启动nginx或热加载 启动: ...
- linux系统中 redis 保存数据的5种形式 linux后端模式启动 jedis无法通过IP地址和端口号访问如何修改linux防火墙
vim修改redis.conf配置文件(我的已经复制到虚拟机的/usr/local/redis/bin目录下)为daemonize yes, 以后端模式启动 ./redis-server redis. ...
- mysql表如何使用redis保存?
mysql表: userid username password email 9 Lisi 111111 lisi@163.com 对应redis存储: 127.0.0.1:6379> set ...
随机推荐
- 《C++语言导学》小记
我看的这本是Bjarne Stroustrup写的,南开大学的杨巨峰和王刚译的.这本书不适合初学者看,我就是大概翻了翻其中感兴趣的章节. 这本书第14章的标题是“历史和兼容性”,这节内容我看了收获很深 ...
- 201412-2 Z字形扫描 Java
思路: 观察输出可以发现,可以不用定义 "方向" ,看斜线,如果是第偶数条(0也是偶数),从左下到右上输出.如果是第奇数条,从右上到左下输出. import java.util.S ...
- 吴裕雄--天生自然TensorFlow2教程:维度变换
图片视图 [b, 28, 28] # 保存b张图片,28行,28列(保存数据一般行优先),图片的数据没有被破坏 [b, 28*28] # 保存b张图片,不考虑图片的行和列,只保存图片的数据,不关注图片 ...
- mysql 不停机 短时间锁表 备份 主备同步 新增备份机器
刷新数据 [root@localhost ~]# mysql -e 'flush tables with read lock;' 锁表刷新表数据 [root@localhost ~]# mys ...
- 帝国CMS7.5后台美化模板 后台风格修改 帝国CMS后台模板
都知道帝国CMS功能强悍,生成静态html也非常好用.可是有时候他的后台样式,丑的让你不想用,dede呢,漏洞太多,PHPCMS好看,可是门槛要求高,你会写PHP才行. 帝国CMS后台美化模板:全面美 ...
- swoole使用内存
//swoole直接操作系统的内存 单线程每秒可执行三百万次 主要用于进程间的数据通信 $swoole_table = new swoole_table(1024);//1024为内创建内存对象所能存 ...
- jenkins pipeline 之 deploy k8s 环境并发送邮件通知
项目中有更新代码之后触发jenkins任务,部署好之后并发送邮件给发开人员 #!/usr/bin/env groovy Date date = new Date()def time = date.fo ...
- 【收藏】每天更新!全网热门公共BT种子 BitTorrent Tracker 列表合集
每天更新!全网热门公共 BitTorrent Tracker 列表合集. 该项目仅将全网热门的公共 Tracker 列表制作成合集方便大家使用,无需再一个个导入了~. 「English」(tracke ...
- 01 - CentOS 中安装Python 2.7.16
准备 下载链接:https://www.python.org/ftp/python/ 下载源码:wget https://www.python.org/ftp/python/2.7.16/Python ...
- [原]调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
原调试debugwindbg崩溃crash 前言 最近程序会不定期崩溃,很是头疼!今晚终于忍无可忍,下决心要干掉它!从之前的几个相关的dump可以猜到是有接口未释放导致的问题,但没有确认到底是哪个接口 ...