Redis--主从复制

  redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库

  • 通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力主数据库主要进行写操作,而从数据库负责读操作

redis主从复制

Redis--安全策略

  可信环境下的可信用户才可访问redis。这意味着,将redis服务器直接暴露在Internet或者不可信用户可直接访问Redis的tcp端口或Unix套接字的环境,是不安全的。redis着重于高性能和简单易用,在安全方面做得并不好。

网络安全

bind参数(在redis.conf配置文件,添加bind可以让数据库只能在指定IP下访问)。
bind 127.0.0.1 [192.168.3.1 ……]
注意:bind后面指定的ip只能是本机的ip。

认证

设置数据库密码

  1. 修改配置requirepass password
  2. 验证密码auth password
  • 实例 : 修改密码为xiaoxiaomo
    1
    2
    3
    4
    #requirepass foobared
    requirepass xiaoxiaomo

    # Command renaming.

Redis--持久化方案及备份

  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
  1. redis进行快照的时机(在配置文件redis.conf中)

    1. save 900 1:表示900秒内至少一个键被更改则进行快照。
    2. save 300 10
    3. save 60 10000
  2. redis实现快照的过程

    1. redis使用fork函数复制一份当前进程的副本(子进程)
    2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
    3. 当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。
  3. 手动执行save或者bgsave命令让redis执行快照

    1. save是由主进程进行快照操作,会阻塞其它请求。
    2. bgsave是由redis执行fork函数复制出一个子进程来进行快照操作。
  4. 文件修复: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的基本使用基本命令数据类型以及通过java操作Redis数据库(Jredis)。内容命令过多,不会一一演示,建议读者联想记忆。如果还没有搭建好环境请参考上篇博文:http://blog.xiaoxiaomo.com/2016/02/23/Linux-软件安装之Redis/

redis基础命令

  1. 获得符合规则的键名称
    keys 表达式(?,* ,[],\?)

  2. 判断一个键是否存在
    exists key

  3. 删除键
    del key
    del key1 key2

  4. 获得键值的数据类型type
    返回值可能是这五种类型(string,hash,list,set,zset)

注意:redis的命令不区分大小写

Java--数据库连接池

  在我们使用数据库时,每次都需要获取数据库链接,而创建连接通常需要消耗较大的资源。对于一个很小的应用是没有什么问题,如果是一个复杂的数据库应用呢?是不是要很大的开销?如果我们去减少创建、关闭连接就会很好的降低资源消耗提升性能,于是就有了数据库连接池的出现。(注:本博客主要使用mysql数据库

不使用连接池

需要mysql-connector-java-5.0.8-bin.jar

1
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
50
package 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();
}
}
}
}

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器