主键的自增策略:
自动增长,Guid,Hi/Lo
Guid:可以保证在高并发情况下不重复(其实就是UUID)
自动增长:
优点:简单
缺点:数据库迁移,和分布式系统中很麻烦,因为他有一个锁的机制,所以 高并发写入性能非常差。自增的值默认是由数据库生成的。
OptionsBuilder.Logto 可以自己写代码 过滤一些不需要的消息
ToQueryString :
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
if (source == null)
throw Error.ArgumentNull(nameof(source));
if (predicate == null)
throw Error.ArgumentNull(nameof(predicate));
return source.Provider.CreateQuery<TSource>(
Expression.Call(
null,
CachedReflectionInfo.Where_TSource_2(typeof(TSource)),
source.Expression, Expression.Quote(predicate)
));
}
由源码可知: EFCore的where的方法返回的是:IQueryable 类型
只能获取查询操作的sql语句,不会真正的去执行这个sql语句
写测试性代码:用简单的日志,正式需要记录标准的sql给负责人用 标准日志,开发阶段中,从复杂的sql 查询操作中看到sql 用ToQueryString();
用EfCore 可以将不同的 C#语句翻译成不同的数据库的语句
为什么不用用IEnumerable 而要用IQueryable方法?
因为IEnumerable调用的是客户端的,在内存中执行
IQueryable调用的是服务器上的 翻译成sql语句然后再服务器上评估
客户端上的性能不如服务器端上的性能 所以要用IQueryable
缓存:
其中:
[ResponseCache(Duration = 20)] 是添加缓存
Duration = 20:设置的是缓存时间:20秒
[ResponseCache(Duration = 20)]
[HttpGet]
public DateTime now()
{
return DateTime.Now;
}
服务器端缓存:
app.UseResponseCaching();//启用服务器端相应缓存
缺点:
无法解决恶意请求给服务器带来的压力
内存缓存:
sqlServer做缓存性能并不好
memCached 做缓存专用,性能非常高,但是集群和高可用方面性能比较弱,而且有缓存jian的最大字节是250,可以安装EnyimMemchedCore这个Nuget包
Redis 也可以做缓存,但是它的性能要比MemCached 要稍微差一点,但是他的高可用和集群非常强大,适合在 数据量大,高可用方面使用。