22 Redis高级(二)

目录

一 SpringBoot集成Redis

二 Redis高可用(主从复制,持久化)-->哨兵机制+keepalived

Redis主从复制集群

修改 slave (从服务器)redis.conf

Redis哨兵机制

三、Redis持久化

Redis持久化RDB(默认存储)

AOF持久化

四 、Redis事务

五、Redis发布订阅(用mq)


一 SpringBoot集成Redis

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

 

spring.redis.database=0
spring.redis.host=192.168.110.180
spring.redis.port=6379
spring.redis.password=123456
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.timeout=5000
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
//封装不全
@Service
public class RedisService {
	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	public void setObject(String key, Object value) {
		this.setObject(key, value, null);
	}

	public void setObject(String key, Object value, Long time) {
		if (StringUtils.isEmpty(key) || value == null) {
			return;
		}
		if (value instanceof String) {
			// 存放string类型
			String stringValue = (String) value;
			if (time == null) {
				stringRedisTemplate.opsForValue().set(key, stringValue);
			} else {
				stringRedisTemplate.opsForValue().set(key, stringValue, time, TimeUnit.SECONDS);
			}

			return;
		}
		if (value instanceof List) {
			// 存放list類型
			List<String> listValue = (List<String>) value;
			for (String string : listValue) {
				stringRedisTemplate.opsForList().leftPush(key, string);
			}

		}

	}

	public void delKey(String key) {
		stringRedisTemplate.delete(key);
	}

	public String getString(String key) {
		return stringRedisTemplate.opsForValue().get(key);

	}

}
@RestController
public class IndexController {
	@Autowired
	private RedisService redisService;

	@RequestMapping("/setObject")
	public String setString(String key, String value) {
		redisService.setObject(key, value, 30l);
		return "success";
	}

	@RequestMapping("/setList")
	public String setList(String key) {
		List<String> listValue = new ArrayList<String>();
		listValue.add("zhangsan");
		listValue.add("lisi");
		redisService.setObject(key, listValue);
		return "success";
	}

	@RequestMapping("/getString")
	public String getString(String key) {
		return redisService.getString(key);
	}

}

二 Redis高可用(主从复制,持久化)-->哨兵机制+keepalived

Redis高可用:哨兵机制+keepalived

哨兵机制:选举Master;keepalived:自动重启 。 

主从复制:数据备份,读写分离,集群,高可用,宕机容错机制

实现主从复制:只是需要修改配置文件

redis只能一主多备 ,nginx多主多备

高可用机制----

哨兵机制(投票选举):监听服务器 ,如果监听主服务器宕机,会在从服务器根据投票选择为主服务器;

                如果所有的服务器都宕机了,用keepalived(高可用)监听,自动重启,一直重启失败,发送邮件给运维人员。

keepalived是重启脚本,任何软件一个挂了,都可监听,进行重启

 

 

Redis主从复制集群

mysql主从复制原理:二进制存储文件,Mycat反向代理

如果redis的主服务器挂了,从服务器实时把主服务器里面的快照文件拿过来,执行一次;如果有延迟,重试机制再次执行

搭建服务器集群

  注意:1使用root账号登录 2关闭所有防火墙

关闭防火墙

修改 slave (从服务器)redis.conf

192.168.110.181为主服务器

修改slave从redis中的 redis.conf文件

slaveof 192.168.110.181  6379  

masterauth 123456--- 主redis服务器配置了密码,则需要配置

cd redis/   cd  bin

启动后输入命令 ping 和 info

Redis哨兵机制

管理多台服务器,哨兵(sentinel) 的一些设计思路和zookeeper非常类似

实现步骤: 修改从服务器

1.拷贝到etc目录

先进入 cd redis

cp sentinel.conf  /usr/local/redis/etc

2.修改sentinel.conf配置文件,找到模板示例进行修改

cd  /usr/local/redis/etc

sentinel monitor mymast  192.168.110.181  6379 1  #主节点 名称 IP 端口号 选举次数

sentinel auth-pass mymaster 123456 

关闭防火墙

3. 修改心跳检测 5000毫秒

sentinel down-after-milliseconds mymaster 5000

4.sentinel parallel-syncs mymaster 2 --- 做多多少合格节点

5. 启动哨兵模式 进入bin目录启动

./redis-server /usr/local/redis/etc/sentinel.conf --sentinel &

启动成功

6. 停止哨兵模式

宕机命令:shutdown  宕机后重新选择服务器为主服务器

三、Redis持久化

redis宕机后,数据不会消失

什么是Redis持久化,就是将内存数据保存到硬盘。

Redis 持久化存储 (AOF 与 RDB 两种模式),默认开启rdb存储,可以同时开启

rdb存储和aof存储

rdb存储:二进制文件方式,不是实时存储。存储10key以上,开始持久化机制,体积小

aof存储:日志文件存储,文件大,在文件末尾进行累加

Redis持久化RDB(默认存储)

RDB 是以二进制文件,是在某个时间 点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。

先关闭哨兵机制,关闭后redis不会关闭,rdb宕机会做灾难备份,但是不是实时的,杀死进程不能灾难备份,需要达到一定的key的次数才会保存

RDB 默认开启,redis.conf 中的具体配置参数如下;

#dbfilename:持久化数据存储在本地的文件
dbfilename dump.rdb
#dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下
dir ./
##snapshot触发的时机,save    
##如下为900秒后,至少有一个变更操作,才会snapshot  
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度  
##可以通过“save “””来关闭snapshot功能  
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000
##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等  
stop-writes-on-bgsave-error yes  
##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间  
rdbcompression yes  

AOF持久化

AOF 默认关闭,开启方法,修改配置文件 reds.conf:appendonly yes

##此选项为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  

redis宕机后,redis会失效吗?

答:不会,默认开启rdb 

四 、Redis事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历以下三个阶段:

开始事务。

命令入队。

执行事务。

 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

序号

命令及描述

1

DISCARD 
取消事务,放弃执行事务块内的所有命令。

2

EXEC 
执行所有事务块内的命令。

3

MULTI 
标记一个事务块的开始。

4

UNWATCH 
取消 WATCH 命令对所有 key 的监视。

5

WATCH key [key ...] 
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

 

五、Redis发布订阅(用mq)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值