.聚合缓存

RavenDb默认是缓存所有的请求url的,最大的缓存请求数默认是2048
documentStore.Conventions.ShouldCacheRequest = url => true;
documentStore.MaxNumberOfCachedRequests = ;

如果开启这个选项,RavenDb直接从缓存当中读取数据,而不是从服务端。

//关闭跟踪
documentStore.Conventions.ShouldAggressiveCacheTrackChanges = false;

)))
{
    var user = session.Load<User>("users/1");
}

)))
{
    var user = session.Load<User>("users/1");
}

//启动强制检查更新,在SaveChanges之后
documentStore.Conventions.ShouldSaveChangesForceAggresiveCacheCheck = true;

、客户端Listener
Document Conflict listeners (IDocumentConflictListener),
Document Conversion listeners (IDocumentConversionListener)
Document Delete listeners (IDocumentDeleteListener)
Document Query listeners (IDocumentQueryListener)
Document Store listeners (IDocumentStoreListener)
例子1:

public class TakeNewestConflictResolutionListener : IDocumentConflictListener
{
    public bool TryResolveConflict(string key, JsonDocument[] conflictedDocs, out JsonDocument resolvedDocument)
    {
        var maxDate = conflictedDocs.Max(x => x.LastModified);
        resolvedDocument = conflictedDocs.FirstOrDefault(x => x.LastModified == maxDate);

        return resolvedDocument != null;
    }
}

例子2:

public class Custom
{
    public string Id { get; set; }

    public string Name { get; set; }

    public string Value { get; set; }
}

public class MetadataToPropertyConversionListener : IDocumentConversionListener
{
    public void EntityToDocument(string key, object entity, RavenJObject document, RavenJObject metadata)
    {
        if (entity is Custom == false)
            return;
        document.Remove("Value");
    }

    public void DocumentToEntity(string key, object entity, RavenJObject document, RavenJObject metadata)
    {
        if (entity is Custom == false)
            return;
        ((Custom)entity).Value = metadata.Value<string>("Raven-Document-Revision");
    }
}

例子3:

public class FailDelete : IDocumentDeleteListener
{
    public void BeforeDelete(string key, object entityInstance, RavenJObject metadata)
    {
        throw new NotSupportedException();
    }
}

例子4:

public class NonStaleQueryListener : IDocumentQueryListener
{
    public void BeforeQueryExecuted(IDocumentQueryCustomization customization)
    {
        customization.WaitForNonStaleResults();
    }
}

例子5:

public class FilterForbiddenKeysDocumentListener : IDocumentStoreListener
{
    private readonly IList<string> forbiddenKeys = new List<string> { "system" };

    public bool BeforeStore(string key, object entityInstance, RavenJObject metadata, RavenJObject original)
    {
        return this.forbiddenKeys.Any(x => x.Equals(key, StringComparison.InvariantCultureIgnoreCase)) == false;
    }

    public void AfterStore(string key, object entityInstance, RavenJObject metadata)
    {
    }
}

、批量插入

//批量插入代码示例
using (var bulkInsert = store.BulkInsert())
{
    ; i <  * ; i++)
    {
        bulkInsert.Store(new User
            {
                Name = "Users #" + i
            });
    }
}

//批量插入接口原型
public interface IDocumentStore
{
    BulkInsertOperation BulkInsert(string database = null, BulkInsertOptions options = null);
}
//批量插入选项原型
public class BulkInsertOptions
{
    public bool CheckForUpdates { get; set; }

    public bool CheckReferencesInIndexes { get; set; }

    public int BatchSize { get; set; }
}
//批量插入操作原型
public class BulkInsertOperation
{
    public delegate void BeforeEntityInsert(string id, RavenJObject data, RavenJObject metadata);

    public event BeforeEntityInsert OnBeforeEntityInsert = delegate { };

    public event Action<string> Report { ... }

    public void Store(object entity) { ... }

    public void Store(object entity, string id) { ... }
}

、流式查询

默认的分页查询的,但是有时候,我们需要一次性查询,RavenDb提供了一种流式查询的方式

//正常查询
var query = session.Query<User>("Users/ByActive").Where(x => x.Active);
using (var enumerator = session.Advanced.Stream(query))
{
    while (enumerator.MoveNext())
    {
        User activeUser = enumerator.Current.Document;
    }
}
//lucene查询
var luceneQuery = session.Advanced.LuceneQuery<User>("Users/ByActive").Where("Active:true");
using (var enumerator = session.Advanced.Stream(luceneQuery))
{
    while (enumerator.MoveNext())
    {
        User activeUser = enumerator.Current.Document;
    }
}

//接口原型
QueryHeaderInformation queryHeaderInformation;
session.Advanced.Stream(query, out queryHeaderInformation);

public class QueryHeaderInformation
{
    public string Index { get; set; }
    public bool IsStable { get; set; }
    public DateTime IndexTimestamp { get; set; }
    public int TotalResults { get; set; }
    public Etag ResultEtag { get; set; }
    public Etag IndexEtag { get; set; }
}

//分页
using (var enumerator = session.Advanced.Stream<User>(fromEtag: Etag.Empty,
                                                      start: , pageSize: int.MaxValue))
{
    while (enumerator.MoveNext())
    {
        User activeUser = enumerator.Current.Document;
    }
}

//
using (var enumerator = session.Advanced.Stream<User>(startsWith: "users/",
                                                      matches: "*Ra?en",
                                                      start: , pageSize: int.MaxValue))
{
    while (enumerator.MoveNext())
    {
        User activeUser = enumerator.Current.Document;
    }
}

//异步版本
using (var asyncSession = store.OpenAsyncSession())
{
    var query = asyncSession.Query<User>("Users/ByActive").Where(x => x.Active);

    using (var enumerator = await asyncSession.Advanced.StreamAsync(query))
    {
        while (await enumerator.MoveNextAsync())
        {
            User activeUser = enumerator.Current.Document;
        }
    }

    using (var enumerator = await asyncSession.Advanced.StreamAsync<User>(Etag.Empty))
    {
        while (await enumerator.MoveNextAsync())
        {
            User activeUser = enumerator.Current.Document;
        }
    }
}

RavenDb学习(九)高级特性下半部分的更多相关文章

  1. php面向对象编程学习之高级特性

    前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习. 面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高 ...

  2. Python学习札记(十九) 高级特性5 迭代器

    参考:迭代器 Note 1.可用于for循环的对象有两类:(1)集合数据类型:list tuple dict str set (2)Generator:生成器和含yield语句的函数.这些可以直接作用 ...

  3. Python学习之高级特性

    切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...

  4. python学习之高级特性:

    切片:对列表.元组.字符串.字典取中间的一部分,在C中一般是通过for循环拷贝/memcpy/strcat等操作.而python提供了更方便的切片操作符[m:n]:前闭后开,如果从0取m可以省略:如果 ...

  5. python切片、迭代、生成器、列表生成式等高级特性学习

    python高级特性 1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 切片 当我们要取一个list中的前n各元素时,如果前n个少的话,我们还可以一个一个的取,但是若前n个元 ...

  6. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  7. Spring框架学习[IoC容器高级特性]

    1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...

  8. JavaScript高级特性-创建对象的九种方式

    1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...

  9. Python学习札记(十五) 高级特性1 切片

    参考: 高级特性 切片 Note 1.掌握了Python的基础语法之后,就可以写出很多很有用的程序了,比如打印1-90的奇数: #!/usr/bin/env python3 L = [] n = 1 ...

随机推荐

  1. django admin 导出数据简单示例

    借鉴博客:https://www.lijinlong.cc/django/djxs/2101.html 具体代码实现: class TipReport(admin.ModelAdmin): actio ...

  2. 批量修改Mysql数据库表Innodb为MyISAN

    mysql -uroot -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_s ...

  3. Mac 下安装Ruby环境

    步骤1 - 安装 RVM RVM 是干什么的这里就不解释了,后面你将会慢慢搞明确. $ curl -L https://get.rvm.io | bash -s stable 期间可能会问你sudo管 ...

  4. sprintboot 发布

    http://blog.csdn.net/hguisu/article/details/51072683

  5. ISO GPS定位,坐标转换以及如何显示

    这个写的公共类叫做:GPScombineClass类主要展示GPS位置的定位,GPS坐标的获取,然后从手机坐标转换成火星坐标,继而在需要的情况下,由火星转百度 ,百度转火星的详细算法:   在GPSc ...

  6. vivado 调用UE

  7. [na]TCP的三次握手四次挥手/SYN泛洪

    1.TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2)确认序号:Ack序号,占32位, ...

  8. [100]find&xargs命令

    打算把基础命令常用选项做个总结. find命令参数 - 命令格式 find . -type f -name '*.txt' - 命令参数 find #查找文件 -type #指定类型 f 文件 d 目 ...

  9. C和指针第13章第4题

    题目:编写一个函数,它用于对一个任何类型的数组进行排序. 算法核心代码sort函数实现 /** 功能说明:sort函数可以对不同类型的数据进行排序 参数: 1.一个指向需要排序的数组的第一个值的指针. ...

  10. HTML5学习笔记(八):CSS定位

    CSS 定位 (Positioning) 属性允许你对元素进行定位. 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠.定位的基本思想很简单 ...