一.Redis简介
1.NoSQL简介
目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库时都是I/O操作,I/O操作是主要影响程序执行性能原因之一,连接数据库关闭数据库都是消耗性能的过程。尽量减少对数据库的操作,能够明显的提升程序运行效率。
针对上面的问题,市场上就出现了各种NoSQL(Not Only SQL,不仅仅可以使用关系型数据库)数据库,它们的宣传口号:不是什么样的场景都必须使用关系型数据库,一些特定的场景使用NoSQL数据库更好。
常见NoSQL数据库:
memcached :键值对,内存型数据库,所有数据都在内存中。
Redis:和Memcached类似,还具备持久化能力。
HBase:以列作为存储。
MongoDB:以Document做存储。
2.Redis简介
Redis是以Key-Value形式进行存储的NoSQL数据库。
Redis是使用C语言进行编写的。
平时操作的数据都在内存中,效率特高,读的效率110000/s,写81000/s,所以多把Redis当做缓存工具使用。
Redis以solt(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。
3.Redis持久化策略
Redis不仅仅是一个内存型数据库,还具备持久化能力。
1. RDB
rdb模式是默认模式,可以在指定的时间间隔内生成数据快照(snapshot),默认保存到dump.rdb文件中。当redis重启后会自动加载dump.rdb文件中内容到内存中。
用户可以使用SAVE(同步)或BGSAVE(异步)手动保存数据。
可以设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令,可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。
例如:
save 900 1
save 300 10
save 60 10000
那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行
服务器在900秒之内,对数据库进行了至少1次修改
服务器在300秒之内,对数据库进行了至少10次修改
服务器在60秒之内,对数据库进行了至少10000次修改
1.1 优点
rdb文件是一个紧凑文件,直接使用rdb文件就可以还原数据。
数据保存会由一个子进程进行保存,不影响父进程。
恢复数据的效率要高于aof
1.2 缺点
每次保存点之间导致redis不可意料的关闭,可能会丢失数据。
由于每次保存数据都需要fork()子进程,在数据量比较大时可能会比较耗费性能。
2.AOF
AOF默认是关闭的,需要在配置文件中开启AOF。Redis支持AOF和RDB同时生效,如果同时存在,AOF优先级高于RDB(Redis重新启动时会使用AOF进行数据恢复)
监听执行的命令,如果发现执行了修改数据的操作,同时直接同步到数据库文件中。
2.1 优点
相对RDB数据更加安全。
2.2 缺点
相同数据集AOF要大于RDB。
相对RDB可能会慢一些。
2.3 开启办法
修改redis.conf中
# 默认no
appendonly yes
# aof文件名
appendfilename "appendonly.aof"
二. Redis单机版安装
1.安装依赖C语言依赖
redis使用C语言编写,所以需要安装C语言库
yum install -y gcc-c++ automake autoconf libtool make tcl
2.上传并解压
把redis-5.0.5.tar.gz上传到/usr/local/tmp中
# cd /usr/local/tmp
解压
# tar zxf redis-5.0.5.tar.gz
3.编译并安装
进入解压文件夹
# cd /usr/local/tmp/redis-5.0.5/
编译
# make
安装
# make install PREFIX=/usr/local/redis
4.开启守护进程
复制cd /usr/local/tmp/redis-5.0.5/中redis.conf配置文件
# cp redis.conf /usr/local/redis/bin/
修改配置文件
# cd /usr/local/redis/bin/
修改
# vim redis.conf
把daemonize的值由no修改为yes
5.修改外部访问
在redis5中需要修改配置文件redis.conf允许外部访问。需要修改两处。
注释掉bind 127.0.0.1
#bind 127.0.0.1
受保护模式,改成no : protected-mode yes 改成 no
protected-mode yes
6.启动并测试
启动redis
# ./redis-server redis.conf
关闭redis命令
# ./redis-cli shutdown
启动客户端工具
#./redis-cli
在redis5中客户端工具对命令会有提供功能。
三. Redis主从复制
Redis支持集群功能。为了保证单一节点可用性,redis支持主从复制功能。每个节点有N个复制品(replica),其中一个复制品是主(master),另外N-1个复制品是从(Slave),也就是说Redis支持一主多从。
一个主可有多个从,而一个从又可以看成主,它还可以有多个从。
1. 主从优点
增加单一节点的健壮性,从而提升整个集群的稳定性。(Redis中当超过1/2节点不可用时,整个集群不可用)
从节点可以对主节点数据备份,提升容灾能力。
读写分离。在redis主从中,主节点一般用作写(具备读的能力),从节点只能读,利用这个特性实现读写分离,写用主,读用从。
1.1 一主多从搭建
在已经搭建的单机版redis基础上进行操作。
并且关闭redis单机版
./redis-cli shutdown
1.2 新建目录
# mkdir /usr/local/replica
1.3 复制目录
把之前安装的redis单机版中bin目录复制三份,分别叫做:master、slave1、slave2
cp -r /usr/local/redis/bin /usr/local/replica/master
cp -r /usr/local/redis/bin /usr/local/replica/slave1
cp -r /usr/local/redis/bin /usr/local/replica/slave2
1.4 修改slave1从的配置文件
修改2个从的redis.conf,指定主节点ip和端口。并修改自身端口号防止和其他redis冲突。
vim /usr/local/replica/slave1/redis.conf
指定主节点ip和端口
replicaof 192.168.93.10 6379
修改自己端口
port 6380
1.5.修改slave2从的配置文件
vim /usr/local/replica/slave2/redis.conf
指定主节点ip和端口
replicaof 192.168.93.10 6379
修改自己端口
port 6381
1.6 启动三个redis实例
注意:一定要关闭单机的redis,否则端口冲突。
进入到指定目录
cd /usr/local/replica
创建文件
vim startup.sh
内容如下
cd /usr/local/replica/master/
./redis-server redis.conf
cd /usr/local/replica/slave1
./redis-server redis.conf
cd /usr/local/replica/slave2
./redis-server redis.conf
赋予权限
chmod a+x startup.sh
开启
./startup.sh
1.7 查看启动状态
# ps aux|grep redis
1.8查看主节点信息
如下图有两个从节点,分别为6380、6381
1.9 测试
进入到指定目录
# cd /usr/local/replica/master/
进入到redsi
./redis-cli -p 6379
在客户端命令行模式下,添加一条数据:
set testname testvalue
进去slave查看数据是否同步。
# cd /usr/local/replica/slave1
# ./redis-cli -p 6380
四. 哨兵(Sentinel)
在redis主从默认是只有主具备写的能力,而从只能读。如果主宕机,整个节点不具备写能力。但是如果这是让一个从变成主,整个节点就可以继续工作。即使之前的主恢复过来也当做这个节点的从即可。
Redis的哨兵就是帮助监控整个节点的,当节点主宕机等情况下,帮助重新选取主。
Redis中哨兵支持单哨兵和多哨兵。单哨兵是只要这个哨兵发现master宕机了,就直接选取另一个master。而多哨兵是根据我们设定,达到一定数量哨兵认为master宕机后才会进行重新选取主。我们以多哨兵演示。
1. 没有哨兵下主从效果
只要杀掉主,整个节点无法在写数据,从身份不会变化,主的信息还是以前的信息。
2.搭建多哨兵
前提:安装了单机的redis
2.1 新建目录
# mkdir /usr/local/sentinel
2.2 复制redis
# cp -r /usr/local/redis/bin/* /usr/local/sentinel
2.3 复制配置文件
从redis解压目录中复制sentinel配置文件
# cd /usr/local/tmp/redis-5.0.5/
复制
# cp sentinel.conf /usr/local/sentinel/
2.4 修改配置文件
cp sentinel.conf sentinel-26380.conf
2、修改
# vim sentinel-26379.conf
3、修改端口
port 26379
4、修改守护进程
daemonize yes
5、修改日志文件
logfile “/usr/local/sentinel/26379.log”
6、指定主节点地址
sentinel monitor mymaster 192.168.93.10 6379 2
复制sentinel.conf,命名为sentinel-26380.conf
cp sentinel.conf sentinel-26380.conf
2、修改
# vim sentinel-26380.conf
3、修改端口
port 26380
4、修改守护进程
daemonize yes
5、修改日志文件
logfile “/usr/local/sentinel/26380.log”
6、指定主节点地址
sentinel monitor mymaster 192.168.93.10 6379 2
复制sentinel.conf,命名为sentinel-26381.conf
cp sentinel.conf sentinel-26381.conf
2、修改
# vim sentinel-26381.conf
3、修改端口
port 26381
4、修改守护进程
daemonize yes
5、修改日志文件
logfile “/usr/local/sentinel/26381.log”
6、指定主节点地址
sentinel monitor mymaster 192.168.93.10 6379 2
2.5 启动主从
如果已经启动状态,忽略下面命令。如果启动部分,全部kill后重新启动。
使用kill杀死全部redis
# ps aux|grep redis
# kill -9 进程号
启动redis主从
# cd /usr/local/replica
# ./startup.sh
2.6 启动三个哨兵
进入到指定目录
cd /usr/local/sentinel
新建文件
vim startup.sh
内容如下:
- List item
cd /usr/local/sentinel
./redis-sentinel sentinel.conf
cd /usr/local/sentinel
./redis-sentinel sentinel-26380.conf
cd /usr/local/sentinel
./redis-sentinel sentinel-26381.conf
赋予权限
# chmod a+x startup.sh
开启
./startup.sh
2.7 查看日志
cat 26379.log
此时6381变为了主节点,具备读写能力
2.8查看启动状态
ps aux|grep redis
2.9 查看主节点是否配置成功
进入到master目录
cd /usr/local/replica/master
执行命令:
./redis-cli
查看信息:
info replication
2.10 查看从节点
cd /usr/local/replica/slave1
进入6380redis
./redis-cli -p 6380
//查看信息
info replication
2.11 测试宕机
查看redis进程号
ps aux|grep redis
杀死主进程号
kill -9 进程号
查看日志,短暂延迟后会发现,出现新的主。
cat 26379.log
进入到从节点
/usr/local/replica/slave2
进入到内部
./redis-cli -p 6381
查看信息
info replication
可以看到此时6381的从节点变为了主节点,且还有个从节点为6380
进行操作,6380也会同步数据:
2.12 重启master后,会变成从节点
cd /usr/local/replica/master
重启
./redis-server redis.conf
查看主节点信息情况
哨兵完成
五. 集群(Cluster)
前提:已经安装好redis单机版。
当集群中超过或等于1/2节点不可用时,整个集群不可用。为了搭建稳定集群,都采用奇数节点。
1 .复制redis配置文件
从/usr/local/redis/bin下把redis.conf复制到当前目录中,命名为redis-7001.conf
cp /usr/local/redis/bin/redis.conf /usr/local/redis/bin/redis-7001.conf
2. 修改redis-7001.conf
cd /usr/local/redis/bin
修改命令
vim redis-7001.conf
需要修改如下
1、修改端口 7001-7006
port 7001
2、开启集群
cluster-enabled yes
3、配置集群文件
cluster-config-file nodes-7001.conf
4、连接超时
cluster-node-timeout 15000
# appendonly yes 如果开启aof默认,需要修改为yes。如果使用rdb,此处不需要修改
daemonize yes
protected-mode no
5、修改线程的pid
pidfile /var/run/redis_7001.pid
3 .复制配置文件,并修改内容
把redis-7001.conf 复制5份,分别叫做redis-7002.conf、redis-7003.conf、redis-7004.conf、redis-7005.conf、redis-7006.conf
# cp redis-7001.conf redis-7002.conf
# cp redis-7001.conf redis-7003.conf
# cp redis-7001.conf redis-7004.conf
# cp redis-7001.conf redis-7005.conf
# cp redis-7001.conf redis-7006.conf
新复制的5个配置文件都需要需改三处。
例如nodes-7002.conf中需要把所有7001都换成7002。
改如下三个地方:
1、修改端口
port 7002
2、修改配置
cluster-config-file nodes-7002.conf
3、修改线程的pid
pidfile /var/run/redis_7002.pid
4 .启动6个redis
可以使用redis-server结合6个配置文件进行启动6个实例。
执行之前一定要先删除dump.rdb,不然集成的发布有有影响。
删除
# rm -f dump.rdb
创建文件命令
# vim startup.sh
创建脚本启动
./redis-server redis-7001.conf
./redis-server redis-7002.conf
./redis-server redis-7003.conf
./redis-server redis-7004.conf
./redis-server redis-7005.conf
./redis-server redis-7006.conf
赋予权限
# chmod a+x startup.sh
启动
# ./startup.sh
5. 查看启动状态
ps aux|grep redis
6. 建立集群
在redis3的时候需要借助ruby脚本实现集群。在redis5中可以使用自带的redis-cli实现集群功能,比redis3的时候更加方便了。
建议配置静态ip,ip改变集群失效
./redis-cli --cluster create 192.168.93.10:7001 192.168.93.10:7002 192.168.93.10:7003 192.168.93.10:7004 192.168.93.10:7005 192.168.93.10:7006 --cluster-replicas 1
是否三主三从:yes
如果出现一直等待, 遇到这种情况大部分是因为集群总线的端口没有开放 ,
例如:redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379用于集群总线
建立成功
7. 测试
集群测试时,千万不要忘记最后一个-c参数。
# ./redis-cli -p 7001 -c
# set age 18
7001写数据自动跳到7002去了,证明集群搭建成功。
为何数据到7002了?
因为Redis集群是根据key做crc16运算,然后对16384做取余操作,确认hash槽的,而这个槽可能是其他节点管理的,就自然去其他节点查询了
8 .编写关闭脚本
# vim stop.sh
# chmod a+x stop.sh
./redis-cli -p 7001 shutdown
./redis-cli -p 7002 shutdown
./redis-cli -p 7003 shutdown
./redis-cli -p 7004 shutdown
./redis-cli -p 7005 shutdown
./redis-cli -p 7006 shutdown
六. 使用SpringBoot整合SpringDataRedis操作redis
Spring Data是Spring公司的顶级项目,里面包含了N多个二级子项目,这些子项目都是相对独立的项目。每个子项目是对不同API的封装。
所有Spring Boot整合Spring Data xxxx的启动器都叫做spring-boot-starter-data-xxxx
Spring Data 好处很方便操作对象类型。
把Redis不同值得类型放到一个opsForXXX方法中。
opsForValue : String值
opsForList : 列表List
opsForHash: 哈希表Hash
opsForZSet: 有序集合Sorted Set
opsForSet : 集合
1. 添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
2. 配置配置文件
spring.redis.host=localhost 默认值
spring.redis.port=6379 端口号默认值
spring:
redis:
database: 0
password:
timeout: 10s
cluster:
nodes: 192.168.93.10:7001,192.168.93.10:7002,192.168.93.10:7003,192.168.93.10:7004,192.168.93.10:7005,192.168.93.10:7006
3.编写配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
return redisTemplate;
}
}
4. 编写代码
编写对象新增
@RestController
public class RedisController {
@Resource
private RedisTemplate<String, Object> redisTemplate;
@PostMapping("set")
public void set(@RequestParam String v) {
redisTemplate.opsForValue().set("name", v);
}
@GetMapping("get")
public Object get(String k) {
return redisTemplate.opsForValue().get(k);
}
}
key为name的新增到7002了
七. 使用Redis效果
使用缓存流程
1. 先判断缓存中是否存在。如果存在直接从缓存中取出数据。不执行2,3步骤
2. 如果不存在,从mysql中获取数据
3. 获取数据后,把数据缓存到redis中
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传