RavenDb学习(九)高级特性下半部分
.聚合缓存
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学习(九)高级特性下半部分的更多相关文章
- php面向对象编程学习之高级特性
前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习. 面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高 ...
- Python学习札记(十九) 高级特性5 迭代器
参考:迭代器 Note 1.可用于for循环的对象有两类:(1)集合数据类型:list tuple dict str set (2)Generator:生成器和含yield语句的函数.这些可以直接作用 ...
- Python学习之高级特性
切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...
- python学习之高级特性:
切片:对列表.元组.字符串.字典取中间的一部分,在C中一般是通过for循环拷贝/memcpy/strcat等操作.而python提供了更方便的切片操作符[m:n]:前闭后开,如果从0取m可以省略:如果 ...
- python切片、迭代、生成器、列表生成式等高级特性学习
python高级特性 1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 切片 当我们要取一个list中的前n各元素时,如果前n个少的话,我们还可以一个一个的取,但是若前n个元 ...
- Python3学习(二)-递归函数、高级特性、切片
##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...
- Spring框架学习[IoC容器高级特性]
1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...
- JavaScript高级特性-创建对象的九种方式
1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...
- Python学习札记(十五) 高级特性1 切片
参考: 高级特性 切片 Note 1.掌握了Python的基础语法之后,就可以写出很多很有用的程序了,比如打印1-90的奇数: #!/usr/bin/env python3 L = [] n = 1 ...
随机推荐
- 扯淡 id 先用着
)) { ) { ) & ) { ); }}
- 64位matlab中libsvm的安装
因为windows版的matlab对编译器的识别不好.所以直接在网上下了已经编译好的libsvm文件放入toolbox文件夹就可以用libsvm了 libsvm已编译好的文件下载地址: 猛戳我下载 1 ...
- Android:相机适配及图片处理的一些问题
链接:http://www.cnblogs.com/liushilin/p/6387263.html 链接:http://www.cnblogs.com/liushilin/p/5956691.htm ...
- Android:使用 DownloadManager 进行版本更新,出现 No Activity found to handle Intent 及解决办法
项目中,进行版本更新的时候,用的是自己写的下载方案,最近看到了使用系统服务 DownloadManager 进行版本更新,自己也试试. 在下载完成以后,安装更新的时候,出现了一个 crash,抓取的 ...
- 一个里表世界切换的shader效果
之前GGJ实现了一个,但是实现方式上有很多冗余.今天正好在做一个类似的东西,重新做了一个版本 还是当时美术画的素材: 由于里表世界是不同的内容,是两张材质.所以拆分成不同Layer之后,里世界单独渲染 ...
- ElasticSearch + xpack 使用
ElasticSearch 是一个高可用开源全文检索和分析组件.提供存储服务,搜索服务,大数据准实时分析等.一般用于提供一些提供复杂搜索的应.我们为什么要选择 ElasticSearch ?因为它是一 ...
- dom4j: 生成XML时文本中回车换行无效
属性文本中回车换行在输出时被dom4j自动去掉了. 解决办法: 将format.setTrimText(false); 即可.因为 createPrettyPrint()方法中有 format.set ...
- GDB 调试解析
GDB(GNU Debugger)是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序 列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优 ...
- python argparse详解
1.argparse模块作用 用于解析命令行参数 2.位置参数和可选参数 运行以下代码: import argparse parser = argparse.ArgumentParser() args ...
- Mac下用brew搭建PHP(LNMP/LAMP)开发环境
Mac下搭建lamp开发环境很容易,有xampp和mamp现成的集成环境.但是集成环境对于经常需要自定义一些配置的开发者来说会非常麻烦,而且Mac本身自带apache和php,在brew的帮助下非常容 ...