全量同步: 发生在从节点初始化阶段, 将主节点的所有数据做成快照(RDB)文件, 发送给从节点过程; *当数据量较大时, 会对主从节点和网络带宽造成很大的开销
增量同步: Redis的增量同步是指从节点完成初始化后开始正常工作时, 主节点将新产生的写操作命令同步到从节点, 然后在从节点执行的过程
Redis单台服务默认是主节点, 通过命令方式或配置方式, 可以指向其它节点(被指向的节点可以是主也可以是从), 同时当前节点会变成从节点; 主节点可以有多个从节点, 但从节点只能有一个主节点; 数据的复制是单向的, 只能主节点到从节点
# 外部网络是否可以连接服务 yes启用(默认)/ no
protected-mode yes
# Redis服务端口
port 6379
# 是否守护进程运行 yes/ no(默认)
daemonize no
# 是否通过 supervised管理守护进程 no不使用(默认)/ upstart/ systemd/ auto
supervised no
# Redis进程编号存储文件& path
pidfile "/var/run/redis_6379.pid"
# RDB持久化文件名
dbfilename "dump_6379.rdb"
# 数据库存入目录
dir "/Users/quanchunlin/Desktop/redis-6.0.5/conf"
# 配置形式指向节点与命令行的 slaveof相同的效果
replicaof
# 设置主节点的密码
masterauth
# 当前节点为从节点时, 将会无法执行写操作命令 yes(默认)/ no
replica-read-only yes
# 主从同步策略: disk与 socket(diskless/无磁盘方式 此方式还处于实验阶段). yes/ no不启用(默认)
repl-diskless-sync no
# 从节点指定往主节点发送 Ping的时间间隔. 10秒(默认)
# repl-ping-replica-period 10
# 同步的超时时间
# repl-timeout 60
# 是否启用 TCP_NODELAY, no不开启(默认)/yes. 如果开启则会使用少量的 TCP包进行数据传输到从节点, 速度会比较慢; 如不开启传输速度会比较快, 但会占用较多的带宽
repl-disable-tcp-nodelay no
# 设置缓冲区大小, 在从节点失连时主节点存放要同步到从节点的数据, 设置的越大, 从节点可以失连的时间就越长
# repl-backlog-size 1mb
# 如果一段时间内没有从节点连接主节点, 则会释放缓冲区. 设置0则表示永不释放缓冲区
# repl-backlog-ttl 3600
# 当主节点无法工作时哨兵(Sentinel)通过这个值来决定将哪个从(Slave)优先提升为主节点, 值越小表示越优先提升, 但设置为0表示, 此节点将永远不能被提升为主节点. 100(默认)
replica-priority 100
# 当 Master少于3个, 延时小于等于10秒的已连接 Slave, 就可以停止接收写操作
# 1. 至少需要3个 Slave的状态为 oneline
# 2. 延时是以秒为单位, 且必须小于等于指定值, 是从最后一个 Slave接收到的 ping(通常每秒发送)开始计数
# min-replicas-to-write 3
# min-replicas-max-lag 10
# 当前服务节点密码
# requirepass foobared
# 命令重命名: 用于危险命令改变名字. 注: 该命令记录到 AOF文件后被传送到从服务器可能产生问题
# rename-command CONFIG ""
# yes开启/ no关闭(默认)
appendonly no
# AOF文件名 (default: "appendonly.aof")
appendfilename "appendonly_6379.aof"
# Lua脚本的最大执行时间, 毫秒为单位
lua-time-limit 5000
# 记录超过多少微秒的查询命令. 查询的执行时间不包括客户端的 I/O执行和网络通信时间, 只是查询命令执行时间
# 1000000等于1秒, 设置为0则记录所有命令
slowlog-log-slower-than 10000
# 记录大小,可通过SLOWLOG RESET命令重置
slowlog-max-len 128
# 主节点 redis_6379.conf
port 6379
dbfilename dump_6379.rdb
# 从节点 redis_6380.conf
port 6380
dbfilename dump_6380.rdb
replicaof 127.0.0.1 6379 # 可以启动后手动在 redis-cli, 通过 slaveof命令指向主节点
# 从节点 redis_6381.conf
port 6381
dbfilename dump_6381.rdb
replicaof 127.0.0.1 6379 # 可以启动后手动在 redis-cli, 通过 slaveof命令指向主节点
# 外部网络是否可以连接服务 yes启用/ no(默认)
protected-mode no
# Redis Sentinel服务端口
port 26379
# 是否守护进程运行 yes/ no(默认)
daemonize no
# Redis Sentinel进程编号存储文件& path
pidfile "/var/run/redis-sentinel-26379.pid"
# 日志文件
logfile "/var/log/sentinel-26379.log"
# 工作目录
dir "/Users/quanchunlin/Desktop/redis-6.0.5/conf"
# 设置标识集群名称可以自定义, 设置连接主从节点时的密码; 注: Sentinel无法为主从分别设置密码, 所以需将密码都设置一样的
# sentinel auth-pass
# 监听地址为 的主节点, 数是有多少个 Sentinel同意当前主节点失效时, 才会被当前 Sentinel集群认为是客观下线
sentinel monitor
# 当主备切换时, 某台从节点晋升为新的主节点时, 同时其它从节点被重新指向新的主节点做主从同步, 值越小同步完成时间越长, 但如果值设的过大, 可能会导致主节点阻塞
# sentinel parallel-syncs
# Specifies the failover timeout in milliseconds. It is used in many ways:
#
# - The time needed to re-start a failover after a previous failover was
# already tried against the same master by a given Sentinel, is two
# times the failover timeout.
#
# - The time needed for a replica replicating to a wrong master according
# to a Sentinel current configuration, to be forced to replicate
# with the right master, is exactly the failover timeout (counting since
# the moment a Sentinel detected the misconfiguration).
#
# - The time needed to cancel a failover that is already in progress but
# did not produced any configuration change (SLAVEOF NO ONE yet not
# acknowledged by the promoted replica).
#
# - The maximum time a failover in progress waits for all the replicas to be
# reconfigured as replicas of the new master. However even after this time
# the replicas will be reconfigured by the Sentinels anyway, but not with
# the exact parallel-syncs progression as specified.
# sentinel failover-timeout
# 心跳反应需要超过多少失效时间, Sentinel才将一个主节点主观的地判定是不可用的. 30000毫秒(默认)
sentinel down-after-milliseconds
# 通知脚本: 当有警告级别的事件发生时(比如说 Redis实例的主观失效和客观失效等)将会调用此脚本, 一般用于发送邮件或 SMS等方式通知系统管理员. 调用该脚本时, 将传给脚本两个参数, 一个是事件的类型, 一个是事件的描述
# sentinel notification-script
# 当主备切换时, 将会自动调用此脚本. 调用该脚本时, 将传给脚本以下参数
# sentinel client-reconfig-script
# sentinel-26379.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 10000
# sentinel-26380.conf
port 26380
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 20000
# sentinel-26381.conf
port 26381
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
# 使用的数据库索引编号
spring.redis.database=0
# 连接池最大连接数(-1表示不限制), 默认为8
spring.redis.lettuce.pool.max-active=1000
# 连接池最大阻塞等待时间(-1表示不限制, 单位毫秒ms), 默认为-1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接, 默认为8
spring.redis.lettuce.pool.max-idle=200
# 连接池中的最小空闲连接, 默认为0
spring.redis.lettuce.pool.min-idle=100
# 关闭连接前等待任务处理完成的最长时间, 默认为100ms
spring.redis.lettuce.shutdown-timeout=100ms
# 哨兵设定的主节点名称
spring.redis.sentinel.master=mymaster
# 哨兵节点, 多节点按(,)号分割
spring.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
final RedisTemplate template = new RedisTemplate<>();
template.setConnectionFactory(factory);
/** 将默认 Jdk序列化替换成 StringRedisSerializer*/
final StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
/** 将默认 Jdk序列化替换成 Jackson2JsonRedisSerialize*/
final Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
final ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
@Component
public class RedisUtil {
@Autowired
private RedisTemplate redisTemplate;
/** 设置过期时间(秒)*/
public boolean expire(String key, long time) {
if (time > 0) {
return redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
}
/** 获取过期时间(秒)
* @return 返回0表示永久有效
* */
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/** 判断 key是否存在*/
public boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
/** 删除缓存*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
/**
* String(字符串)
* */
/** 获取指定缓存*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/** 设置缓存*/
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
/** 设置缓存, 附加过期时间(秒)*/
public void set(String key, Object value, long time) {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
}
/**
* Hash(哈希)
* */
/** 获取 hash里面指定字段的值*/
public Object hmget(String key, String field) {
return redisTemplate.opsForHash().get(key, field);
}
/** 从 hash中读取全部的域和值*/
public Map
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!