回到目录

之前写了不少关于仓储的文章,所以,自己习惯把自己叫仓储大叔,上次写的XMLRepository得到了大家的好评,也有不少朋友给我发email,进行一些知识的探讨,今天主要来实现一个RedisRepository,它始终是集成IRepository接口的,我这里的Redis仓储主要服务为复杂类型的业务,对于只存string这种需求,不需要使用它。

对于Redis仓储和说,它与XML仓储有些不同,由于XML文件一般存储在WWW服务器,所以没有网络通讯问题,而redis一般部署在第三台服务器上,我们一般称为NoSQL服务器,它与WWW通讯是通过socket协议完成的,正是如些,我们在进行仓储设计时,应该考虑到如何去释放它的资源,因为这种资源是非托管的,所以需要人为干预一下,.net提供了using关键字来做这事,而每个动作写using这显然是不友好的,所以,我这个redis仓储是在析构方法里完成对资源的销毁的,请看源代码:

首先是redis基类,它是实现统一操作的前提

   /// <summary>/// Redis实体基类,所有redis实体类都应该集成它/// </summary>public abstract class RedisEntity{public RedisEntity(){RootID = Guid.NewGuid().ToString();}/// <summary>/// Redis实体主键,方法查询,删除,更新等操作/// </summary>public virtual string RootID { get; set; }}

下面才是RedisRepository仓储的代码

    /// <summary>/// Redis仓储实现/// </summary>public class RedisRepository<TEntity> :IDisposable,IRepository<TEntity>where TEntity : RedisEntity{IRedisClient redisDB;IRedisTypedClient<TEntity> redisTypedClient;IRedisList<TEntity> table;public RedisRepository(){redisDB = RedisManager.GetClient();redisTypedClient = redisDB.GetTypedClient<TEntity>();table = redisTypedClient.Lists[typeof(TEntity).Name];}#region IRepository<TEntity>成员public void SetDbContext(IUnitOfWork unitOfWork){throw new NotImplementedException();}public void Insert(TEntity item){if (item != null){                redisTypedClient.AddItemToList(table, item);                redisDB.Save();              }}public void Delete(TEntity item){  if (item != null)            {                var entity = Find(item.RootID);                redisTypedClient.RemoveItemFromList(table, entity);                redisDB.Save();            }}public void Update(TEntity item){if (item != null){var old = Find(item.RootID);if (old != null){redisTypedClient.RemoveItemFromList(table, old);redisTypedClient.AddItemToList(table, item);redisDB.Save();}}}public IQueryable<TEntity> GetModel(){return table.GetAll().AsQueryable();}public TEntity Find(params object[] id){return table.Where(i => i.RootID == (string)id[0]).FirstOrDefault();}#endregion#region IDisposable成员public void Dispose(){this.ExplicitDispose();}#endregion#region Protected Methods/// <summary>/// Provides the facility that disposes the object in an explicit manner,/// preventing the Finalizer from being called after the object has been/// disposed explicitly./// </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}
}

下面是在控制台中进行仓储的调用

        IRepository<Car> repository = new Redis.Data.Core.RedisRepository<Car>();repository.Insert(new Car { ID = 3, Name = "占" });var entity = repository.GetModel().Where(i => i.ID == 3).FirstOrDefault();entity.Name = "修改了";repository.Update(entity);repository.GetModel().ToList().ForEach(e =>{Console.WriteLine(e.ID + "/" + e.RootID + "/" + e.Name);});

下面是实现的结果的截图

回到目录

Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了相关推荐

  1. Redis学习笔记(八)redis之lua脚本学习

    redis系列文章目录 使用spring-data-redis实现incr自增 Redis 利用Hash存储节约内存 Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储] ...

  2. Redis学习笔记(五)——持久化及redis.conf配置文件叙述

    对于日常使用来说,学习完SpringBoot集成Redis就够我们工作中使用了,但是既然学习了,我们就学习一些Redis的配置及概念,使我们可以更深层次的理解Redis,以及增强我们的面试成功概率,接 ...

  3. Redis学习笔记(11)——Redis缓存集群方案

    为什么80%的码农都做不了架构师?>>>    由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,一旦服务器发生故障将会影响更大范围业 ...

  4. Redis学习笔记(一)Redis数据库入门

    [redis是什么] redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. redis的官网地址,非常好记,是redis.io.(特意查了一下,域 ...

  5. Redis学习笔记之十:Redis用作消息队列

    Redis不仅可作为缓存服务器,还可用作消息队列.它的列表类型天生支持用作消息队列.如下图所示: 由于Redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的. 所 ...

  6. Redis学习笔记001---Windows下安装Redis

    JAVA技术交流QQ群:170933152 一.Redis简单介绍: Redis是一个Key-value的数据结构存储系统,可以以数据库的形式,缓存系统,消息处理器使用,它支持的存储value类型很多 ...

  7. Redis 学习笔记(1)—— Redis安装,String 类型测试

    1 Redis 介绍 1.1 概述 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的应用程序的完美解决方案. Redis数据库完全在内存中,使用磁盘仅用于持久性. 相比许 ...

  8. Redis 学习笔记(3)—— Redis List 类型

    1 Redis List 类型 1.1 案例1 package mylist;import redis.clients.jedis.BinaryClient; import redis.clients ...

  9. Redis学习笔记(一)---Redis的简介

    前言 Redis的简介: 1.Redis是完全开源免费的,遵守BSD协议.是一个高性能(NOSQL)的key-value数据库. 2.Redis是一个开源的使用ANSI C语言编写,支持网络,可基于内 ...

最新文章

  1. java的异常机制面试题(转)
  2. handlebars.js {{#if}}中的逻辑运算符是有条件的
  3. Python的IDE:利用MyEclipse2017软件的PyDev插件实现Python编程
  4. 深入分析Nginx 502 Bad Gateway和Nginx 504 Gateway(亲测)
  5. Python3学习笔记(2)——递归函数
  6. C#代码:获取与指定颜色相似的.NET自带颜色
  7. javascript 反斜杠\
  8. 计算机系统结构 期末复习
  9. spark 把一列数据合并_Spark DataFrame列的合并与拆分
  10. SQLServer中批量插入数据方式的性能对比
  11. 随机森林回归 python_用随机森林回归预测“美版拼多多”商品销量
  12. 建立强有力的人脉关系
  13. Bookmarks 各种技术 参考
  14. 加百列丨浅谈大水面水产养殖的几个误区及对策
  15. Go runtime发展历程图片
  16. 如何用U盘重新安装Win10系统
  17. 如何在VR全景作品中添加独立热点?
  18. 基于Java的课堂派应用--学生端
  19. lodop指定打印机打印_lodop和c-lodop临时默认打印机同一任务测试
  20. 微信红包“昙花一现”?看传统企业中兴如何玩转“微信红包”

热门文章

  1. git github的使用
  2. 利用xcode6做出牛的一逼的计算器
  3. QT-在子控件上绘图的两种方式
  4. C#中如何复制窗体到另一个项目
  5. 8086汇编与c++编译器就内存方面的感想
  6. MFC/VC++中怎样设置位图按钮并且位图不会覆盖文字——–位图按钮
  7. C/C++中函数参数传递
  8. C#中的IntPtr类型(指针等用)
  9. IOS15仿微信我的页面
  10. 安全方向比路由交换难吗_「网工进阶」路由交换:链路聚合的配置,你都会吗...