本文主要是介绍cenos7 安装redis 与 配置redis 主从复制, 哨兵机制 , aof与rdb存储, 事务 记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
redis: 非关系型数据库, 数据存放内存中, 效率高, 可持久化, 于此类似的还有 mogodb等。
redis 五种基本数据类型: String(可以存储对象), list(集合), set, zset(排序set,java sortedSet), hash( java map)
redis 客户端: https://github.com/caoxinyu/RedisClient
推荐下载exe的, 因为方便, jar包运行的有点烦。 下载后解压,然后打开连接就完事了
redis 官网: https://redis.io/
安装第一种方式:
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
安装第二种方式: 下载后上传liunx
第一步: 解压:
tar xzf redis-5.0.5.tar.gz
第二步: make
cd redis-5.0.5
make
如果: redis make时报: /bin/sh: cc: 未找到命令 , 是由于没有安装gcc,
命令:yum -y install gcc automake autoconf libtool make
或者: yum install gcc-c++
make完毕后:
在redis目录新建一个bin目录: mkdir bin 不建也没关系。
新建bin目录后:
在 redis-5.0.5 目录下, 将 redis.conf复制到 新建的bin目录下 ,cp redis.conf 你的bin目录路径
在 cd src 进入 src目录下, 将 redis-server , redis-cli 复制到bin目录下 ,命令: cp redis-server 你的bin目录路径
复制后:
./redis-server redis.conf 启动redis服务, 加载配置文件启动
./redis-cli -a 你的密码 启动客户端。
redis.conf 配置文件:
首先来设置 redis.conf:
1: 506行 requirepass 这是密码设置
2: 默认的端口不用改
3:136行 daemonize 后台启动 no改为yes
4: 如果这个bind 没有注释掉 则将其注释, 否则 使用 redis client 客户端连接时会连接不上。
现在启动一下访问是否成功: 进入创建的bin目录, 或者 redis.5.0.5 / src 下都行: 这里进入bin目录:
服务端启动: ./redis-server redis.conf
客户端启动: ./redis-cli -a 123456 -a 后跟 密码, 密码为配置文件中设置的
ping 一下, 如果 出现 pong 则成功了。
防火墙关闭 或者开放端口, 本人用的是开放端口, cenos7 默认是 firewall 防火墙。
1: 开放端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
2:关闭防火墙:
关闭: systemctl stop firewalld
禁用: systemctl disable firewalld
3: 加入开机启动:
vim /etc/rc.d/rc.local
加入如下命令, 路径为你的redis目录
./software/redis/bin/redis-server /software/redis/bin/redis.conf
redis启动停止脚本: 放在bin目录下
#!/bin/bash
#chkconfig:- 20 80
#description: starts and stops the redis daemon
#config: /soft/redis/bin/redis.conf
#pidfile: /var/run/redis.pidsource /etc/init.d/functions
BIN="/soft/redis/bin"
REDIS_CONFIG="/soft/redis/bin/redis.conf"
PIDFILE="/var/run/redis.pid"#读取配置[ -r "$SYSCONFIG" ] && source $"SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="redis server"start(){if test $( pgrep -f $prog | wc -l) -gt 0 thenecho "$desc 已经运行..."exit 1fidaemon $BIN/$prog $REDIS_CONFIG &RETVAL=$?echo $"已启动 $desc:" echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog return $RETVAL} stop()
{killproc $progRETVAL=$?echo $"已停止 $desc"echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILEreturn $RETVAL}status()
{if test $( pgrep -f $prog | wc -l) -gt 0 thenecho "$desc 已经运行...."elseecho "$desc 未启动....."fi}restart()
{stopstart}case "$1" instart)start;; stop)stop;;restart)restart;;status)status $progRETVAL=$?;;*)echo $"使用:$0{start|stop|restart|status}"RETVAL=1esac
exit $RETVAL
使用 redis client 连接服务器:
1:输入连接信息: ip: 密码为配置文件中设置的密码
2: 查看数据库0 右边会有在服务器上设置的name的键值。 初步搭建完毕。
主从复制的配置: 两台虚拟机, 主机无需设置, 在从机的 redis.conf中配置
从机: vim redis.conf
将注释打开:
masterip: 主机ip
masterport: 主机端口
masterauth : 主机密码, 如果配置了密码就填密码, 没填就不用写
测试主从复制:
主机开启服务端: ./redis-server redis.conf
主机开启测试端: ./redis-cli -a 密码
输入 info
出现结果如下图所示:
role 角色: master 主机
slave : 备机ip
主机设置值:
备机读取:
备机只能读, 不能写。
配置 sentinel 哨兵:
将 sentinel.conf cp 到 bin目录下
如下为 sentinel 的启动停止脚本
#!/bin/bash
#chkconfig:- 20 80
#description: starts and stops the redis daemon
#config: /soft/redis/bin/sentinel.conf
#pidfile: /var/run/redis.pidsource /etc/init.d/functions
BIN="/soft/redis/bin"
REDIS_CONFIG="/soft/redis/bin/sentinel.conf"
PIDFILE="/var/run/sentinel.pid"#读取配置[ -r "$SYSCONFIG" ] && source $"SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="redis-server"
sent="sentinel"
s="--sentinel"
p="28979"start(){if test $( pgrep -f $sent | wc -l) -gt 0thenecho "$sent 已经运行..."exit 1fidaemon $BIN/$prog $REDIS_CONFIG $s &RETVAL=$?echo $"已启动 $sent:" echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$sentreturn $RETVAL} stop()
{ps -ef|grep $sent| grep -v grep | awk '{print $2}'|xargs kill -9 RETVAL=$? echo $"已停止 $sent"echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$sent $PIDFILEreturn $RETVAL}status()
{if test $( pgrep -f $sent | wc -l) -gt 0 thenecho "$sent 已经运行...."elseecho "$sent 未启动....."fi}restart()
{stopstart}case "$1" instart)start;; stop)stop;;restart)restart;;status)status $sentRETVAL=$?;;*)echo $"使用:$0{start|stop|restart|status}"RETVAL=1esac
exit $RETVAL
哨兵: 心跳监测主机是否挂了, 主机挂了根据投票 在从机中选一个老大出来, 都挂了就用 keepalive 脚本重启, 重启失败发邮件或短信通知运维
在主服务器上的 sentinel.conf中配置, 可以将 sentinel.conf 复制到 bin 目录下。
vim sentinel.cof
113行:mymaster 主机名称, 192.168.1.128 主机ip, 6379 主机端口, 1 选举次数, 两台服务器, 一票就能当老大。
121行: 500 心跳监测, 毫秒
26 行 开启后台启动 no 改为yes
测试哨兵机制:
1:启动哨兵:在bin目录下, 开启后台启动后无需加 &
./redis-server sentinel.conf --sentinel
2: 开启主机
主机服务端启动: ./redis-server redis.conf
主机客户端启动: ./redis-cli -a 密码
输入 info
主机role 为 master
从机 启动
1:从机 服务端启动: ./redis-server redis.conf
2:从机客户端启动 ./redis-cli -a 密码
从机输入info
从机 role: 为slave 从机, master主机地址为: 192.168.1.128
将主机 的进程 kill 掉
查看从机 info
从机 role 角色变为 master
redis RDB 存储 与 AOF 存储, 默认打开RDB存储
1: RDB 根据时间 与 key 的个数 达到阀值保存数据持久化, 体积小, 不是实时型保存数据, 在服务器宕机后容易丢失数据,备份不完全。使用二进制文件存储
2: AOF 实时保存数据, 体积大, 备份完全, 耗时久, 性能没有 RDB 好。 快照存储,
两者可以一起使用。
AOF: 开启 aof存储
vim redis.conf
698 行 no 改为 yes
702行为 文件名称
RDB 默认开启:
250行 rdb 默认是 yes
253行 rdb 文件名称
测试 aop 存储:
在客户端写入数据, 实时查看 appendonly.aof 文件, 会发现, set 后 appendonly.aof 文件就会追加添加的数据的命令。
redis 事务 : multi 开启事务, exec 提交事务
以上为本人亲自测试, 如有错误, 欢迎留言指正, 谢谢!
redis 缓存穿透:
查询缓存中没有数据, 查询数据库也没有数据, 导致每次查询都去数据库查询, 而且还没有查询到数据, 也是缓存的命中率问题。
解决方法: 将数据库查询空值后,设一个默认值放入缓存,设定失效时间。 简单直接。
缓存雪崩:
缓存在某一段时间内, 都失效过期了, 而新缓存没有写入, 全部查询直接去数据库操作, 造成数据库, cpu,内存很大的压力,甚至导致数据库宕机, 形成一系列连锁反应, 导出系统崩溃。
解决方式:
1:加锁队列排队,
2:或者增加缓存标记, 是否过期, 过期则另开线程去更新数据。
3:
业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。
缓存预热:
1: 启动时另开线程加载缓存
2: 页面按钮点击加载缓存
3: 定时刷新缓存
缓存更新:
1: 清除缓存重新加载
2: 请求时判断是否过期, 过期了请求数据库后重新写入缓存
这篇关于cenos7 安装redis 与 配置redis 主从复制, 哨兵机制 , aof与rdb存储, 事务 记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!