我们的项目使用Entity Framework,并且有两种类型的缓存(内存中,Redis),没有任何缓存提供程序。由于lack of second-level cache support in EF我们自己实施了它。因此,我们的内存缓存是一组简单的键值对,其中键是缓存的Id,值是缓存的对象。我们还实现了类似的缓存以使用Redis。对于查询,我们查看内存缓存列表,如果不是,我们会查看redis,如果没有,我们会查询数据库。
因为实体框架实体引用了上下文,所以我们不能在缓存中使用DbContext
的实体,我们需要映射它。所以我们需要创建很多DTO。
我知道缓存是cross-cutting concern所以我寻找更清晰的解决方案。出于这个原因,首先我决定使用Memcached进行内存(而不是使用简单列表)。作为第二个也是最重要的一点,我可以从EF迁移到NHibernate以获得Second-Cache支持。我知道first level cache is occupied by session object。所以我想将Memcached用于二级缓存。但Redis有没有任何三级缓存?
答案 0 :(得分:2)
在不创建大量DTO的情况下实现二级缓存的一种方法是在键值列表中使用属性名称值列表,而不是存储DTO。 根据我的理解,NHibernate中没有三级缓存。实现此目的的一种方法是实现自定义缓存提供程序,该提供程序可以首先查看Redis,如果找不到它,则从Memcached获取值。