Redis 持久化 RDB 和 AOF

Redis 持久化 RDB 和 AOF Redis本身的机制是 AOF 持久化开启且存在AOF文件时,优先加载AOF文件;AOF 关闭或者AOF文件不存在时,加载RDB文件;加载AOF/RDB文件城后,Redis启动成功;AOF/RDB文件存在错误时,Redis启动失败并打印错误信息 RDB快照持久化 RDB 持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘。在创建快照之后,用户可以备份该快照,可以将快照复制到其他服务器以创建相同数据的服务器副本,或者在重启服务器后恢复数据。RDB是Redis默认的持久化方式 快照持久化 RDB持久化会生成RDB文件,该文件是一个压缩过的二进制文件,可以通过该文件还原快照时的数据库状态,即生成该RDB文件时的服务器数据。RDB文件默认为当前工作目录下的dump.rdb,可以根据配置文件中的dbfilename和dir设置RDB的文件名和文件位置 # 设置 dump 的文件名 dbfilename dump.rdb # 工作目录 # 例如上面的 dbfilename 只指定了文件名, # 但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。 dir ./ 触发快照的时机 执行 save 和 bgsave 命令 配置文件设置 save <seconds> <changes>规则,自动间隔性执行bgsave命令 主从复制时,从库全量复制同步主库数据,主库会执行bgsave 执行 flushall 命令清空服务器数据 执行 shutdown 命令关闭 Redis 时,会执行 save命令 save 和bgsave命令 执行save 和bgsave命令,可以手动触发快照,生成RDB文件,两者的区别如下 使用save 命令会阻塞Redis服务器进程,服务器进程在RDB文件创建完成之前是不能处理任何的命令请求 而使用bgsave 命令不同的是,basave命令会fork一个子进程,然后该子进程会负责创建RDB文件,而服务器进程会继续处理命令请求 fork() 是由操作系统提供的函数,作用是创建当前进程的一个副本作为子进程 fork 一个子进程,子进程会把数据集先写入临时文件,写入成功之后,再替换之前的RDB文件,用二进制压缩存储,这样可以保证RDB文件始终存储的是完整的持久化内容 自动间隔触发 在配置文件中设置 save <seconds> <changes> 规则,可以自动间隔性执行bgsave命令 # SNAPSHOTTING ################################ # # Save the DB on disk: # # save <seconds> <changes> # # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving completely by commenting out all "save" lines. # # It is also possible to remove all the previously configured save # points by adding a save directive with a single empty string argument # like in the following example: # # save "" save 900 1 save 300 10 save 60 10000 # save <seconds> <changes>表示在seconds秒内,至少有changes次变化,就会自动触发gbsave命令 save 900 1 # 当时间到900秒时,如果至少有1个key发生变化,就会自动触发bgsave命令创建快照 save 300 10 # 当时间到300秒时,如果至少有10个key发生变化,就会自动触发bgsave命令创建快照 save 60 10000 # 当时间到60秒时,如果至少有10000个key发生变化,就会自动触发bgsave命令创建快照 RDB RDB 持久化 执行 rdb 持久化时, Redis 会fork 出一个子进程, 子进程将内存中数据写入到一个紧凑的文件中, 因此它保存的是某个时间点的完整数据。 ...

2019-12-23 · 5 min · 1026 words · -

DCEVM, HotSwapAgent

DCEVM, HotSwapAgent https://blog.csdn.net/u013613428/article/details/51499911 要高效的开发Java代码,那就必须要让java像js一样,修改过的代码可以实时的反应出来。要了解如何做到这一点,我们先要知道JVM是如何工作的: 我们知道,JAVA程序都是运行在java虚拟机上面 (当然JVM有两种类型,JDK和单纯的JRE,这里我们主要是指的JDK,因为只有JDK包含了debug功能,而我们只有在debug端口打开的情况下才能实现run time class load) ,我们的写的每一个Java文件,会被编译器编译成为class文件,然后根据选择不同的打包选择,比如说 (jar, war, ear) ,被打包存放到系统的classpath中。在运行一个java程序的时候,会有几个步骤, 包括装载,链接,初始化,翻译 (在翻译成机器码的时候同时会对代码进行优化,inline) ,运行,就如下图 这里的关键,就是这个classloader。所有的类都会在jvm中生成为class对象,存放在内存当中, (这里,主要分成两部分,常量池和方法字节码) 当我们的程序生成一个类的实例或instance时候,就会根据这个类对象,分配和初始化内存用于存储对象的field,然后在调用对象方法的时候,则从class对象中获取方法字节码,如下图: 因此,如果我们能够在JVM里面途欢这个class对象,那么我们创建的所有object或instance,在调用函数的时候,就可以动态获得你修改之后的代码。如下图: hotswap的原理,就是替换jvm里面的class对象. Sun 在2002年把这项技术引入到java 1.4的JVM中,Hotswap需要和debuggerAPI一起协同工作,我们可以通过debugger来更新jvm里面同名的class bytecode 因此,这也就限制了,我们在使用hotswap的时候,必须使用debug mode.因此也就限制了java app必须是运行在jdk上,而不是jre上,JAVA_HOME必须指向JDK。 说了这么多理论,回到我们最初的话题,如何做到hotswap呢,步骤很简单: 用debug模式attach我们的app 修改你的java文件,并且编译 这时,神奇的事情发生了,如下图 我们的class被reload了,我们可以不用重新把app部署到服务器上就可以直接看修改代码之后的结果。 等等,天底下有这么容易的事情吗?!这个solution是有缺陷的,那就是我们只能简单修改class method的内容,如果我们新添加了Method,field,或者在method里面引用了新的lib,增加了Import语句,那么对不起,你会看到: hot swap失败了。 那么有没有什么解决方案呢?有!收费的JRebel,或者免费的HotSwapAgent+DCEVM 让我们来看看什么是DCEVM: https://dcevm.github.io/ The Dynamic Code Evolution VirtualMachine (DCEVM)is a modification of the Java HotSpot(TM) VM that allows unlimited redefinitionof loaded classes at runtime. The current hotswapping mechanism of the HotSpot(TM) VM allows only changing methodbodies. Our enhanced VMallows adding and removing fields and methods as well as changes to the supertypes of a class. ...

2019-12-17 · 1 min · 177 words · -

awk、grep、sed

awk、grep、sed awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。 grep适合单纯的查找或匹配文本, sed适合编辑匹配到的文本, awk适合格式化文本,对文本进行较复杂格式处理。 awk https://blog.wiloon.com/?p=3738 sed https://blog.wiloon.com/?p=2838 grep https://blog.wiloon.com/?p=468 https://thief.one/2017/08/12/1/

2019-12-11 · 1 min · 12 words · -

Funtoo

Funtoo Funtoo Linux 是由 Daniel Robbins (Gentoo Linux的创始人和前项目领袖) 和一个核心开发团队基于 Gentoo 的发行版,它基于一个简单的愿景, 那就是提升 Gentoo Linux 中的核心技术。 https://imtx.me/archives/923.html https://www.funtoo.org/Welcome

2019-12-09 · 1 min · 17 words · -

基站定位

基站定位 MCC: 国家码 MNC: 运营商码 LAC: 位置区码, 大区 CellID: 基站塔码, 小区

2019-11-26 · 1 min · 11 words · -

VMware ESXi

VMware ESXi http://idc.wanyunshuju.com/li/580.html free license https://kb.vmware.com/s/article/2107518 虚拟机导出 各种类型的文件 .ovf OVF 模板,该模板将虚拟机或虚拟设备的状态捕获到一个自包含的包中,并且磁盘文件以压缩格式存储。 .mf .iso .vmdk 虚拟机磁盘, Virtual Machine Disk .nvram 虚拟机 BIOS 或 EFI 配置

2019-11-11 · 1 min · 24 words · -

state和status的区别

state和status的区别 state和status的区别 state: 比较常用,各种状态都可以用它,但是它更着重于一种心理状态或者物理状态。 Status: 用在人的身上一般是其身份和地位,作"状态,情形"讲时,多指政治和商业。 state倾向于condition,是一种延续性的状态。status常用于描述一个过程中的某阶段 (phase) ,类似于C语言中枚举型变量某一个固定的值,这个值属于一个已知的集合。 比如淘宝买家问卖家"我的网购现在是什么状况?" 这个问题的背景是讲话双方都清楚,交易状态有"买家选购"“买家已付款"“卖家已发货"“买家已签收"或者有"买家已 投诉"等等状态。这些状态描述一件事情发展过程中的不同阶段。而且,这些阶段的先后顺序也是双方默许的。 所以在这里可以问"What’s the status of my purchase?",此处用state不太贴切,如果硬用上去从语感上可能听着别扭。 说物态变化用state再恰当不过。如果说一个物质的四种状态,可以说"solid state”,但如果你说"solid status”,第 一,这两个词的组合不像是描述物态,更像是在说"确定的状况 (solid产生歧义’确定的/确凿的’) “;第二,这个说法即 使不被误解,也需要事先约定一组物态变化顺序,比如把这个物质从固态开始加热然后电离,可能先后经历固态、液态、气态、等离子态这四个阶段。类似先定义枚举,然后引用的方式。 扩展: ajax中readyState,statusText,onreadystatechange,window.status怎么一会state一会是status都晕乎了 state所指的状态,一般都是有限的、可列举的,status则是不可确定的。 比如 readyState - 就那么四五种值 statusText - 描述性的文字,可以任意 onreadystatechange - 那么四五种值之间发生变化 window.status - 描述性的文字,可以任意 来个形象的比方,你体重多少公斤,属于status,但说你体重属于偏瘦、正常还是偏胖,那就是state. https://www.cnblogs.com/likebeta/archive/2012/07/03/2574595.html

2019-11-08 · 1 min · 43 words · -

golang 位运算

golang 位运算 & 位运算 AND | 位运算 OR ^ 位运算 XOR &^ 位清空 (AND NOT) << 左移 >> 右移 无符号右移 https://blog.wiloon.com/?p=15522 & 操作符 假设给定数值 a,b 只有满足 a = b = 1 的情况下下 AND(a,b) = 1,否则为 0 所以AND的另外一个很好的效果是可以用于把一个整数进行清零。 func main() { var x uint8 = 0xAC // x = 10101100 x = x & 0xF0 // x = 10100000 } | 操作符, OR | 操作符对整数部分执行OR操作。回顾一下OR操作符的属性: 给定数值 a, b 当 a = 1 或者 b = 1 OR(a,b) = 1 否则为 0 我们可以对一个给定的整数选择性地使用OR操作符设置各个位的值。例如,在下面的例子中,我们使用OR运算符 (从最低位到最高位 (MSB) ) 将第3位,第7位和第8位设置为1。 ...

2019-11-06 · 1 min · 124 words · -

TC1

TC1 https://ljr.im/articles/streamline-the-fibonacci-tc1-firmware/ docker pull python:2-slim-stretch docker run -it -name mico -v /home/wiloon/tmp/mico:/workdir python:2-slim-stretch bash apt update && apt install git wget lib32ncurses5 ln -s /usr/local/bin/python /usr/bin/python 容器bash pip install mico-cube && \ cd /workdir && \ wget http://firmware.mxchip.com/MiCoder_v1.1.Linux.tar.gz && \ tar -zxf MiCoder_v1.1.Linux.tar.gz && \ rm MiCoder_v1.1.Linux.tar.gz && \ mico config -global MICODER /workdir/MiCoder 容器bash cd /workdir && \ mico new TC1 -create-only 容器bash cd /workdir/TC1 && \ mico add https://code.aliyun.com/mico/mico-os.git/#6c465211d3ff8797cd835e400ec54a06530dd476 容器bash git clone https://github.com/cnk700i/tc1_mqtt.git && \ mv tc1_mqtt/TC1 . && \ ...

2019-11-02 · 2 min · 232 words · -

MySQL 默认排序

MySQL 默认排序 不加order by 的情况 下, 顺序 不能保证, 不同存储引擎, 有过增删改操作 都有可能 影响默认顺序, 默认排序只依赖于内部实现, 不同版本的MySQL也有可能 不同. 所以不能依赖默认排序. https://my.oschina.net/alarm1673/blog/1814508 https://stackoverflow.com/questions/8746519/sql-what-is-the-default-order-by-of-queries

2019-10-29 · 1 min · 18 words · -

jdbi

jdbi JDBI jdbi jdbi是我比较喜欢的一个数据库中间件,它是非 ORM 的,特别适合于数据库固定不变的场景,即不会对应多种数据库,以后也不会更换数据库的场景。 如果不是这种场景,那么使用jdbc或者最好选择hibernate等对多种数据库兼容较好的中间件。 基于上述使用场景,jdbi的优点有: 和 jdbci 比较接近,使用和掌握非常简单。 与时俱进,例如说现在最新的 jdbi3,增加了流式编程函数式等编程风格。 源代码的实现思路非常清晰,有一种美感。使用jdbi封装出的数据库代码也非常清晰。 jdbi 的两种风格 Fluent Api handle.createUpdate(“INSERT INTO user(id, name) VALUES (:id, :name)”) .bind(“id”, 2) .bind(“name”, “Clarice”) .execute(); 这里就是java8的流式风格,用连贯式表达式将一个sql实现串在一起 Declarative Api // Define your own declarative interface public interface UserDao { @SqlUpdate("CREATE TABLE user (id INTEGER PRIMARY KEY, name VARCHAR)") void createTable(); @SqlUpdate("INSERT INTO user(id, name) VALUES (?, ?)") void insertPositional(int id, String name); @SqlUpdate("INSERT INTO user(id, name) VALUES (:id, :name)") void insertNamed(@Bind("id") int id, @Bind("name") String name); @SqlUpdate("INSERT INTO user(id, name) VALUES (:id, :name)") void insertBean(@BindBean User user); @SqlQuery("SELECT * FROM user ORDER BY name") @RegisterBeanMapper(User.class) List<User> listUsers(); } 声明式的主要是使用注解来实现,在实际的面向对象风格的代码中,我个人觉得声明式的比较简洁,容易阅读和维护。所以下面都按照Declarative Api的方式。 ...

2019-10-29 · 1 min · 105 words · -

linux typeset

linux typeset https://blog.csdn.net/blackmanren/article/details/9281201 typeset 用于设置变量属性, 如大小写,宽度,左右对齐等都可以用typeset来控制, 当用typeset改变一个变量的属性时,这种改变是永久的,下面以ksh为例,演示typeset的几种典型用法 typeset的-u选项可以将一个变量的字符变成大写 /home/lee#typeset -u var=abc /home/lee#echo $var ABC 3:typeset的-l选项将一个变量的字符变成小写 /home/lee#typeset -l var=ABC /home/lee#echo $var abc typeset的-L选项把变量变成一个左对齐的4个字符串,有些像字符串截取 /home/lee#typeset -L4 var=abcdefg /home/lee#echo $var abcd typeset的-R选项把变量变成一个右对齐的4个字符串 /home/lee#typeset -R4 var=abcdefg /home/lee#echo $var defg typeset的-Z选项把串变成一个空填充,占15个字符位的串,冒号用来保护空白符 typeset -Z15 var=“abc ddd” /home/lee#echo “$var” ^^^^^^^^abc ddd #^为空白 /home/lee#typeset -LZ15 var=“abc 123” /home/lee#echo “$var$var” abc 123 abc 123 7:变量n是一个被设置成一个整数的变量,typeset命令将整数n前面补齐0,共15个字符位 /home/lee#typeset -i n=24 /home/lee#typeset -Z15 n /home/lee#echo $n 000000000000024 8:变量answer被给定一个值-Yes并变成一个小写,左对齐,一个字符的串 /home/lee#typeset -lL1 answer=Yes /home/lee#echo $answer ...

2019-10-28 · 1 min · 113 words · -

ConcurrentLinkedDeque

ConcurrentLinkedDeque 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例 在java中,最常用的数据结构可能是列表。有数目不详的元素列表,你可以添加、阅读、或删除任何位置的元素。此外,并发列表允许不同的线程列表中添加或删除元素时不产生任何数据不一致。非阻塞列表提供如下操作,如果操作不能立即完成,列出抛出异常或者返回一个null值。Java 7中引入了ConcurrentLinkedDeque类,它实现了一个非阻塞并发列表,在本教程中,我们将学习使用这个类。 在这个例子中,我们将实现一个示例使用以下两个不同的任务: 一个将大量数据添加到一个列表中 一个大量地从同样的列表中删除数据 让我们为每个任务创建的线程: package com.howtodoinjava.demo.multithreading.concurrentLinkedDequeExample; import java.util.concurrent.ConcurrentLinkedDeque; public class AddTask implements Runnable { private ConcurrentLinkedDeque<String> list; public AddTask(ConcurrentLinkedDeque<String> list) { this.list = list; } @Override public void run() { String name = Thread.currentThread().getName(); for (int i = 0; i < 10000; i++) { list.add(name + ": Element " + i); } } } 和: packagecom.howtodoinjava.demo.multithreading.concurrentLinkedDequeExample; importjava.util.concurrent.ConcurrentLinkedDeque; publicclass RemoveTask implementsRunnable { privateConcurrentLinkedDeque<String> list; publicRemoveTask(ConcurrentLinkedDeque<String> list) { this.list = list; } @Override publicvoid run() { for(inti = 0; i < 5000; i++) { list.pollFirst(); list.pollLast(); } } } ...

2019-10-23 · 2 min · 288 words · -

ansible 变量

ansible 变量 ram_size: “{{ (ansible_memtotal_mb * 0.8)|int }}” --- - hosts: 'all' vars: var0: 'value0'

2019-10-21 · 1 min · 15 words · -

application start script

application start script #! /usr/bin/env bash APP_HOME=/data/server/app0 APP_NAME=app0 PID_FILE=/var/run/app0.pid startApp(){ cd ${APP_HOME} nohup java -jar ${APP_NAME}.jar > log 2>&1 & echo $! > ${PID_FILE}; } stopApp(){ kill `cat ${PID_FILE}` } case $1 in start) startApp ;; stop) stopApp ;; restart) stopApp startApp ;; *) echo "usage: wrapper {start|stop|restart}" ;; esac exit 0

2019-10-21 · 1 min · 52 words · -

Java Mission Control, jmc

Java Mission Control, jmc https://github.com/JDKMissionControl/jmc https://www.oracle.com/java/technologies/javase-overview.html download https://ci.adoptopenjdk.net/view/JMC/job/jmc-latest/

2019-10-14 · 1 min · 8 words · -

redis thread

redis thread https://www.cnblogs.com/traditional/p/13273089.html 在 Redis4.0 之前,Redis 是单线程运行的 但是单线程并不代表效率就低 因为底层采用了基于 epoll 的 IO 多路复用

2019-10-11 · 1 min · 13 words · -

获取网络时间

获取网络时间 public class GetNetworkTime { public static void main(String[] args) { String webUrl2 = "http://www.baidu.com";//百度 String webUrl3 = "http://www.taobao.com";//淘宝 String webUrl4 = "http://www.ntsc.ac.cn";//中国科学院国家授时中心 String webUrl5 = "http://www.360.cn";//360 System.out.println(getWebsiteDatetime(webUrl2) + " [百度]"); System.out.println(getWebsiteDatetime(webUrl3) + " [淘宝]"); System.out.println(getWebsiteDatetime(webUrl4) + " [中国科学院国家授时中心]"); System.out.println(getWebsiteDatetime(webUrl5) + " [360安全卫士]"); } /** * 获取指定网站的日期时间 * * @param webUrl * @return * @author SHANHY * @date 2015年11月27日 */ private static String getWebsiteDatetime(String webUrl){ try { URL url = new URL(webUrl);// 取得资源对象 URLConnection uc = url.openConnection();// 生成连接对象 uc.connect();// 发出连接 long ld = uc.getDate();// 读取网站日期时间 Date date = new Date(ld);// 转换为标准时间对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);// 输出北京时间 return sdf.format(date); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } } https://blog.csdn.net/catoop/article/details/50076879

2019-10-09 · 1 min · 119 words · -

golang MP4文件服务器

golang MP4 文件服务器 https://studygolang.com/articles/11204 package main import ( "github.com/gorilla/handlers" "log" "net/http" "os" "time" ) func ServeHTTP(w http.ResponseWriter, r *http.Request) { video, err := os.Open("/tmp/foo.mp4") if err != nil { log.Fatal(err) } defer video.Close() http.ServeContent(w, r, "foo.mp4", time.Now(), video) } func main() { http.HandleFunc("/", ServeHTTP) _ = http.ListenAndServe(":8089", handlers.LoggingHandler(os.Stdout, http.DefaultServeMux)) }

2019-09-27 · 1 min · 50 words · -

termite

termite vim ~/.config/termite/config font = Source Code Pro 10 Termite是一种基于VTE的最小终端仿真器,它是一个模态应用程序,类似于Vim,具有插入模式和选择模式,其中键绑定具有不同的功能,Termite基于VTE库,这是一个你喜欢每天与之互动的终端,特别是当它与i3窗口管理器结合时,其主要功能包括: 灵活性。 众多主题。 有许多关键绑定可供考虑用于捷径。 与其他应用程序集成,例如Oh-my-zsh。 历史搜索。 支持bash和zsh shell。 提供了AppImages。 最小的设计用户界面。 keyboard-centric VTE-based terminal https://wiki.archlinux.org/index.php/Termite https://github.com/thestinger/termite https://ywnz.com/linuxml/4305.html

2019-09-26 · 1 min · 25 words · -