20181021 Spring使用Redis数据库

一、linux下redius的安装
1.下载https://redis.io/download
2.redis图形化工具redisClient
3.将下载的包上传到linux上
4.解压 : tar -zxvf redis文件名.tar.gz
5.进入解压后的目录,执行 make 命令
①若报make[1]: *** [adlist.o] 错误 127,按顺序逐个执行以下命令:(ps:Redis是C实现的,需要gcc来进行编译,所以原因是系统未安装gcc.)
(可选)
yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
②若报“在包含自 adlist.c:34 的文件中:
zmalloc.h:50:31: 错误:jemalloc/jemalloc.h:没有那个文件或目录”,
执行以下命令:make MALLOC=libc
6.进入src目录,执行make install
7.启动在bin文件夹中 执行./redis-server
8.若远程连接报错,修改redis.conf文件,将bind 127.0.0.1注释掉,将"protected-mode yes" 改为 “protected-mode no” ,通过./redis-server redis.conf启动
9.redis默认为前台启动,当启动后会占用linux前台进程导致无法linux进行其他操作,通过修改redis.conf的"daemonize no" 改为 “daemonize yes”.

二、redis的五种数据类型,String,list,set,zset,hash

三、集成
1.导包

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

2.操作示例

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisService {
	@Autowired
	private StringRedisTemplate stringRedisTemplate;// 操作redis的类,springboot以集成,注入即可

	public void setString(String key, String value) {
		setObject(key, value, null);
	}
	
	public void setString(String key, String value, Long time) {
		setObject(key, value, time);
	}

	public void setList(String key, List<String> value, Long time) {
		setObject(key, value, time);
	}

	public void setMap(String key, Map<String, String> map, Long time) {
		setObject(key, map, time);
	}

	public void setObject(String key, Object value, Long time) {
		if (StringUtils.isEmpty(key) || value == null) {
			return;
		}

		// 存放的String类型
		if (value instanceof String) {
			String str = (String) value;
			if (time != null) {
				stringRedisTemplate.opsForValue().set(key, str, time, TimeUnit.SECONDS);
			} else {
				stringRedisTemplate.opsForValue().set(key, str);
			}
			return;
		}

		// 存放list
		if (value instanceof List) {
			List<String> list = (List<String>) value;
			for (int i = 0; i < list.size(); i++) {
				stringRedisTemplate.opsForList().leftPush(key, list.get(i));
			}
			return;
		}

		// 存放Hash
		if (value instanceof Map) {
			Map<String, String> map = (Map<String, String>) value;
			stringRedisTemplate.opsForHash().putAll(key, map);
			return;
		}
	}
}

4.主从复制
①哨兵机制:选举leader
②keepalived监听,自动重启。重启失败发邮件
③主从复制,在从服务器的redis上配置redis.conf文件 “slaveof 主服务器id 主服务器端口号”,若主服务器有密码 配置“masterauth ”;
④主从复制,进入主服务器客户端"./redis-cli -h 127.0.0.1 -p 6379" ,输入"info",可以看到从服务器信息。
⑤主从复制,从redis默认只读。

5.哨兵机制
5.1 但当前的主服务器宕机,选举集群中的主服务器。
5.2
在redis解压目录中配置sentinel.conf文件,端口号默认为26379

sentinel monitor mymaster 127.0.0.1 6379 2   //配置主服务器ip端口号
解释:这一行代表sentinel(哨兵)监控的master的名字叫做mymaster,地址为127.0.0.1:6379,行尾最后的一个2代表什么意思呢?我们知道,网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了,当sentinel集群式,解决这个问题的方法就变得很简单,只需要多个sentinel互相沟通来确认某个master是否真的死了,这个2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。(sentinel集群中各个sentinel也有互相通信,通过gossip协议)。
sentinel auth-pass <master-name> <password> //配置主服务器密码
sentinel down-after-milliseconds <master-name> <milliseconds>//配置心跳检测时间
sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。

5.3启动哨兵 ./redis-server sentinel.conf --sentinel &

6.redis的持久化
6.1将内存数据保存到硬盘上
6.2 持久化方式
6.2.1 RBD持久化:RDB 是以二进制文件,是在某个时间 点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
优点:使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
缺点:RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
6.2.2 ROF持久化:
Append-only file,将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在 append 操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当 server 需要数据恢复时,可以直接 replay 此日志文件,即可还原所有的操作过程。AOF 相对可靠,它和 mysql 中 bin.log、apache.log、zookeeper 中 txn-log 简直异曲同工。AOF 文件内容是字符串,非常容易阅读和解析。
优点:可以保持更高的数据完整性,如果设置追加 file 的时间是 1s,如果 redis 发生故障,最多会丢失 1s 的数据;且如果日志写入不完整支持 redis-check-aof 来进行日志修复;AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)。
缺点:AOF 文件比 RDB 文件大,且恢复速度慢。

6.3 Redis 默认使用RDB持久化方式。存储的文件名可在redis.conf中的dbfilename “dump.rdb” 中配置。通过在redis.conf配置文件中配置save来配置持久化策略#save时间,ps:(以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000 )

6.4AOF进行持久化

##此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
##只有在“yes”下,aof重写/文件同步等特性才会生效  
appendonly yes  

##指定aof文件名称  
appendfilename appendonly.aof  

##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec  
appendfsync everysec  
##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”  
no-appendfsync-on-rewrite no  

##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”  
auto-aof-rewrite-min-size 64mb  

##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。  
##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后  
##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。  
auto-aof-rewrite-percentage 100  

6.5redis事务
mulit开启事务,exec提交事务

猜你喜欢

转载自blog.csdn.net/qiaoqiyu6416/article/details/83246425