Redis配置解析
Redis配置密码
临时密码, 仅对下一次进入数据库有效
通过指令设置的密码是临时密码
永久密码
在配置文件中添加密码是永久密码, 之后的操作都需要先输入密码
在配置1036行添加密码
maxmemory-policy策略
内存优化策略
- lru算法
- LRU的全称为Least Recently Used,翻译出来就是最近最少使用的意思。它是一种内存淘汰算法,当内存不够时,将内存中最久没使用的数据清理掉。LRU算法常用于缓存的淘汰策略
- lfu算法
- 算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”
事务锁机制
事务控制
事务控制命令
命令 | 功能 |
---|---|
multi | 开始组队 |
exec | 执行队列中的命令 |
discard | 取消组队 |
在编译时的错误无法提交 |
出现运行时错误就可以提交数据
悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。
监听和取消监视
在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务**执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。**
Redis Lua脚本
什么是Lua脚本
Lua 是一个小巧的[脚本语言](http://baike.baidu.com/item/脚本语言),Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,Lua并没有提供强大的库,一个完整的Lua解释器不过200k,所以Lua不适合作为开发独立应用程序的语言,而是作为嵌入式脚本语言。很多应用程序、游戏使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽争霸地图、魔兽世界、博德之门、愤怒的小鸟等众多游戏插件或外挂。
SpringBoot 整合Lua
导入jar包
在redis jar包基础上加入redis jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
创建lua脚本
创建文件
代码:
local current = redis.call('GET', KEYS[1])
if current == ARGV[1]
then redis.call('SET', KEYS[1], ARGV[2])
return true
end
return false
创建配置类
创建类
代码:
注意要修改脚本文件路径
@Bean
public RedisScript<Boolean> checkAndSet() {
Resource scriptSource = new ClassPathResource("Lua.lua");
return RedisScript.of(scriptSource, Boolean.class);
}
修改配置文件
spring:
data:
redis:
host: 192.168.126.130
port: 6379
#springboot????lettuce
#spring.data.redis.client-type=lettuce
测试方法
package atguigu.redis_lua;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import java.util.Collections;
import java.util.List;
@SpringBootTest
class RedisLuaApplicationTests {
@Autowired
private RedisScript<Boolean> script;
@Autowired
private RedisTemplate<String,String> redisTemplate;
@Test
public void test() {
boolean flag = checkAndSet("hello","helloworld");
System.out.println(flag ? "修改成功" : "修改失败");
// 手工添加一个值,再试试
redisTemplate.opsForValue().set("key", "hello");
boolean flag1 = checkAndSet("world","hello");
System.out.println(flag1 ? "修改成功" : "修改失败");
}
private boolean checkAndSet(String value1,String value2) {
List<String> keyList = Collections.singletonList("key");
return redisTemplate.execute(script, keyList, value1,value2);
}
}
运行语法解析
完整代码
持久化介绍
持久化介绍
我们知道Redis是一个内存型数据库,内存的特性是掉电或者程序退出则不保存数据,但是经过实测我们发现,Redis重启服务后,之前存储的数据仍然在,那么这就是通过持久化的方式实现的.
RDB持久化
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里.
RDB持久化分为两种:
- save命令, 同步操作
- basave异步操作
执行流程
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
Fork子进程
- Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
- 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术”
- 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
RDB配置
-
在redis.conf中配置文件名称,默认为dump.rdb
-
rdb文件的保存路径,也可以修改。默认为Redis启动时命令行所在的目录下.
../
就代表在当前目录下 -
执行快照政策策略
36000 1 表示360秒执行一次操作的话, 会保存一次 -
手动快照执行命令
- save :使用主进行进行持久化指令,save时只管保存,其它不管,全部阻塞。手动保存。不建议。
- bgsave:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。
可以通过lastsave 命令获取最后一次成功执行快照的时间 - 执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义
- shutdown命令在关系服务的时候也会进行自动的持久化
AOF策略
AOF简介
Append Only File 以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
AOF配置
- AOF文件名配置
- 可以在redis.conf中配置文件名称,默认为 appendonly.aof
- AOF文件位置路径
- Redis6中,AOF文件的保存路径,同RDB的路径一致。
-
- edis7有变化:base:基本文件 incr:增量文件 manifest:清单文件
主从复制具体操作
实现思路
-
1 一个redis服务作为主机,主要负责写操作
-
2 两个redis服务作为从机,主要负责读操作
-
3 从机自动从主机同步数据下来
-
4 从机主动找主机,而主机不会找从机
-
5 正常来说主机和从机应该在不同的IP上开启redis服务,我们为了快速模拟,可以在一台机器上模拟出三个redis服务即可
在一台机子上启动多个redis服务
- 使用redis-server启动服务时,要以来redis.conf配置文件.那么我们可以准备三个redis.conf文件,用来配置三个不同的服务,启动三次分别以来三个不同的服务即可
新建三个redis配置文件
- 关闭aof功能
- 新建6379.conf
include /root/myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
- 含义介绍
include /root/myredis/redis.conf # 引入共同的配置
pidfile /var/run/redis_6379.pid # 使用独立的进程文件
port 6379 # 设置当前服务的端口号
dbfilename dump6379.rdb # 使用独立的RDB持久化文件 暂时不适用AOP持久化
- 新建redis6380.conf
- 新建redis6380.conf
启动三个服务
使用info replication查看主从相关信息
配置主从机器
在需要配置的从机中输入命令
slaveof 192.168.126.130 6379
主从复制原理
- Slave启动成功连接到master后会发送一个sync命令
- Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
- 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
Redis集群操作
什么是集群
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability ):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
集群的搭建
搭建前准备
- 之前操作产生的rdb和aof文件删除
- appendonly 修改回 no
- 清空主从复制和哨兵模式留下的一些文件
- 开启daemonize yes
- protected-mode no
- 注释掉bind
制作六个实例的配置文件
内容:
include /root/myredis/redis.conf
port 6379
pidfile "/var/run/redis_6379.pid"
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
内容解释:
include /root/myredis/redis.conf #引用公共的配置文件
port 6379 # 设置端口号
pidfile "/var/run/redis_6379.pid" # 设置pid进程文件
dbfilename "dump6379.rdb" # 设置rdb持久化问价名
cluster-enabled yes # 开启集群
cluster-config-file nodes-6379.conf # 设置集群使用的结点文件名
cluster-node-timeout 15000 # 设置结点失联时间
使用脚本运行配置
- 启动脚本start.sh
#!/bin/sh
redis-server 6379.conf &
redis-server 6380.conf &
redis-server 6381.conf &
redis-server 6389.conf &
redis-server 6390.conf &
redis-server 6391.conf &
- 关闭脚本
#!/bin/sh
redis-cli -p 6379 shutdown &
redis-cli -p 6380 shutdown &
redis-cli -p 6381 shutdown &
redis-cli -p 6389 shutdown &
redis-cli -p 6390 shutdown &
redis-cli -p 6391 shutdown &
执行脚本
sh start.sh
运行指令
redis-cli --cluster create --cluster-replicas 1 192.168.126.130:6379 192.168.126.130:6380 192.168.126.130:6381 192.168.126.130:6389 192.168.126.130:6390 192.168.126.130:6391
登录方式
redis -c -p 端口号