redis支持两种方式的持久化,可以单独使用或者结合起来使用。第一种:RDB方式redis默认的持久化方式,第二种:AOF方式,需要手动修改配置。下面我们来看一下两种持久化方式以及持久化中所注意的一些问题。
持久化之RDB
rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在dump.rdb文件中(文件名在配置文件中dbfilename),默认打开可以到启动的目录去查看,注意: dump.rdb是在哪儿启动redis,就会在哪儿生成rdb文件。
- dump.rdb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21[root@momo1 ~]# cd /usr/local/redis/
[root@momo1 redis]# ll
总用量 156
-rw-rw-r--. 1 root root 34339 12月 18 23:19 00-RELEASENOTES
-rw-rw-r--. 1 root root 53 12月 18 23:19 BUGS
-rw-rw-r--. 1 root root 1805 12月 18 23:19 CONTRIBUTING
-rw-rw-r--. 1 root root 1487 12月 18 23:19 COPYING
drwxrwxr-x. 6 root root 4096 4月 27 19:40 deps
-rw-r--r--. 1 root root 36 4月 29 01:20 dump.rdb ##dump.rdb
-rw-rw-r--. 1 root root 11 12月 18 23:19 INSTALL
-rw-rw-r--. 1 root root 151 12月 18 23:19 Makefile
-rw-rw-r--. 1 root root 4223 12月 18 23:19 MANIFESTO
-rw-rw-r--. 1 root root 5201 12月 18 23:19 README
-rw-rw-r--. 1 root root 41561 4月 27 19:53 redis.conf
-rwxrwxr-x. 1 root root 271 12月 18 23:19 runtest
-rwxrwxr-x. 1 root root 280 12月 18 23:19 runtest-cluster
-rwxrwxr-x. 1 root root 281 12月 18 23:19 runtest-sentinel
-rw-rw-r--. 1 root root 7113 4月 29 00:26 sentinel.conf
drwxrwxr-x. 2 root root 4096 4月 27 19:41 src
drwxrwxr-x. 10 root root 4096 12月 18 23:19 tests
drwxrwxr-x. 5 root root 4096 12月 18 23:19 utils
redis进行快照的时机(在配置文件redis.conf中)
- save 900 1:表示900秒内至少一个键被更改则进行快照。
- save 300 10
- save 60 10000
redis实现快照的过程
- redis使用fork函数复制一份当前进程的副本(子进程)
- 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
- 当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。
手动执行save或者bgsave命令让redis执行快照。
save
是由主进程进行快照操作,会阻塞其它请求。bgsave
是由redis执行fork函数复制出一个子进程来进行快照操作。
文件修复:redis-check-dump
1
2
3[root@iZ94r8hgrjcZ /]# redis-check-dump dump.rdb
==== Processed 5 valid opcodes (in 45 bytes) ===================================
CRC64 checksum is OK
本篇博文主要讲解,Redis的基本使用、基本命令、数据类型以及通过java操作Redis数据库(Jredis)。内容命令过多,不会一一演示,建议读者联想记忆。如果还没有搭建好环境请参考上篇博文:http://blog.xiaoxiaomo.com/2016/02/23/Linux-软件安装之Redis/。
redis基础命令
获得符合规则的键名称
keys 表达式(?,* ,[],\?)
判断一个键是否存在
exists key删除键
del key
del key1 key2获得键值的数据类型type
返回值可能是这五种类型(string,hash,list,set,zset)。
注意:redis的命令不区分大小写
在我们使用数据库时,每次都需要获取数据库链接,而创建连接通常需要消耗较大的资源。对于一个很小的应用是没有什么问题,如果是一个复杂的数据库应用呢?是不是要很大的开销?如果我们去减少创建、关闭连接就会很好的降低资源消耗提升性能,于是就有了数据库连接池的出现。(注:本博客主要使用mysql数据库)
不使用连接池
需要mysql-connector-java-5.0.8-bin.jar1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50package com.xiaoxiaomo.pool;
import java.sql.*;
import java.util.ResourceBundle;
/**
* 不使用连接池
* JDBC DEMO
* Created by xiaoxiaomo on 2016/4/26.
*/
public class UnPool {
public static void main(String[] args) {
// 创建连接
Connection conn = null;
PreparedStatement statm = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql:///xiaoxiaomo?useUnicode=true&characterEncoding=UTF-8",
"root", "root");
String sql = "update sys_user set mobile= ? where id = ?";
statm = conn.prepareStatement(sql) ;
statm.setString(1,"15826008888");
statm.setInt(2,2);
int b = statm.executeUpdate() ;
if (b == 1) {
System.out.println("更新成功");
}
} catch (Exception e) {
System.out.println("插入失败");
e.printStackTrace();
} finally {
// 关闭连接 释放资源
try {
if (rs != null)
rs.close();
if (statm != null)
statm.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
上篇博文http://blog.xiaoxiaomo.com/2016/04/23/Java-NIO之通道/只是泛泛地讨论通道,现在我们将具体讨论文件通道(socket 通道将在下篇博客讨论)。FileChannel 类可以实现常用的 read,write 以及 scatter/gather 操作,同时它也提供了很多专用于文件的新方法。这些方法中的许多都是我们所熟悉的文件操作。
通道与缓冲区不同,通道 API 主要由接口指定
。不同的操作系统上通道实现(Channel Implementation)会有根本性的差异,所以通道 API 仅仅描述了可以做什么。因此很自然地,通道实现经常使用操作系统的本地代码。通道接口允许您以一种受控且可移植的方式来访问底层的 I/O服务。
当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器