最近一段时间在研究redis。  各种不懂, 各种问题。也看了N多的资料。

最终参照着  张占岭 的博客  http://www.cnblogs.com/lori/p/3435483.html   写了一套redis与entityframework结合的操作类。

如有什么不正确的地方,请指明。

using ServiceStack.Redis;
using ServiceStack.Redis.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.Threading.Tasks;
using System.Linq.Expressions;
using ServiceStack.Redis.Pipeline;
using ServiceStack.Redis.Support;
using System.Data.SqlClient;
namespace Redis
{ /// <summary>
/// 操作redis与entity framework
/// </summary>
public class RedisRepository<TEntity> :
IDisposable
where TEntity : class
{
public DbContext context;
IRedisClient redisDB;
IRedisTypedClient<TEntity> redisTypedClient;
IRedisList<TEntity> table; public RedisRepository(DbContext context)
{
this.context = context;
redisDB = new RedisClient("192.168.2.47", );//redis服务IP和端口
redisTypedClient = redisDB.As<TEntity>();
table = redisTypedClient.Lists[typeof(TEntity).Name];
} #region Repository<TEntity>成员 /// <summary>
/// 添加一条数据,该操作会同时插入到mssql和redis
/// </summary>
/// <param name="item">数据模型</param>
/// <returns>是否成功,成功返回1,失败返回0</returns>
public int Insert(TEntity item)
{
int result = ;
if (item != null)
{
context.Set<TEntity>().Add(item);
result = context.SaveChanges();
if (result > )
{
Task.Run(async () => await AsyncAddEntity(item));//异步向redis插入数据。
}
}
return result;
} /// <summary>
/// 删除单条数据操作,同时删除redis和SqlServer
/// </summary>
/// <param name="keysValue">删除条件</param>
/// <returns>是否成功,成功返回1,失败返回0</returns>
public int Delete(params object[] keysValue)
{
var entity = context.Set<TEntity>().Find(keysValue);
context.Set<TEntity>().Remove(entity);
int result = context.SaveChanges();
if (result > )
{
Task.Run(async () => await AsyncDelEntity(entity));//异步删除一条数据
}
return result;
} /// <summary>
/// 修改操作,同时修改SqlServer和redis
/// </summary>
/// <param name="itemOld">旧数据</param>
/// <param name="item">新数据</param>
/// <returns>是否成功,成功返回1,失败返回0</returns>
public int Update(Func<TEntity, bool> func, TEntity item)
{
context.Entry<TEntity>(item).State = EntityState.Modified;
int result = context.SaveChanges();
if (result > )
{
Task.Run(async () => await AsyncEditEntity(func, item));//异步修改redis数据。
}
return result;
} /// <summary>
/// 批量删除数据 ,同时删除redis和SqlServer
/// </summary>
/// <param name="func">删除条件</param>
/// <returns>返回删除成功的行数</returns>
public int DeleteSelect(Func<TEntity, bool> func)
{
var entities = context.Set<TEntity>().Where(func);
context.Set<TEntity>().RemoveRange(entities);
int result = context.SaveChanges();
if (result > )
{
Task.Run(async () => await AsyncDelEntity(func));//异步删除redis数据。
}
return result;
} /// <summary>
/// 获取所有数据
/// </summary>
/// <returns></returns>
public IQueryable<TEntity> GetModel()
{
return table.GetAll().AsQueryable();
} /// <summary>
/// 获取分页数据
/// </summary>
/// <param name="func">查询条件</param>
/// <param name="keySelector">排序字段</param>
/// <param name="pageIndex">获取页面的页数</param>
/// <param name="pageSize">页面行数</param>
/// <param name="totalPage">返回数据行总数</param>
/// <returns></returns>
public IList<TEntity> GetModel(Func<TEntity, bool> func, Func<TEntity, object> keySelector, int pageIndex, int pageSize, out int totalPage)
{
int startRow = (pageIndex - ) * pageSize;
totalPage = table.Count();
//判断缓存中数据是否为空并且数据库内数据行数是否与缓存中行数一致,如果为空或者不一致 从数据库查询数据 异步插入到缓存中。
int dbCount = context.Set<TEntity>().Count();
if (dbCount != totalPage || totalPage == )
{
totalPage = dbCount;
List<TEntity> listDB = context.Set<TEntity>().AsQueryable().ToList();
Task.Run(async () => await AsyncAddEntity(listDB));//异步向redis插入数据。
return context.Set<TEntity>().AsQueryable().Where(func).OrderBy(keySelector).Skip(startRow).Take(pageSize).ToList();
}
return table.GetAll().AsQueryable().Where(func).OrderBy(keySelector).Skip(startRow).Take(pageSize).ToList();
} /// <summary>
/// 查询单条数据
/// </summary>
/// <param name="func">查询条件</param>
/// <returns></returns>
public TEntity Find(Func<TEntity, bool> func)
{
return table.Where(func).FirstOrDefault();
} /// <summary>
/// 异步插入到redis列表
/// </summary>
/// <param name="listDB"></param>
/// <returns></returns>
private Task AsyncAddEntity(List<TEntity> listDB)
{
return Task.Factory.StartNew(() =>
{
table.RemoveAll();
listDB.ForEach(m => redisTypedClient.AddItemToList(table, m));
redisDB.Save();
});
} /// <summary>
/// 异步插入到redis单条
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private Task AsyncAddEntity(TEntity entity)
{
return Task.Factory.StartNew(() =>
{
redisTypedClient.AddItemToList(table, entity);
redisDB.Save();
});
} /// <summary>
/// 异步删除一条数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private Task AsyncDelEntity(TEntity entity)
{
return Task.Factory.StartNew(() =>
{
redisTypedClient.RemoveItemFromList(table, entity);
redisDB.Save();
});
}
private Task AsyncDelEntity(Func<TEntity, bool> func)
{
return Task.Factory.StartNew(() =>
{
table.GetAll().AsQueryable().Where(func).ToList().ForEach(m => redisTypedClient.RemoveItemFromList(table, m));
redisDB.Save();
});
}
/// <summary>
/// 修改一条数据
/// </summary>
/// <param name="func"></param>
/// <param name="item"></param>
/// <returns></returns>
private Task AsyncEditEntity(Func<TEntity, bool> func, TEntity item)
{
return Task.Factory.StartNew(() =>
{
redisTypedClient.RemoveItemFromList(table, Find(func));
redisTypedClient.AddItemToList(table, item);
redisDB.Save();
});
} #endregion #region IDisposable成员
public void Dispose()
{
this.ExplicitDispose();
}
#endregion #region Protected Methods /// <summary>
/// 垃圾回收
/// </summary>
protected void ExplicitDispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
} protected void Dispose(bool disposing)
{
if (disposing)//清除非托管资源
{
table = null;
redisTypedClient = null;
redisDB.Dispose();
}
}
#endregion #region Finalization Constructs
/// <summary>
/// Finalizes the object.
/// </summary>
~RedisRepository()
{
this.Dispose(false);
}
#endregion
}
}

Redis结合EntityFramework结合使用的操作类的更多相关文章

  1. 使用RedisTemplate的操作类访问Redis(转)

    深入理解Spring Redis的使用 (三).使用RedisTemplate的操作类访问Redis 事务需要开启enableTransactionSupport,然后使用@transactional ...

  2. php的redis 操作类,适用于单台或多台、多组redis服务器操作

    redis 操作类,包括单台或多台.多组redis服务器操作,适用于业务复杂.高性能要求的 php web 应用. redis.php: <?php /* redis 操作类,适用于单台或多台. ...

  3. php redis数据库操作类

    <?php namespace iphp\db; use iphp\App; /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时, ...

  4. 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

    1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式. 在它的核心结构中仅仅包括一个被称为单例类的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问.从而方便对实例个 ...

  5. 深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis

    上一篇说了RedisTemplate对注解事务的支持,以及提供的序列化器. 事务需要开启enableTransactionSupport,然后使用@transactional注解,里面直接通过回调的c ...

  6. 封装php redis缓存操作类

    封装php redis缓存操作类,集成了连接redis并判断连接是否成功,redis数据库选择,检测redis键是否存在,获取值,写入值,设置生存时间和删除清空操作. php redis类代码: &l ...

  7. 【PHP+Redis】 php-redis 操作类 封装

    <?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...

  8. 使用RedisTemplate的操作类访问Redis(转载)

    原文地址:http://www.cnblogs.com/luochengqiuse/p/4641256.html private ValueOperations<K, V> valueOp ...

  9. ecshop的Mysql操作类

    摘要,这是直接摘抄的ecshop的mysql操作类:不过他这里的缓存是用的文件缓存,我们如果想直接使用,可以替换成memcache的或者redis的! <?php /** * ECSHOP MY ...

随机推荐

  1. OSI七层模型理解

    物理层功能1,为数据端设备提供传送数据的通路 功能2,传输数据 接口.传输介质.信号的传输.网络设备 有线介质:双绞线(普通的网线),光纤. 无线介质:无线电.微波.激光.红外线. 例如手机.电视接收 ...

  2. DOM - nodeType 的取值

    DOM 中,共有 12 中不同类型的节点,nodeType 的取值以数值表示. 节点类型 描述 子节点 1  Element  表示元素.  Element, Text, Comment, Proce ...

  3. Java中View游戏开发框架

    java中游戏开发引擎View比较适合被动触发的游戏,不能使用于那种对战的游戏 Game01Activity.java  这里是调用的activity package cn.sun.syspro; i ...

  4. Cookie技术详解

    1. Cookie的特性 属性: 1> name: Cookie的名字 2> value: Cookie的值 3> path: 可选,Cookie的存储路径,默认情况下的存储路径时访 ...

  5. 查看sql语句执行时间/测试sql语句性能

    写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置STATISTICS我们可以查看执行SQL时的 ...

  6. Vijos1825 NOI2008 志愿者招募 费用流

    Orz ByVoid大神的题解:https://www.byvoid.com/blog/noi-2008-employee/ 学习网络流建图的好题,不难想到线性规划的模型,不过利用模型的特殊性,结合网 ...

  7. asp.net 网站和asp.net Web 应用程序的一处不同

    环境为:VS2008Team+.net3.5 asp.net 网站前台页面<%= %>这样绑定可以,asp.net Web 应用程序就不可以 示例代码如下: 1.asp.net网站 < ...

  8. TIFF6 Packbit algorithm

    “Packbits” from ISO 12369 参考TIFF 6.0 Specification,点击TIFF, Version 6.0: @Section 9: PackBits Compres ...

  9. 总结Widows 7 Start->Run 命令

    Widows + R基本上成为很常用的方式,那么通过Windows + R我们可以在运行中做什么手脚呢. 下面从最基本的系统命令说起 notepad--------打开记事本    services. ...

  10. ARM平台的内核模块编写与安装

       Linux 系统一直在不断地发展,而相应地她的代码量也在不断的增大,直接导致的结果就是她的可执行镜像就变得越来越庞大.那么问题来了,如果将所有的镜像文件一次性地复制到内存中,那么所需的空间就非常 ...