Linux基础——Redis(二)
运行方式说明 |
Redis如果提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据都会丢失。开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中。rdb和aof对性能都有影响,所以建议持久化的操作在从库上进行。 |
||||||||||||
两种存储模式 |
rdb:也叫做快照,类似VMware虚拟机快照。快速的把内存中的数据,映射到磁盘。容量并不是很大。 aof:类似于Mysql的binlog |
||||||||||||
Rdb相关配置 |
|||||||||||||
Rdb 相关配置文件信息 |
save 60 10000:60秒内,redis出现了一万条数据变化,那么进行一次rdb存储。 save 300 10:300秒内出现10次数据变化,进行一次存储 save 900 1 :900秒内出现1次数据变化,进行一次存储 数据变化越快,存储频率就越高 Rdb存储时,用户是无法使用的。 |
||||||||||||
开启关闭 rdb存储 |
[root@Ansible ~]# redis-cli //登入redis 127.0.0.1:6379> auth abc123, OK //键入密码 127.0.0.1:6379> config get save 1) "save" 2) "900 1 300 10 60 10000" //查看rdb存储配置参数 127.0.0.1:6379> config set save "" OK //写入滞空rdb配置参数 127.0.0.1:6379> config get save 1) "save" 2) "" //查看rdb存储配置参数 127.0.0.1:6379> config set save "60 10000 300 10 900 1" OK //写入rdb配置参数 127.0.0.1:6379> config get save 1) "save" 2) "60 10000 300 10 900 1" 127.0.0.1:6379> config rewrite OK //写入配置 |
||||||||||||
数据写入 观察存储日志 |
[root@Ansible ~]# cd /data/redis/ //进入redis数据存储目录 [root@Ansible redis]# ls dump.rdb redis.log redis.pid //dump.rdb为rdb存储文件的名字,此文件存在表示rdb开启无误 也可以手动开启 方法一: 127.0.0.1:6379> save OK 方法二: 127.0.0.1:6379> bgsave Background saving started 二者区别: 127.0.0.1:6379> save 数据存储在硬盘上 127.0.0.1:6379> bgsave 后台存储进程开启,PID为46514;数据存储在硬盘上;RDB占用0兆内存, 使用写实复制技术;后台进程存储成功; 前台保存会阻止用户写入数据,后台无影响; |
||||||||||||
数据写入 观察日志 |
[root@Ansible ~]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //写入一万条数据 在60秒内有一万条数据发生了变化,开始保存;后台启动进程开始保存,pid号为77084;数据写入到磁盘;占用0内存,写实复制技术;保存成功; rdb虽然对数据性能影响最低,但是无法保证100%安全。 |
||||||||||||
Aof相关配置 |
|||||||||||||
开启aof |
默认情况下,redis的aof是处于关闭状态的,需要开启 第一行是aof是否开启;第二行是开启后的文件名称;第三行是秒级同步。 [root@Ansible ~]# redis-cli //进入redis 127.0.0.1:6379> config get appendonly 1) "appendonly" 2) "no" //查看aof是否开启 127.0.0.1:6379> config set appendonly "yes" OK //开启aof 127.0.0.1:6379> config get appendonly 1) "appendonly" 2) "yes" //此时aof已经开启 127.0.0.1:6379> config rewrite OK //重写保存配置 [root@Ansible ~]# cat /usr/local/redis/conf/redis.conf //查看配置文件 [root@Ansible ~]# ls /data/redis/ appendonly.aof dump.rdb redis.log redis.pid //文件存在,aof已开启 |
||||||||||||
写入文件测试 |
[root@Ansible redis]# du -sh appendonly.aof dump.rdb //默认情况下,sdb和aof的大小为: [root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //写入1000个key测试 [root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //再写入1000个key进行查看 [root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //再写入1000个key进行查看 //可以看到aof文件是不断增大的,而rdb是保持不变的 [root@Ansible redis]# cat appendonly.aof //存一个值,key为键;valuel为值;$3是位数,开辟一个可以放三个字母set的空间;$9是开辟一个可以放9个字母的空间;$12是开辟一个可以放12个字母的空间。 由此可以看出,aof是逐条记录,并写入存储空间的。所以会存储很多重复的数据,但是sdb是不会记录重复数据的,所以sdb比aof要小很多。 [root@Ansible redis]# redis-cli bgrewriteaof //去掉aof中的重复数据,这样才会使文件变小 新版本的redis会自动触发重写,当aof到一定大小,会自动取出重复数据。 |
||||||||||||
补充:我们发现,虽然我们向redis添加了一个key,又删除了这个key。Reids数据库从本质上来看是没有增加任何数据的,但是aof文件仍然将所有操作都记录了,这样就会导致aof文件分厂打,所以aof文件的优化,就是让aof文件进行重写,只保留数据增量的部分,如此aof文件就小的多了。 |
|||||||||||||
打开了aof,aof文件和rdb文件都在存储,但是启动redis,redis读取的是aof,不读取rdb。如果向让其读取rdb来恢复数据,那么就需要关闭aof。 |
|||||||||||||
Redis最大内存设置和删除算法 |
|||||||||||||
生命周期 |
127.0.0.1:6379> ttl name (integer) -1 //-1表示key永久有效;ttl 查看目标生命周期 127.0.0.1:6379> ttl name (integer) -2 //-2表示数据已经过期,相当于数据丢失 127.0.0.1:6379> expire name 10 (integer) 1 //设置数据的生效周期,单位为秒;不设置为永久生效 |
||||||||||||
查看设置最大内存 |
当内存达到限定,redis无法超额抢占系统内存的情况下,redis将无法继续写入数据。 [root@Ansible redis]# redis-cli //登入 127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "0" //查看最大内存设置 127.0.0.1:6379> config set maxmemory "1M" OK //设置最大内存为1M 127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "1000000" //查看 测试: [root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //写入一万条数据测试 OOM表示内存溢出,无法写入 |
||||||||||||
可选择的删除算法 |
当最大内存溢出,默认是noeviction Volatile-lru:优先删掉有过期时间的键值对 |
||||||||||||
实验 |
[root@Ansible redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done //创建10000个键值对,模拟内存溢出 127.0.0.1:6379> set name when (error) OOM command not allowed when used memory > 'maxmemory'. //内存溢出,无法写入 127.0.0.1:6379> config get maxmemory-policy 1) "maxmemory-policy" 2) "noeviction" //查看算法 127.0.0.1:6379> config set maxmemory-policy volatile-lru OK //使用volatile-lru算法 127.0.0.1:6379> config get maxmemory-policy 1) "maxmemory-policy" 2) "volatile-lru" //算法已更改 127.0.0.1:6379> config rewrite OK //应用配置 127.0.0.1:6379> get key_00111 "value1_00111" //查看键值对儿 127.0.0.1:6379> expire key_00111 3600 (integer) 1 //设置键值对儿生命周期 127.0.0.1:6379> ttl key_00111 (integer) -2 //已过期 127.0.0.1:6379> get key_00111 (nil) //已经被删除 由上实验可看出:volatile-lru算法当内存达到了最大值后,会优先伤处有过期时间的key。 |
||||||||||||
Redis禁用屏蔽危险命令 |
|||||||||||||
禁用命令 |
flushall和flushdb会清除redis数据,比较危险;keys在键过多的时候,使用会阻塞业务请求。 |
||||||||||||
操作 |
[root@Ansible redis]# echo 'rename-command FLUSHALL ""' >> /usr/local/redis/conf/redis.conf [root@Ansible redis]# echo 'rename-command FLUSHDB ""' >> /usr/local/redis/conf/redis.conf [root@Ansible redis]# echo 'rename-command KEYS ""' >> /usr/local/redis/conf/redis.conf //在配置文件中加入内容 [root@Ansible redis]# tail -3 /usr/local/redis/conf/redis.conf //查看配置文件的内容 [root@Ansible redis]# redis-cli shutdown [root@Ansible redis]# redis-server /usr/local/redis/conf/redis.conf //重启redis服务 [root@Ansible redis]# redis-cli 127.0.0.1:6379> flushall (error) ERR unknown command `flushall`, with args beginning with: 127.0.0.1:6379> flushdb (error) ERR unknown command `flushdb`, with args beginning with: 127.0.0.1:6379> key * (error) ERR unknown command `key`, with args beginning with: `*`, //测试发现,已禁用的命令都不可用 |
||||||||||||
Redis的主从复制 |
|||||||||||||
环境 |
|
||||||||||||
关闭防火墙和selinux服务 |
|||||||||||||
1. |
在所有机器上进行redis的安装操作 [root@redis ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake //解决依赖关系 [root@redis ~]# tar xf redis-4.0.11.tar.gz -C /usr/src //解压安装包到安装目录 [root@redis ~]# cd /usr/src/redis-4.0.11 //进入安装目录 [root@redis redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install //编译安装redis [root@redis redis-4.0.11]# cd /usr/local/redis //进入redis安装目录 [root@redis redis]# mkdir -p /usr/local/redis/conf //创建conf目录,用于存放配置文件 [root@redis redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/ [root@redis redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/ //复制配置文件到conf目录 [root@redis redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/ //优化命令路径 [root@redis redis]# which redis-server /usr/local/bin/redis-server //查看是否存在命令 |
||||||||||||
2. |
三台都进行配置文件优化和简单的基础调优 [root@redis redis]# cp conf/redis.conf{,.bak} //备份配置文件 [root@redis redis]# egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf //优化配置文件 [root@redis redis]# mkdir -p /data/redis //创建目录用于存放redis数据信息 讲配置文件进行修改 |
||||||||||||
3. |
进行基础调优 [root@redis redis]# echo "* - nofile 10240" >> /etc/security/limits.conf //调整系统文件描述符 [root@redis redis]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf //调整TCP连接数 [root@redis redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf //调整系统内存分配策略 [root@redis redis]# sysctl -p net.core.somaxconn = 10240 vm.overcommit_memory = 1 //从指定文件加载系统参数 [root@redis redis]# echo never > /sys/kernel/mm/transparent_hugepage/enabled [root@redis redis]# echo never > /sys/kernel/mm/transparent_hugepage/defrag [root@redis redis]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local [root@redis redis]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local //关闭系统内核巨大内存支持 [root@redis redis]# redis-server /usr/local/redis/conf/redis.conf //开启服务 [root@redis redis]# netstat -antup | grep redis //查看服务是否开启 |
||||||||||||
4. |
在两台从机器上执行以下操作 Redis的主从同步,不用修改master任何配置,只需要在redis-slave上指定master的IP地址即可。 [root@redis redis]# redis-cli shutdown //关闭从库服务 [root@redis redis]# echo "SLAVEOF 192.168.200.136 6379" >> /usr/local/redis/conf/redis.conf //将主库的IP和端口写入从库的配置文件 [root@redis redis]# redis-server /usr/local/redis/conf/redis.conf //开启redis服务 查看服务启动情况 |
||||||||||||
全量同步日志分析 |
从: 主: |
||||||||||||
部分同步日志分析 |
[root@redis01 ~]# > /data/redis/redis.log [root@redis02 ~]# > /data/redis/redis.log //清空主和从的redis日志 [root@redis02 ~]# redis-cli shutdown [root@redis02 ~]# redis-server /usr/local/redis/conf/redis.conf //重启从服务器的redis服务 从: 主: |
||||||||||||
主从同步的停止 |
[root@redis02 ~]# > /data/redis/redis.log //清空从库日志 [root@redis02 ~]# redis-cli slaveof no one //停止从库的主从同步 [root@redis02 ~]# cat /data/redis/redis.log //查看日志 [root@redis ~]# > /data/redis/redis.log //清空日志 [root@redis ~]# redis-cli slaveof 192.168.200.136 6379 OK //恢复主从数据库同步 |
||||||||||||
加密主从同步 |
1.为redis-master平滑设置连接密码 [root@redis01 ~]# redis-cli //登入 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "" //查看密码配置 127.0.0.1:6379> config set requirepass "xiaofa" OK //设置密码 127.0.0.1:6379> auth xiaofa OK //键入密码 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "xiaofa" //查看密码 127.0.0.1:6379> config rewrite OK //保存配置 |
||||||||||||
2.为从库提供主从同步密码验证 [root@redis ~]# redis-cli //登入 127.0.0.1:6379> config get masterauth 1) "masterauth" 2) "" //查看主库密码配置 127.0.0.1:6379> config set masterauth "xiafao" OK //键入主库密码 127.0.0.1:6379> config get masterauth 1) "masterauth" 2) "xiafao" //查看主库密码配置 127.0.0.1:6379> config rewrite OK //写入 127.0.0.1:6379> exit [root@redis ~]# tail -1 /usr/local/redis/conf/redis.conf masterauth "xiafao" //查看从库配置文件,是否存储主库的密码 |
Linux基础——Redis(二)相关推荐
- Linux基础练习题(二)
Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...
- Linux基础命令二
Linux基础命令二 ⚽⚽有志者,事竟成,破釜沉舟百二秦关终归楚⚽⚽
- Linux基础(二)的笔记
文章目录 前言 一. VIM文本编辑器 1.VIM文本编辑器的概述 2.VIM编辑器的操作模式 二.磁盘管理 1.Linux磁盘管理常用命令 2.Linux硬盘分区和格式化概述 3.Virtual b ...
- 实验楼Linux基础挑战2答案,实验楼-Linux基础-实验二 Linux的基本概念及操作
一.实验介绍 1.1 实验内容 实验楼环境介绍 常用 Shell 命令及快捷键 Linux 使用小技巧 1.2 实验知识点 Linux 基本命令 通配符的使用 查看帮助文档 二.桌面环境 1.Linu ...
- linux基础测试题二
基础测试题 一选择题 1.某文件的组外成员的权限为只读:所有者有全部权限:组内的权限为读与写,则该文件的权限为. A 467 B 674 C 476 D 764 2.将Window ...
- Linux基础学习二:计算机组成以及Linux简单配置
一.计算机组成 服务器: 配置比较高的电脑 云服务器:阿里云,腾讯云 购置硬件服务器: 需要机房(自建 , IDC机房) CPU 概念:计算机核心.中央处理器 作用:执行指令.代码 类别:大脑 实战参 ...
- linux基础(二)
四.常用命令介绍 4.1.1 目录处理命令 1).目录处理命令:ls 命令名称:ls 功能描述:ls命令用来显示目标列表 命令英文原意:list 命令所在路径: /bin/ls ...
- Linux基础命令(二十)Linux中的磁盘管理(后)
一.开机自动挂载 需求1:由于mount挂载后,每次关机都会umount,想让开机自动挂载! 前提:存在已经格式化好了的分区! 策略1:vim /etc/fstab /dev/vdb1 /mnt xf ...
- Linux基础操作二
编程语言的作用及与操作系统和硬件的关系 编程语言的作用:用来定义计算机程序的形式,程序员用它来编写程序,进而控制其向计算机发出指令,使计算机完成人类布置的任务. 编程语言的作用及与操作系统和硬件的关系 ...
最新文章
- Maven安装与配置(最实用!!!)eclipse中配置maven
- 关于struts1的配置
- FPGA之道(63)“万能”的查表法
- LINUX共享内存使用常见陷阱与分析(转)
- Lattice diamond IPexpress 例子 - PLL
- 响应式web(三):服务当中的三种耦合,流式计算,RXJava2,Flux,Mono
- MATLAB中的命令行输出
- 安装环境及Git小技巧
- Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
- 贺利坚老师汇编课程37笔记:运用栈加两层循环之把六个字符串里的字母都改写成大写字母
- Typora MarkDown语法笔记(一)
- 公众号 多服务器配置_多账号公众号分享的素材如何采集以及一键分发?
- shell脚本编程 逐行处理文本 将字符串转化为数组
- 自动驾驶 9-3: 走向非线性 - 扩展卡尔曼滤波器 Going Nonlinear - The Extended Kalman Filter
- 整篇文章翻译软件对接谷歌等各大翻译平台
- Gartner:浪潮存储进入分布式存储前三
- 3D游戏图形API简史
- Unity UGUI 图文混排
- 相伴女人一生的爱情语录[组图]
- numpy常用公式收集