运行方式说明

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的主从复制

环境

主机名

IP

用途

Redis01

192.168.200.165

Redis-master

Redis02

192.168.200.164

Redis-slaveA

Redis03

192.168.200.163

Redis-slaveB

关闭防火墙和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(二)相关推荐

  1. Linux基础练习题(二)

    Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...

  2. Linux基础命令二

    Linux基础命令二 ⚽⚽有志者,事竟成,破釜沉舟百二秦关终归楚⚽⚽

  3. Linux基础(二)的笔记

    文章目录 前言 一. VIM文本编辑器 1.VIM文本编辑器的概述 2.VIM编辑器的操作模式 二.磁盘管理 1.Linux磁盘管理常用命令 2.Linux硬盘分区和格式化概述 3.Virtual b ...

  4. 实验楼Linux基础挑战2答案,实验楼-Linux基础-实验二 Linux的基本概念及操作

    一.实验介绍 1.1 实验内容 实验楼环境介绍 常用 Shell 命令及快捷键 Linux 使用小技巧 1.2 实验知识点 Linux 基本命令 通配符的使用 查看帮助文档 二.桌面环境 1.Linu ...

  5. linux基础测试题二

     基础测试题 一选择题 1.某文件的组外成员的权限为只读:所有者有全部权限:组内的权限为读与写,则该文件的权限为. A 467    B 674   C 476     D 764 2.将Window ...

  6. Linux基础学习二:计算机组成以及Linux简单配置

    一.计算机组成 服务器: 配置比较高的电脑 云服务器:阿里云,腾讯云 购置硬件服务器: 需要机房(自建 , IDC机房) CPU 概念:计算机核心.中央处理器 作用:执行指令.代码 类别:大脑 实战参 ...

  7. linux基础(二)

    四.常用命令介绍 4.1.1 目录处理命令 1).目录处理命令:ls 命令名称:ls 功能描述:ls命令用来显示目标列表 命令英文原意:list             命令所在路径: /bin/ls ...

  8. Linux基础命令(二十)Linux中的磁盘管理(后)

    一.开机自动挂载 需求1:由于mount挂载后,每次关机都会umount,想让开机自动挂载! 前提:存在已经格式化好了的分区! 策略1:vim /etc/fstab /dev/vdb1 /mnt xf ...

  9. Linux基础操作二

    编程语言的作用及与操作系统和硬件的关系 编程语言的作用:用来定义计算机程序的形式,程序员用它来编写程序,进而控制其向计算机发出指令,使计算机完成人类布置的任务. 编程语言的作用及与操作系统和硬件的关系 ...

最新文章

  1. Maven安装与配置(最实用!!!)eclipse中配置maven
  2. 关于struts1的配置
  3. FPGA之道(63)“万能”的查表法
  4. LINUX共享内存使用常见陷阱与分析(转)
  5. Lattice diamond IPexpress 例子 - PLL
  6. 响应式web(三):服务当中的三种耦合,流式计算,RXJava2,Flux,Mono
  7. MATLAB中的命令行输出
  8. 安装环境及Git小技巧
  9. Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
  10. 贺利坚老师汇编课程37笔记:运用栈加两层循环之把六个字符串里的字母都改写成大写字母
  11. Typora MarkDown语法笔记(一)
  12. 公众号 多服务器配置_多账号公众号分享的素材如何采集以及一键分发?
  13. shell脚本编程 逐行处理文本 将字符串转化为数组
  14. 自动驾驶 9-3: 走向非线性 - 扩展卡尔曼滤波器 Going Nonlinear - The Extended Kalman Filter
  15. 整篇文章翻译软件对接谷歌等各大翻译平台
  16. Gartner:浪潮存储进入分布式存储前三
  17. 3D游戏图形API简史
  18. Unity UGUI 图文混排
  19. 相伴女人一生的爱情语录[组图]
  20. numpy常用公式收集

热门文章

  1. Java基础 - 坦克大战(第五章,坦克移动、与被击中效果功能)
  2. 【论文总结】飞行器任务规划技术综述沈成林教授/国防科大
  3. C++灵魂所在之---多态的前世与今生
  4. 中文简体、繁体之间的转换(UTF-8)
  5. hive静态分区,动态分区 -夜幕思年华
  6. 线上招生太难?教育行业裂变方案奉上
  7. Github高级搜素技巧—寻找开源项目
  8. Bitly缩短网址服务 - Blog透视镜
  9. CRO的作用,现状,发展和名录
  10. 如何证明一门编程语言是图灵完备的?是否图灵完备,对语言来说会产生哪些影响?