Entry

拥抱.NET Core系列:MemoryCache 初识 (转载)

旧街凉风 提交于 2021-01-06 02:36:45
阅读目录 MSCache能做什么? 从IMemoryCache说起 开发者的体验 写在最后 Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set、Add、Get、Remove、Clear 这几个方法。那么在.NET Core中微软给我们带来了什么样的缓存体验呢?今天我们就来介绍下”Microsoft.Extensions.Caching.Memory”。 由于这个包名称过长,下文使用MSCache来代替 。 回到目录 MSCache能做什么? 绝对过期支持 滑动过期支持(指定一个时间,TimeSpan,指定时间内有被Get缓存时间则顺延,否则过期) 过期回调 自定义过期 MSCache目前最新的正式版是 2.0.0,预览版是2.1.0,会与.NETCore 2.1一起发布。本篇用了2.0.0版本 开源在GitHub上,仓库地址是: https://github.com/aspnet/Caching NuGet地址为: https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/2.0.0 回到目录 从IMemoryCache说起 IMemoryCache 就提供了三个方法并实现了 IDisposable 接口。 很好理解 CreateEntry 添加一个缓存 Remove 删除一个缓存

Django-----ORM

五迷三道 提交于 2021-01-05 08:07:47
                              ORM介绍 一、ORM概念   对象关系映射模式是一种为了解决面向对象与关系数据库的互不匹配的现象技术 简单的说,ORM是通过使用描述对象和数据之间的映射元数组,将程序中的对象自动持久化到关系数据库中。 ORM在业务逻辑层和数据库层之间充当着桥梁的作用。 二,ORM的由来 让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。 几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。 按照之前的方式来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。 三、ORM的优势 ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。 ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。 让软件开发人员专注于业务逻辑的处理,提高了开发效率。 四、ORM的劣势 ORM的缺点是会在一定程度上牺牲程序的执行效率。 ORM用多了SQL语句就不会写了,关系数据库相关技能退化.. 五、ORM的总结

ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波

血红的双手。 提交于 2021-01-05 08:05:55
1. 前言 ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring。 有关 ThreadLocal 源码分析的文章不少,其中有个问题常被提及:ThreadLocal 是否存在内存泄漏? 不少文章对此讲述比较模糊,经常让人看完脑子还是一头雾水,我也有此困惑。因此找时间跟小伙伴讨论了一番,总算对这个问题有了一定的理解,这里记录和分享一下,希望对有同样困惑的朋友们有所帮助。当然,若有理解不当的地方也欢迎指正。 啰嗦就到这里,下面先从 ThreadLocal 的一个应用场景开始分析吧。 2. 应用场景 ThreadLocal 的应用场景不少,这里举个简单的栗子:单点登录拦截。 也就是在处理一个 HTTP 请求之前,判断用户是否登录: 若未登录,跳转到登录页面; 若已登录,获取并保存用户的登录信息。 先定义一个 UserInfoHolder 类保存用户的登录信息,其内部用 ThreadLocal 存储,示例如下: public class UserInfoHolder { private static final ThreadLocal<Map<String, String>> USER_INFO_THREAD_LOCAL = new ThreadLocal<>(); public static void set (Map<String, String>

ElasticSearch的安装和使用

流过昼夜 提交于 2021-01-05 03:01:23
一、传统版安装 1.下载es: https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-8 2.运行:下载后解压,进入到bin目录,执行:elasticsearch。浏览器输入http://localhost:9200/测试是否启动 3.安装head插件(用于可视化操作es) 1)下载head插件: https://github.com/mobz/elasticsearch-head 2)解压到任意目录,但是要和elasticsearch的安装目录区别开 3)安装node js ,安装cnpm 4)全局安装grunt 。Grunt是基于Node.js的项目构建工具。它可以自动运行你所 设定的任务 npm install -g grunt-cli 5)安装依赖 cnpm install 6)进入elasticsearch-head目录启动head grunt server 7)浏览器输入http://localhost:9100/测试head插件是否成功安装 8)在页面上方文本框输入es的地址(端口9200),点击连接按钮出现跨域问题 4.在es目录下的config/elasticsearch.yml添加两行使es能被head等插件跨域访问。改配置后重启es: http.cors.enabled: true

ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波

妖精的绣舞 提交于 2021-01-04 08:52:48
1. 前言 ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring。 有关 ThreadLocal 源码分析的文章不少,其中有个问题常被提及:ThreadLocal 是否存在内存泄漏? 不少文章对此讲述比较模糊,经常让人看完脑子还是一头雾水,我也有此困惑。因此找时间跟小伙伴讨论了一番,总算对这个问题有了一定的理解,这里记录和分享一下,希望对有同样困惑的朋友们有所帮助。当然,若有理解不当的地方也欢迎指正。 啰嗦就到这里,下面先从 ThreadLocal 的一个应用场景开始分析吧。 2. 应用场景 ThreadLocal 的应用场景不少,这里举个简单的栗子:单点登录拦截。 也就是在处理一个 HTTP 请求之前,判断用户是否登录: 若未登录,跳转到登录页面; 若已登录,获取并保存用户的登录信息。 先定义一个 UserInfoHolder 类保存用户的登录信息,其内部用 ThreadLocal 存储,示例如下: public class UserInfoHolder { private static final ThreadLocal<Map<String, String>> USER_INFO_THREAD_LOCAL = new ThreadLocal<>(); public static void set(Map<String, String>

RT-Thread Nano 移植原理

柔情痞子 提交于 2021-01-04 08:44:20
前言 本篇文档介绍 Nano 移植原理,针对的是不同 MCU 的移植,如 Cortex M,RISC-V,或者是其他 MCU 的移植。 移植过程主要分为两个部分: libcpu 移植与板级移植,在讲解移植之前,本文档对 RT-Thread Nano 的启动流程与移植目录结构先进行说明。 启动流程 RT-Thread 启动流程如下所示,在图中标出颜色的部分需要用户特别注意(黄色表示 libcpu 移植相关的内容,绿色部分表示板级移植相关的内容)。 RT-Thread 启动代码统一入口为 rtthread_startup() ,芯片启动文件在完成必要工作(如初始化时钟、配置中断向量表、初始化堆栈等)后,最终会在程序跳转时,跳转至 RT-Thread 的启动入口中。RT-Thread 的启动流程如下: 全局关中断,初始化与系统相关的硬件。 打印系统版本信息,初始化系统内核对象(如定时器、调度器)。 初始化用户 main 线程(同时会初始化线程栈),在 main 线程中对各类模块依次进行初始化。 初始化软件定时器线程、初始化空闲线程。 启动调度器,系统切换到第一个线程开始运行(如 main 线程),并打开全局中断。 移植目录结构 在 rtthread-nano 源码中,与移植相关的文件位于下图中有颜色标记的路径下(黄色表示 libcpu 移植相关的文件,绿色部分表示板级移植相关的文件):

分布式任务调度系统xxl-job搭建(基于docker)

邮差的信 提交于 2021-01-03 11:44:29
一、简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 更多介绍,请访问官网: http://www.xuxueli.com/xxl-job/#/ 接下来,本文将详细介绍,如何安装XXL-JOB 本文所使用的操作系统为: ubuntu-16.04.5-server-amd64 二、安装MySQL(docker) 安装方式 xxl-job 依赖 mysql,所以必须要安装mysql才行!安装mysql有2种方式: 1. 在线安装或者编译安装 2. 使用docker 如果直接使用apt-get 在线安装,使用以下命令: apt-get install -y mysql-server 在安装过程中,会提示输出root密码, 注意:必须输入密码为 root_pwd,下面会介绍到! 注意:默认的配置文件是监听127.0.0.1,因此还需要修改 /etc/mysql/mysql.conf.d/mysqld.cnf ,修改bind参数为0.0.0.0 安装完成之后,mysql就启动了! 基于docker安装 本文主要介绍,如何使用docker安装mysql。下载镜像 docker pull mysql 默认是下载 latest 标签的mysql,那么版本是多少呢?访问以下链接: https:/

通过Ldap实现人事系统组织人事和AD的同步

天大地大妈咪最大 提交于 2021-01-03 11:19:47
项目需求: 同步人事系统的组织架构-对应AD的OU树 同步人事系统的员工-对应AD的用户 创建OU 名字不能重复,需要父级路径(parentOrganizeUnit)以及新ou的名字(name),如果最父级则上级路径为域节点 DirectoryEntry CreateOrganizeUnit(string OrgId,string name, string parentOrganizeUnit,int Id,ADInfo ad) 更改OU名称 需要旧的OU路径(oldUnit)以及“OU=新OUName”(newUnit) DirectoryEntry UpdateOrganizeUnit(string newUnit, string OUName, string oldUnit, int Id,ADInfo ad) 使用Renname 更改OU上级 需要新的上级路径(newparentOrganizeUnit)旧OU的路径(oldUnit) DirectoryEntry MoveOrganizeUnit(string oldUnit, string newparentOrganizeUnit, int Id,ADInfo ad) 创建ou用户需要ou路径(orgPath) 以及用户信息(user) AddADAccount(string orgPath, EmpInfo user

HashMap源码解读(JDK1.7)

萝らか妹 提交于 2021-01-02 19:25:39
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类 的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。 什么是哈希表 在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能 数据结构 数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n) 线性链表 :对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n) 二叉树 :对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。 哈希表 :相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成

Java多线程详解

十年热恋 提交于 2021-01-02 15:21:33
线程对象是可以产生线程的对象。比如在 Java 平台中Thread对象,Runnable对象。线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。相比于多进程,多线程的优势有: (1)进程之间不能共享数据,线程可以; (2)系统创建进程需要为该进程重新分配系统资源,故创建线程代价比较小; (3)Java语言内置了多线程功能支持,简化了java多线程编程。 一、创建线程和启动 (1)继承Thread类创建线程类 通过继承Thread类创建线程类的具体步骤和具体代码如下: • 定义一个继承Thread类的子类,并重写该类的run()方法; • 创建Thread子类的实例,即创建了线程对象; • 调用该线程对象的start()方法启动线程。 class SomeThead extends Thraad { public void run() { //do something here } } public static void main(String[] args){ SomeThread oneThread = new SomeThread(); 步骤3:启动线程: oneThread.start(); } (2)实现Runnable接口创建线程类