redis手册(常用知识总结)

redis介绍

redis安装

网址

官网:https://redis.io/
下载地址:http://download.redis.io/releases/

安装

  • 准备环境: yum install tcl make gcc
  • 第一步:redis的tar包上传到linux系统
  • 第二步:解压缩redis。tar –xvf xxx.tar.gz,解压到某处: /usr/local/redis
  • 第三步:编译。直接在redis 目录下敲make
  • 第四步:安装。make install

启动

cd ./src
./redis-server …/redis.conf
redis.conf为配置文件,如果需要启动多个redis实例,配置多份redis.conf文件即可

连接

cd ./src
./redis-cli
(启动的语法 ./redis-cli [-h ip] [-p port] [-a password])

配置文件

vim /usr/local/redis/redis.conf

#修改如下几行信息

bind 0.0.0.0#不限制访问ip和远程连接

protected-mode no#保护模式

daemonize yes#后台运行线程

redis服务开机自启动

启动脚本 redis_init_script 位于位于redis的 /utils/ 目录下。

#大致浏览下该启动脚本,发现redis习惯性用监听的端口名作为配置文件等命名,我们后面也遵循这个约定。

#redis服务器监听的端口
REDISPORT=6379
#服务端所处位置,在make install后默认存放与/usr/local/bin/redis-server,如果未make install则需要修改该路径,下同。
EXEC=/usr/local/bin/redis-server
#客户端位置
CLIEXEC=/usr/local/bin/redis-cli
#Redis的PID文件位置
PIDFILE=/var/run/redis_${REDISPORT}.pid

#配置文件位置,需要修改
CONF="/etc/redis/${REDISPORT}.conf"

配置环境

1.根据启动脚本要求,将修改好的配置文件以端口为名复制一份到指定目录。需使用root用户。
mkdir /etc/redis
cp redis.conf /etc/redis/6379.conf

2.将启动脚本复制到/etc/init.d目录下,本例将启动脚本命名为redisd(通常都以d结尾表示是后台自启动服务)。

cp redis_init_script /etc/init.d/redisd

3.设置为开机自启动

在启动脚本开头添加如下两行注释以修改其运行级别:

#!/bin/sh
在这里插入图片描述

#设置为开机自启动服务器
chkconfig redisd on
#打开服务
service redisd start
#关闭服务
service redisd stop

redis五种数据结构

  • string 字符串类型
  • hash 散列类型
  • list 列表类型
  • set 集合类型
  • zset(Sorted Set) 有序集合类型

java操作redis

jedis

spring boot 整合redis

StringRedisTemplate

Spring整合Redis集群
1.pom.xml

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

2.application.properties
##服务器
spring.redis.cluster.nodes=192.168.159.129:7001,192.168.159.129:7002,192.168.159.129:7003,192.168.159.129:7004,192.168.159.129:7005,192.168.159.129:7006
##连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=300
##Redis数据库索引(默认为0)
spring.redis.database=0
##连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
##连接池中的最大空闲连接
spring.redis.pool.max-idle=100
##连接池中的最小空闲连接
spring.redis.pool.min-idle=20
##连接超时时间(毫秒)
spring.redis.timeout=60000

RedisTemplate
StringRedisTemplate

redis 主从复制

修改master redis.conf配置文件
  1. bind 0.0.0.0 #不限制访问ip和远程连接(或者直接注释掉)
  2. protected-mode no#保护模式
  3. requirepass 123456
修改slave redis.conf配置文件         
  1. slaveof 192.168.98.129(mater的ip) 6379(master port)
  2. masterauth 123456(master的密码)

主从复制的过程原理

1.当从库和主库建立MS关系后,会向主数据库发送SYNC命令
2.主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来
3.当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis
4.从Redis接收到后,会载入快照文件并且执行收到的缓存的命令
5.之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致

redis 哨兵模式 高可用

在Redis的源码中包含了一个名为 sentinel.conf 的文件, 这个文件就是带有注释的Sentinel(哨兵)的配置文件的示例。
如果想要运行一个“哨兵”程序,需修改以下配置:

# bind 127.0.0.1 192.168.1.1#注释掉或者值为0.0.0.0
protected-mode no#关闭保护模式
port 26379 #端口号
daemonize yes#后台运行
dir /usr/local/tmp#解除挂载信息目录
sentinel monitor mymaster 192.168.98.129 6379 1#设置 主名称 ip地址(当前master) 端口号 参与选举的哨兵数
sentinel down-after-milliseconds mymaster 3000#sentinel心跳检测主3秒内无响应,视为挂掉,开始切换其他从为主
sentinel parallel-syncs mymaster 1#每次最多可以有1个从同步主。一个从同步结束,另一个从开始同步。
sentinel failover-timeout mymaster 18000#主从切换超时时间

启动哨兵模式
./redis-server …/sentinel.conf --sentinel &
或者
./redis-sentinel …/sentinel.conf

注意事项

所有的配置文件里面都需配置masterauth “123456”(如果有密码).因为当master挂掉再重启后就会变成slave,需在从新的master上同步快照数据。

master 挂掉哨兵重新选出master之后,sentinel.conf redis.conf对应的文件内容都会发生变化

redis持久化

rdb

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置

save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存

RDB 的优缺点
优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
3 rdb在关闭redis时会保存一会文件。

缺点:
1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。
所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。

aof 

1 redis 默认关闭,开启需要手动把no改为yes
appendonly yes
2 指定本地数据库文件名,默认值为 appendonly.aof
appendfilename “appendonly.aof”
3 指定更新日志条件
在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。

AOF 的优缺点
优点:数据的完整性和一致性更高
缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。

redis事务

public void setString(String key, Object object) {
		stringRedisTemplate.setEnableTransactionSupport(true);
		// 开启事务
		stringRedisTemplate.multi();
		try {
			// 如果是String 类型
			String value = (String) object;
			stringRedisTemplate.opsForValue().set(key, value);
		} catch (Exception e) {
			// 回滚
			stringRedisTemplate.discard();
		} finally {
			// 提交
			stringRedisTemplate.exec();
		}
	}

redis集群

redis集群原理

搭建redis集群

  1. 创建目录

我们计划集群中 Redis 节点的端口号为 9001-9006 ,端口号即集群下各实例文件夹。数据存放在 端口号/data 文件夹中。

mkdir /usr/local/redis-cluster
cd redis-cluster/
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
  1. 复制脚本
    在 /usr/local/redis-cluster 下创建 bin 文件夹,用来存放集群运行脚本,并把安装好的 Redis 的 src 路径下的运行脚本拷贝过来。看命令:
    安装的redis目录/usr/local/redis
mkdir redis-cluster/bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin
  1. 复制一个新 Redis 实例
    我们现在从已安装好的 Redis 中复制一个新的实例到 9001 文件夹,并修改 redis.conf 配置
cp -r /usr/local/redis   /usr/local/redis-cluster/9001

注意,修改 redis.conf 配置和单点唯一区别是下图部分,其余还是常规的这几项:

   port 9001(每个节点的端口号)
   daemonize yes
   bind 192.168.119.131(绑定当前机器 IP)
   dir /usr/local/redis-cluster/9001/data/(数据文件存放位置)
   pidfile /var/run/redis_9001.pid(pid 9001和port要对应)
   cluster-enabled yes(启动集群模式)
   cluster-config-file nodes-9001.conf(9001和port要对应)
   cluster-node-timeout 15000
   appendonly yes
  1. 再复制出五个新 Redis 实例

我们已经完成了一个节点了,其实接下来就是机械化的再完成另外五个节点,其实可以这么做:把 9001 实例 复制到另外五个文件夹中,唯一要修改的就是 redis.conf 中的所有和端口的相关的信息即可,其实就那么四个位置。

    \cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9002
    \cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9003
    \cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9004
    \cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9005
    \cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9006

\cp -rf 命令是不使用别名来复制,因为 cp 其实是别名 cp -i,操作时会有交互式确认

  1. 修改 9002-9006 的 redis.conf 文件
    其实非常简单了,你通过搜索会发现其实只有四个点需要修改,我们全局替换下吧,进入相应的节点文件夹,做替换就好了。命令非常简单
vi /usr/local/redis-cluster/9002/redis/etc/redis.conf
vi /usr/local/redis-cluster/9003/redis/etc/redis.conf
vi /usr/local/redis-cluster/9004/redis/etc/redis.conf
vi /usr/local/redis-cluster/9005/redis/etc/redis.conf
vi /usr/local/redis-cluster/9006/redis/etc/redis.conf
:%s/9001/9002
:%s/9001/9003
:%s/9001/9004
:%s/9001/9005
:%s/9001/9006

其实我们也就是替换了下面这四行:

port 9002
dir /usr/local/redis-cluster/9002/data/
cluster-config-file nodes-9002.conf
pidfile /var/run/redis_9002.pid

分别启动
./bin/redis-server ./9001/redis/etc/redis.conf
./bin/redis-server ./9002/redis/etc/redis.conf
./bin/redis-server ./9003/redis/etc/redis.conf
./bin/redis-server ./9004/redis/etc/redis.conf
./bin/redis-server ./9005/redis/etc/redis.conf
./bin/redis-server ./9006/redis/etc/redis.conf

  1. 安装集群所需软件

由于 Redis 集群需要使用 ruby 命令,所以我们需要安装 ruby 和相关接口。
yum install ruby
yum install rubygems
gem install redis (这步有可能出错)可以手工上传安装 软件地址https://pan.baidu.com/s/1R0fqmAnTnZEyRIMh7debUA
进入到上传目录执行gem install -l redis-3.2.1.gem
在这里插入图片描述

  1. 启动集群
    /usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.212.150:9001 192.168.212.150:9002 192.168.212.150:9003 192.168.212.150:9004 192.168.212.150:9005 192.168.212.150:9006
    在这里插入图片描述
    通过命令,可以详细的看出集群信息和各个节点状态,主从信息以及连接数、槽信息等。这么看到,我们已经真的把 Redis 集群搭建部署成功啦!

设置一个 mafly:
你会发现,当我们 set name “123” 时,出现了 Redirected to slot 信息并自动连接到了9002节点。

在这里插入图片描述

redis相关问题

1、主从架构的核心原理

当启动一个slave node的时候,它会发送一个PSYNC命令给master node

如果这是slave node重新连接master node,那么master node仅仅会复制给slave部分缺少的数据; 否则如果是slave node第一次连接master node,那么会触发一次full resynchronization

开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。

slave node如果跟master node有网络故障,断开了连接,会自动重连。master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。

2、主从复制的断点续传

从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份

master node会在内存中常见一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制

但是如果没有找到对应的offset,那么就会执行一次resynchronization

3、无磁盘化复制

master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了

repl-diskless-sync
repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多slave重新连接过来

4、过期key处理

slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。

redis相关软件

  1. redis客户端工具 https://pan.baidu.com/s/1CL7A2aUf6a1vZ0BDTtUk1w

猜你喜欢

转载自blog.csdn.net/qianxiaopeng/article/details/84942625