互斥锁

关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案

梦想的初衷 提交于 2019-11-26 16:19:36
前言 在我们的平常的项目中多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。 特别是高 QPS 的系统,每次都去查询数据库,对于你的数据库来说将是灾难。 今天我们不牵涉多级缓存的知识,就把系统使用到的缓存方案,不管是一级还是多级的都统称为缓存,主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。 我们使用缓存时,我们的业务系统大概的调用流程如下图: 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能会出现一些现象。 缓存穿透 什么是缓存穿透 正常情况下,我们去查询数据都是存在。 那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。 这种查询不存在数据的现象我们称为 缓存穿透 。 穿透带来的问题 试想一下,如果有黑客会对你的系统进行攻击,拿一个不存在的id 去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。 解决办法 缓存空值 之所以会发生穿透,就是因为缓存中没有存储这些空数据的key。从而导致每次查询都到数据库去了。 那么我们就可以为这些key对应的值设置为null 丢到缓存里面去。后面再出现查询这个key 的请求的时候,直接返回null 。 这样,就不用在到数据库中去走一圈了

linux命令

荒凉一梦 提交于 2019-11-26 14:58:16
linux文件流 标准输入 0 标准输出 1 标准错误 2 重定向 管道 (pipe): | 管道可以将一个命令的输出导向另一个命令的输入,从而让两个(或者更多命令)像流水线一样连续工作,不断地处理文本流。 进程管理 ps 查看 进程创建:kernel并不提供直接建立新进程的 系统调用 。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork通常作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。所有进程的PPID父进程都是指向init进程。 pstree 显示init进程树 进程关系 进程组 每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (process group leader),领导进程的PID ,成为进程组的ID (process group ID, PGID),以识别进程组。领导进程可以先终结。此时进程组依然存在,并持有相同的PGID,直到进程组中最后一个进程终结。 会话 在shell支持工作控制(job control)的前提下,多个进程组还可以构成一个会话 (session)。bash(Bourne-Again shell)支持工作控制,而sh(Bourne shell)并不支持。

C# 解决程序多次同时打开

匆匆过客 提交于 2019-11-26 10:56:14
使用互斥量 Mutex (命名空间:System.Threading) 互斥锁是同步对象,同一时间有且仅有一个线程可以获取它。 互斥锁可以适用于一个共享资源每次只能被一个线程访问。   相关的函数 创建一个处于未获取状态的互斥锁 Public Mutex() static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { //判断当前程序是否已经开启 bool falg = false; System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Demo1",out falg); if (falg) //程序未开启 { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new HL_login()); } else //程序已经开启 { Model.PubDev.ShowMessage("程序已经打开!"); System.Threading.Thread.Sleep(3000); Environment.Exit(1);