# 下载Redis wget https://download.redis.io/releases/redis-6.0.9.tar.gz # 解压 redis tar -zxvf redis-6.0.9.tar.gz # 安装 gcc 环境, 安装过 忽略 yum -y install gcc-c++ cd redis-5.0.5 # 安装 make && make install
# 拷贝 utils 目录下的 redis_init_script 到 /etc/init.d 目录下 redis_init_script 是启动脚本 cp utils/redis_init_script /etc/init.d cd /etc/init.d vim /etc/init.d/redis_init_script # ----------------- redis_init_script start --------------- #!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. ### BEGIN INIT INFO # Provides: redis_6379 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Redis data structure server # Description: Redis data structure server. See https://redis.io ### END INIT INFO # redis 默认端口 REDISPORT=6379 # redis 默认启动 redis-server 位置 EXEC=/usr/local/bin/redis-server # redis redis-cli 位置 CLIEXEC=/usr/local/bin/redis-cli # redis pid 位置 拼接了默认端口参数。 PIDFILE=/var/run/redis_${REDISPORT}.pid # redis 默认配置的conf 配置文件 CONF="/usr/local/redis/conf/redis.conf" # $1 参数 为 start 或者 stop case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac # ----------------- redis_init_script end --------------- # 保存之后启动redis ./redis_init_script start # 停止 redis ./redis_init_script stop
# 在以下位置加上一段注释 #!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. ### BEGIN INIT INFO # Provides: redis_6379 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Redis data structure server # Description: Redis data structure server. See https://redis.io ### END INIT INFO #chkconfig: 22345 10 90 #desccription: Start and Stop redis :wq! # 保存 # 注册redis 到开机自启动 chkconfig redis_init_script on
# 设置后台运行 yes 后台运行, no 前台运行 daemonize yes # pidfile pid 目录文件 pidfile /var/run/redis_6379.pid # dir redis 的工作空间。必须写一个目录。不能写一个文件名 dir /usr/local/redis/working # bind 哪些ip地址可以访问 redis-server 0.0.0.0 任何地址都可以访问 bind 0.0.0.0 # requirepass 设置 redis 链接密码 requirepass 584521
<dependency> <goupId>org.springframework.boot</goupId> <artifactId>spring-boot-starter-data-redis</aartifactId> </dependency>
spring: redis: database: 0 # 数据库 host: 127.0.0.1 # redis 地址 port: 6379 # redis 端口 password: 584521 # redis 密码
@ApiIgnore @RestController @RequestMapping("redis") public class RedisController { @Autowired private RedisTemplate redisTemplate; @GetMapping("/set") public Object set(String key, String value) { redisTemplate.opsForValue().set(key, value); return "ok"; } @GetMapping("get") public Object get(String key) { Object value = redisTemplate.opsForValue().get(key); return value; } @GetMapping("delete") public Object delete(String key) { redisTemplate.delete(key); return "ok"; } }
# 打开 redis.conf 文件 vim redis.conf # redis 工作空间 dir /usr/local/redis/working # rdb 持久化文件名 dbfilename dump.rdb # save 保存到硬盘。多少时间内发生了多少次改变 save 900 1 save 300 10 save 60 10000 # stop-writes-on-bgsave-error 保存时,发生错误停止写入操作 stop-writes-on-bgsave-error yes # rdbcompression 压缩 rdb 文件 如果像节省cpu性能开销。 就可以关闭 no rdbcompression yes # rdbchecksum 压缩 rdb 文件以后。 是否要检验 rdb 文件。 会有百分之 10 的性能损耗 rdbchecksum yes
Redis 默认使用的是RDB模式作为持久化操作
关于 AOF 的配置名称
# 选择是否开启 aof appendonly yes # appendfilename 配置 aof 持久化文件的名称 appendfilename "appendonly.aof" # appendfsync aof 文件的同步策略。 always 针对每一次的写操作。 资源占用比较大。, erverysec 每秒同步一次 no 永不同步 appendfsync everysec # no-appendfsync-on-rewrite 重写的时候可以不做同步。 如果是yes 有可能会导致文件内容的不一致性 bi-appendfsync-on-rewrite no # auto-aof-rewrite-percentage 100 aof 文件增长比例,指当前 aof 文件比上次重写的增长比例大小。 aof 重写即在 aof 文件在一定大小之后,重新将整个内存写道 aof 文件当中,以反应最新得状态 这样就避免了文件过大而实际内存数据小的问题。 (频繁修改问题) auto-aof-rewrite-percentage 100 # auto-aof-rewrite-min-size 64mb aof 文件重写最小得文件大小。即最开始 aof 文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了, 根据上一次重写完成之后的大小。 此变量仅仅只有初始化启动 redis 时有效,如果是 redis 恢复时, 则 lastSize 等于初始 aof 文件大小。 auto-aof-rewrite-min-size 64mb # aof-load-truncated 指redis在恢复时,会忽略最后一条可能存在问题的指令。默认值yes。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半),这种情况下,yes会log并继续,而no会直接恢复失败. aof-load-truncated yes
不小心使用了 flushdb , flushall 。 我们可以停止 redis-server, 打开 aof 文件。 将 flushdb flushall 这种命令直接删除。重启 redis 服务
RDB 和 AOF 可以同时使用, 加载顺序,先加载 AOF 再加载 RDB
原来的单个Redis作为一个主 (Master),多个从 (Slave) 。读写分离架构。 主作为写库, 从作为读库,也就是说写操作操作 Mater, 大多数读操作用 Slave 。Slave 会对 Mater 做一个全量复制的数据。
配置 一主二从机制,需要先准备三台Redis 机器 一台主,两台从
# 启动 Redis-cli redis-cli # 查看 Redis 角色信息 info replication # Replication role:master # 当前 redis 角色 connected_slaves:0 # 当前 redis 连接数量 master_replid:9d6bd1e0965ba650aed518034318a11c243c2d8c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
# replicaof <masterip> <masterport> 主库 ip , 主库 端口号 replicaof 192.168.1.191 6379 # masterauth <master-password> 主库 redis 密码 masterauth 584521 # replica-read-only yes 配置从主只能够读 不能写数据 replica-read-only yes # 停止 redis 服务 ./redis_init_script stop # 删除 dump.rdb 和 aof 文件 rm -rf dump.rdb *.aof # 启动 redis 服务 ./redis_init_script start
# replicaof <masterip> <masterport> 主库 ip , 主库 端口号 replicaof 192.168.1.191 6379 # masterauth <master-password> 主库 redis 密码 masterauth 584521 # replica-read-only yes 配置从主只能够读 不能写数据 replica-read-only yes # 停止 redis 服务 ./redis_init_script stop # 删除 dump.rdb 和 aof 文件 rm -rf dump.rdb *.aof # 启动 redis 服务 ./redis_init_script start
全部启动成功之后,通过 info replication
命令查看各个 Redis 的角色状态。
无磁盘化复制
# 当磁盘很慢,但是网络环境又很不错。 那么就可以使用无磁盘化传输 repl-diskless-sync no # 配置 slave 连接上多久后,才开始通过 socket 传输。 repl-diskless-sync-delay 5
主动定时删除
# 每秒钟检查 10 次 hz 10
被动惰性删除
Redis 内存满了怎么办
# maxmemory <byte> 配置redis 一共能占用多少内存 单位 byte maxmemory 2048
LRU(The Least Recently Used,最近最久未使用算法)是一种常见的缓存算法,在很多分布式缓存系统(如Redis, Memcached)中都有广泛使用。
LFU(Least Frequently Used ,最近最少使用算法)也是一种常见的缓存算法。
Redis 提供了以下多种淘汰机制
# volatile-lru -> Evict using approximated LRU among the keys with an expire set. # allkeys-lru -> Evict any key using approximated LRU. # volatile-lfu -> Evict using approximated LFU among the keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU. # volatile-random -> Remove a random key among the ones with an expire set. # allkeys-random -> Remove a random key, any key. # volatile-ttl -> Remove the key with the nearest expire time (minor TTL) # noeviction -> Don't evict anything, just return an error on write operations.
原来一主二从里面, Master 节点一旦宕机。 我们就无法写入数据了。因为主节点宕机。从节点无法写入数据。只可以读取数据。
# 开启保护模式后 绑定 ip 哪个 ip 才能够连接 # bind 127.0.0.1 # yes 开启绑定模式 ,。 no 不开启 protected-mode no # 端口号 port 26379 # daemonize 是否开启后台 daemonize yes # pid 文件位置。 和 redis 不是同一个进程 pidfile /var/run/redis-sentinel.pid # 配置 sentinel 的日志文件 logfile /usr/local/redis/logs/sentinel/redis-sentinel.log # dir sentinel 的工作空间 dir /usr/local/redis/sentinel # sentinel monitor <master-group-name> <ip> <port> <quorum> 配置监听的 master 名称、 以及 ip 地址, 端口号。 sentinel monitor xh-master 192.168.1.191 6379 2 # sentinel auth-pass mymaster MySUPER--secret-0123passw0rd sentinel auth-pass xh-master 584521 # sentinel down-after-milliseconds <master-name> <milliseconds> master 名称。 哨兵认为master 失败的时间段 sentinel down-after-milliseconds xh-master 10000 # sentinel parallel-syncs <master-name> <numslaves> master 名称 以及同时需要同步几个 slave 节点的数据。 sentinel parallel-syncs xh-master 1 # sentinel failover-timeout <master-name> <milliseconds> master 名称。 故障转移超时时间。 sentinel failover-timeout xh-master 180000
scp ./sentinel.conf root@192.168.1.192:/usr/local/redis/ scp ./sentinel.conf root@192.168.1.193:/usr/local/redis/
# 启动时会报一个错误 redis-sentinel # 说 Sentinel 没有指定配置文件 6031:X 08 Nov 21:12:20.727 # Sentinel started without a config file. Exiting... # 指定配置文件启动 redis-sentinel /usr/local/redis/sentinel.conf 安装此方式启动 slave 1 和 slave 2
启动完成后, 当我们手动停止掉 redis-server 服务后。redis 哨兵,会在剩余的两个 slave 节点中。选举出一个 master 节点。
当原来的master 节点重新启动之后, master 并不是master 节点了。已经转变为 slave 节点了。可以通过 info replication
4-4 解决原Master恢复后不同步问题 在本节课中,相信细心的同学会发现原来的Master(191)恢复成Slave后,他的同步状态不OK,状态为 master_link_status:down ,这是为什么呢? 这是因为我们只设置了192和193的 masterauth ,这是用于同步master的数据,但是191一开始是master是不受影响的,当master转变为slave后,由于他没有 auth ,所以他不能从新的master同步数据,随之导致 info replication 的时候,同步状态为 down ,所以只需要修改 redis.conf 中的 masterauth 为 584521 一般master数据无法同步给slave的方案检查为如下: 1. 网络通信问题,要保证互相ping通,内网互通。 2. 关闭防火墙,对应的端口开发(虚拟机中建议永久关闭防火墙,云服务器的话需要保证内网互通)。 3. 统一所有的密码,不要漏了某个节点没有设置。 # 查看xh-master下的master节点信息 sentinel master xh-master # 查看xh-master下的slaves节点信息 sentinel slaves xh-master # 查看xh-master下的哨兵节点信息 sentinel sentinels xh-master
spring: redis: database: 1 password: 584521 sentinel: master: xh-master # 配置 master 的名称 nodes: 192.168.1.191:26379,192.168.1.192:26379,192.168.1.193:26379 # 配置 redis 哨兵的 端口号以及 ip
# 开启 cluster 集群 yes 开启, no 关闭 cluster-enabled yes # cluster-config-file nodes-6379.conf cluster-config-file cluster 节点配置文件 cluster-config-file nodes-6379.conf # cluster-node-timeout 15000 配置 redis-cluster 超时时间 cluster-node-timeout 1500 # 开启 aof 持久化 appendonly yes # 修改万配置文件后。删除 aof 和 rbd 文件 如果不删除可能就会报错 rm -rf *.aof rm -rf *.rdb # 停止 redis /etc/init.d/redis_init_script stop # 启动 redis /etc/init.d/redis_init_script start
# 如果设置密码了记得设置密码 redis-cli -a 584521 --cluster create 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:6379 --cluster-replicas 1
# 上面最后会询问你是否要配置该集群了 Can I set the above configuration? (type 'yes' to accept) : yes
redis-cli -a 584521 --cluster check 192.168.1.201:6379
[OK] All 16384 slots covered
槽 slot 如何存储
hash(key) % 16384
进入到集群的控制台
# 查看集群的信息 redis-cli-c -a 584521 -h 192.168.1.202 -p6379 # 查看节点的信息 cluster nodes
spring: redis: password: 584521 cluster: nodes: 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:6379