next

Redis过期key是怎么样清理的?

a 夏天 提交于 2020-08-13 06:39:18
在Redis中,对于过期key的清理主要有惰性清除,定时清理,内存不够时清理三种方法,下面我们就来具体看看这三种清理方法。 1、惰性清除 在访问key时,如果发现key已经过期,那么会将key删除。 2、定时清理 Redis配置项hz定义了serverCron任务的执行周期,默认每次清理时间为25ms,每次清理会依次遍历所有DB,从db随机取出20个key,如果过期就删除,如果其中有5个key过期,那么就继续对这个db进行清理,否则开始清理下一个db。 3、内存不够时清理 当执行写入命令时,如果发现内存不够,那么就会按照配置的淘汰策略清理内存,淘汰策略一般有6种,Redis4.0版本后又增加了2种,主要由分为三类: 第一类 不处理,等报错(默认的配置) noeviction,发现内存不够时,不删除key,执行写入命令时直接返回错误信息。(Redis默认的配置就是noeviction) 第二类 从所有结果集中的key中挑选,进行淘汰 allkeys-random 就是从所有的key中随机挑选key,进行淘汰 allkeys-lru 就是从所有的key中挑选最近使用时间距离现在最远的key,进行淘汰 allkeys-lfu 就是从所有的key中挑选使用频率最低的key,进行淘汰。(这是Redis 4.0版本后新增的策略) 第三类 从设置了过期时间的key中挑选,进行淘汰

转MDL中数据读取

别来无恙 提交于 2020-08-13 06:35:54
http://yexin218.iteye.com/blog/532184 澄清一个误区:每个Net_BuFFER包含的是一个linked-list的MDL,而不仅仅是一个MDL。所以你要访问Net_BuFFER 中数据,你需要在代码中根据需要的offset遍历MDL链表。比如第一个MDL只有14byte有数据(忽略unused data,backfill..),那么它就包含了EtherNet Header,那么下一个可能包含IP Header,再下一个包含TCP header,最后一个(或者多个)包含了TCP数据。至于那些数据是否真的可以完整放在某个MDL中,比如Ethernet Header是否就放在第一个中,而不会跨越第二个MDL,那就取决于NIC容量~ 如果你得到一个MDL,那么你可以遍历的道,Ethernet header->Layer 3 header-->Layer 4 header(if available),假如 Net_BuFFER->next(应该是pMDL->next吧) 不是NULL,那么要检查下是什么样的Layer3协议。比如它可能是ARP. 现在讨论下如何访问会更加简单些,了解下基础知识。 假设一个MDL,它描述了事实上是一个连续的内存区域。其包含了一连串的page frame。到第一个page的‘距离’可用MmGetMdlByteOffset()得到

oracle常用函数使用大全

浪尽此生 提交于 2020-08-13 06:34:06
一、运算符 算术运算符:+ - * / 可以在select 语句中使用 连接运算符:|| select deptno|| dname from dept; 比较运算符:> >= = != < <= like between is null in 逻辑运算符:not and or 集合运算符: intersect ,union, union all, minus 要求:对应集合的列数和数据类型相同 查询中不能包含long 列 列的标签是第一个集合的标签 使用order by时,必须使用位置序号,不能使用列名 例:集合运算符的使用: intersect ,union, union all, minus select * from emp intersect select * from emp where deptno=10 ; select * from emp minus select * from emp where deptno=10; select * from emp where deptno=10 union select * from emp where deptno in (10,20); --不包括重复行 select * from emp where deptno=10 union all select * from emp where deptno in (10

Swagger文档转Word 文档

我的未来我决定 提交于 2020-08-13 06:30:07
GitHub 地址: https://github.com/JMCuixy/swagger2word 原创作品,转载请注明出处: http://www.cnblogs.com/jmcui/p/8298823.html 一、前言 为什么会产生这个需求呢? 我们公司作为乙方,老是被客户追着要一份API文档,当我们把一个 Swagger 文档地址丢给客户的时候。客户还是很不满意,嫌不够正式!!死活坚持要一份 word 文档 。然后领导给了个接口模板,就把这个活交给我了......我去,近10个微服务,几百个接口,这不得要了我的命啊(最后整理出来将近200页的 word 文档)。最后,还是领导有办法:要不我们把Swagger的 json文件转成word文档吧! 一直坚持一句话。作为使用者,人要迁就机器;作为开发者,要机器迁就人。 二、思路 领导提供了一个接口模板,类似下面这样,其实就是一个word的table页。想到 html 可以转 word ,那么问题就变成了 : 1、解析JSON 文件 2、把JSON文件的内容填充进html 的Table中 3、由html直接转成word 几百个接口,一气呵成!如下,还有一个简单的示例,就是请求参数 和 返回值 。怎么处理呢?在程序中写了 HTTP 的请求,封装了需要的参数去执行了一个请求,得到相应的返回值! 三、实现 1、封装对象

数组里面对象去重的四种方法

自闭症网瘾萝莉.ら 提交于 2020-08-13 06:18:21
去重数据: var arr = [{ key: '01' , value: '西施' }, { key: '02' , value: '王昭君' }, { key: '03' , value: '杨玉环' }, { key: '04' , value: '貂蝉' }, { key: '01' , value: '西施' }, { key: '01' , value: '西施' }]; 方法一: 利用对象访问属性的方法,判断对象中是否存在key var result = []; var obj = {}; for ( var i = 0; i < arr.length; i++ ) { if (! obj[arr[i].key]) { result.push(arr[i]); obj[arr[i].key] = true ; } } console.log(result); // [{key: "01", value: "西施"},{key: "02", value: "王昭君"},{key: "03", value: "杨玉环"},{key: "04", value: "貂蝉"}] 方法二: 利用两层for循环和布尔值的方法进行去重 var result = []; for ( var i = 0; i < arr.length; i++ ) { var flag = true ;

Java随机写

醉酒当歌 提交于 2020-08-13 05:53:39
1. 进程和线程 2. CPU核心数和线程数的关系 3. CPU时间片轮转机制 基本概念: wait() notify()、notifyAll() interrupt()、interupted()、isInterrupted() stop、resume、destroy、suspend CLH队列: 一种服务器(PC机)所实现锁机制的一种思想,而AQS是基于CLH思想来做的,但是并没有完全按照CLH来实现,是CLH的一种变种实现。 JDK1.7的HashMap死循环分析: 当两个线程并发扩容时,一个线程完成了全部的扩容操作,而另外一个线程在执行过程中被挂起了,而被挂起的线程在恢复执行以后,因为要在自己内部的newTable里面进行扩容操作(头插法的链表操作),造成了已有的元素之间next指针相互指着,这种情况形成的循环链表就产生了所谓的死循环。 来源: oschina 链接: https://my.oschina.net/u/4571086/blog/4428124

【大前端攻城狮之路】面试集锦

倖福魔咒の 提交于 2020-08-13 05:27:32
JS相关 1.变量提升 ES6之前我们一般使用var来声明变量,提升简单来说就是把我们所写的类似于var a = 123;这样的代码,声明提升到它所在作用域的顶端去执行,到我们代码所在的位置来赋值。 function test() { console.log(a); // undefined a = 123; } test();    执行顺序如下: function test() { var a; console.log(a); // undefined a = 123; } test();    2.函数提升 javascript中不仅仅是变量声明有提升的现象,函数的声明也是一样;具名函数的声明有两种方式:1. 函数声明式 2. 函数字面量式 function test() {} // 函数式声明 let test = function() {} // 字面量声明    函数提升是整个代码块提升到它所在的作用域的最开始执行 console.log(f); function f() { console.log(1); } // 相当于以下代码 function f() { console.log(1); } console.log(f);    foo(); //1 var foo; function foo () { console.log(1); } foo =

燃石医学登陆纳斯达克:中国肿瘤NGS检测第一股获追捧,开盘股价大涨49%

余生长醉 提交于 2020-08-13 04:23:28
  2020 年 6 月 12 日,中国肿瘤 NGS 第一股燃石医学正式登陆纳斯达克,开盘股价大涨 49% 报 24.63 美元,总市值达 25.1 亿美元。   燃石医学成立于 2014 年,目前主要提供具有临床价值的二代测序(next generation sequencing, NGS)服务,业务及研发方向涵盖 :肿瘤患病人群检测、癌症早检以及肿瘤基因组大数据生态圈,旨在转变精密肿瘤学和早期癌症检测。   燃石医学在上市招股书中提到,公司在中国 NGS 癌症治疗选择市场中占据了最大市场份额,高达 26.7%。首次挂牌上市总募资约 2.5 亿美元,用于癌症早检技术的研发,其他癌症治疗选择产品的注册认证,完成相关的临床试验以及其他经营管理支出等。   上市前,燃石医学完成过四轮融资,募资总额超 13 亿元人民币,投资方阵容也非常有实力,包括红杉资本、招银国际、联想之星、北极光创投、礼来和 PSG 等。      图|燃石医学融资历程   基于 NGS 的癌症治疗选择测试产品可帮助医生为癌症患者选择最有效的治疗方法。    燃石医学目前可提供 13 种基于 NGS 的癌症治疗选择测试,适用的癌症类型包括肺癌、胃肠道癌症、前列腺癌、乳腺癌、淋巴瘤、甲状腺癌、结肠直肠癌、卵巢癌、胰腺癌和膀胱癌等, 核心产品为 OncoScreen Plus 和 LungPlasma

基于GTID搭建主从MySQL

穿精又带淫゛_ 提交于 2020-08-13 00:30:47
目录 基于gtid搭建主从MySQL 一、GTID的使用 二、GTID的简介 三、GTID的构成 四、查看GTID的执行情况 4.1 gtid_executed 4.2 gtid_own 4.3 gtid_purged 五、MySQL的幂等性 六、拓展: 七、实验: 小实验1: 小实验2: 基于gtid搭建主从MySQL 一、GTID的使用 想让主从之间使用gtid的方式同步数据,需要我们在配置文件中开启mysql对gtid相关的配置信息 找到my.cnf ,在mysqld模块中加入如下的配置。(主库从库都这样) # on表示开启,OFF表示关闭 gtid-mode = ON # 下面的两个变量必须开启,否则MySQL拒绝启动 log-slave-updates = 1 log-bin = MySQL-bin # 必须开启,否则MySQL不启动,因为MySQL的SQL和gtid # 许多MySQL的SQL和GTID是不兼容的。比如开启ROW 格式时,CREATE TABLE … SELECT # 在binlog中会形成2个不同的事务,GTID无法唯一。 # 另外在事务中更新MyISAM表也是不允许的。 enforce_gtid_consistency = 1 # log-bin-index = MySQL-bin.index 对主库来说依然需要创建一个用于同步数据的账号 mysql

6.28日模拟考试总结(T1:翻转游戏;T2:抢掠计划,T3:测绘,T4:奖学金)

寵の児 提交于 2020-08-13 00:09:04
今天的考试有结束了,又一次被右边的同桌虐了(额,排名第三的大佬)但是考试还是进步了一名,算是有进步吧 成绩: 那个12名就是我,一个AC都没有,太难受了。 T1: 题目链接:http://hzoi.com/contest/39/ranklist/1(内部题库,不确保能进入) 题目: 题目是一个简化版,很水,直接2的16次方枚举就完了。 当时不知到咋回事居然TLE 60(尬); 直接看代码吧: #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; //monsters; int a[5][5],data[5][5]; int lowbit(int x){ return x&-x; } int get(int x){ int num=0; for(int j=x;j>0;j-=lowbit(j)){ num++; } return num; } void gai(int x,int y){ a[x][y]^=1; a[x+1][y]^=1; a[x-1][y]^=1; a[x][y-1]^=1; a[x][y+1]^=1; } void clear(){ for(int i=1;i<=4;i++){ for(int j=1;j<=4;j++){