[服务器] Redis 内存数据库学习笔记(二)

Redis 常见参数配置

Redis的设置,基本是在其根目录下的 redis.conf 文件里保存的。我们可以通过修改这个文件来配置一些参数。

1
vi /etc/redis/redis.conf

修改为后台启动

Redis 默认是在前台启动的,会阻塞当前终端,使用 Ctrl + C 即可关闭。
在 redis.conf 将文件中 daemonize 为 yes 即可后台启动

1
daemonize yes

添加访问密码

在redis.conf将文件中 为 requirepass 设定值。
范例(qiji.arno为密码)

1
requirepass qiji.arno

开启远程访问

默认情况下,Redis 服务器关闭了远程访问。开启访问的话,将bing注释掉就好。

1
#bind 127.0.0.1

设置日志和数据目录

使用终端创建如下所示的目录:

1
2
mkdir -p /opt/redis/logs
mkdir -p /opt/redis/data

设置日志和数据目录:

1
2
3
4
loglevel debug              #日志级别:默认为 notice
logfile /opt/redis/logs/redis.log #日志输出:默认为 stdout
dbfilename redis.rdb #默认为 dump.rdb
dir /opt/redis/data #默认为./

设置最大内存:

1
maxmemory 128mb
  • 尤其是在VPS上,不要设置太高,留有充足的内存供系统及其他应用程序使用。

备份策略

使用快照:snapshot

1
save 60 1000
  • 如上的设置,会在60s内、如果有1000个key发生改变就进行持久化。
  • 可设置多个save选项,默认持久化到dump.rdb。

文件追加(aof):append-only-file模式。

  • Redis会将每个接收到的“写命令”通过write函数追加到appendonly.aof文件,重启Redis时通过该文件重建整个数据库。
  • 由于os内核会缓存write函数所做的“修改”,可以使用fsync函数指定写入到磁盘的方式。
1
2
3
4
appendonly yes          #启动aof持久化方式
appendfsync always #对每条“写命令”立即写至磁盘
appendfsync everysec #默认每秒写入一次,在性能和可靠性之间的平衡
appendfsync no #依赖于os,不指定写入时机
两种方式的比较:
  • 快照方式:性能较好,但是快照间隔期间,如果宕机将造成数据丢失。
  • AOF 模式:影响性能,不容易造成数据丢失。
  • 如果 Redis 宕机:重启 Redis 即可,会自动使用 redis.rdb 和 appendonly.aof 恢复数据库。
主从备份:从数据安全性角度考虑。
  • 关闭快照功能。
  • 同时设置主从服务器都为AOF模式。
  • 说明:如果仅对Slave进行持久化设置,重启时,Slave自动和Master进行同步,全部数据丢失.

Java 中使用 Redis

Redis 官方推荐使用 Jedis 的 API 对 Redis 进行操作,所以就开始配置 Jedis 吧。

Maven pom 添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
   <dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>

构建 redis 缓存插件

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
package com.eliteams.XXXX.core.feature.cache.redis;

import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;

/**
* RedisCache : redis 缓存 插件
*/

@Component(value = "redisCache")
public class RedisCache {

private int port = 6379;
private String host = "115.29.143.109";

private Jedis jedis = new Jedis(host,port);

public String cache(String key, String value, int seconds) {
String result = jedis.set(key, value);
jedis.expire(key, seconds);
return result;
}

public String get(String key) {
return jedis.get(key);
}
}

构建 JedisTest 的测试类

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
package com.eliteams.XXXX.test.library.jedis;

import com.eliteams.XXXX.core.feature.cache.redis.RedisCache;
import com.eliteams.XXXX.core.feature.test.TestSupport;
import org.junit.Test;

import javax.annotation.Resource;

/**
* JedisTest : 测试 jedis 功能
*/
public class JedisTest extends TestSupport {

@Resource
private RedisCache redisCache;

@Test
public void testSet() {
redisCache.cache("qiji", "ARNO", 1 * 60 * 24);
}

@Test
public void testGet() {
System.out.printf(redisCache.get("qiji"));
}
}

测试结果

Redis测试结果01

Redis测试结果02

后记

好好学基础,遇到坑了,才知道怎么解决。不说多了,先去填坑。

参考资料