redis配置与优化

一:redis 概述

1.1 redis 简介

Redis (远程字典服务器) 是一个开源的、使用c语言编写的NoSQL数据库。

Redis基于内存运行并支持持久化,采用key-value (键值对)的存储形式,是目前分布式架构中不可或缺的一环。

Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程, Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同一台服务器上开启多个Redis进程, Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可。

redis 在6.0 之前,都是单线程。一个进程中只有一个线程


1.2 redis 的优点

  • 具有极高的数据读写速度:(数据读取的速度最高可达到11000次/s,数据写入速度最高可达到81000次/s.
  • 支持丰富的数据类型:支持key-value,strings,lists,hashes,sets以及sorted sets等数据类型
  • 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以在加载进行使用
  • 原子性:redis 所有的操作都是原子性的。
  • 支持数据备份:及master-slave模式的数据备份

1.3 redis的应用场景

redis 作为基于内存运行的数据库,缓存是其最常应用的场景之一。除此之外,redis常见应用场景还包括获取最新N个数据的操作,排行榜类应用,计数器应用,存储关系,实时分析系统,日志记录等。


1.4 redis 为什么读写速度快

  1. redis 是一款纯内存结构,避免了磁盘 I/O等耗时操作
  2. redis 命令处理的核心模块是单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗
  3. 采用了I/O多路复用机制,大大提升了并发效率。


1.5 关系型数据库

  • 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向与记录。
  • SQL语句(标准数据查询语句)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
  • 主流的关系型数据库包括 Oracle ; MySQL ; SQL Server ; Microsoft Access ; DB2 ; PostgreSQL

以上数据库在使用共的时候必须先建库建表,设计表结构,然后存储数据的时候按照表结构去存,如果数据与表结构不匹配,就会存储失败。

1.6 非关系型数据库

  • NoSQL(NoSQL = Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称
  • 除了主流的关系型数据库外的数据库,都认为是非关系型
  • 不需要预先建库建表定义数据存储表结构,每条记录可以有不同的数据类型和字段个数(如微信群聊中的文字和图片,视频,音乐等)
  • 主流的NoSQL数据库有 Redis ; MongoDB ,Hbase ;Memcached;CouchDB

1.7 关系型数据库和非关系型数据库的区别

1.7.1 数据的存储方式不同

  • 关系型和非关系型数据库的主要差异是数据的存储方式。关系型数据库天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联写作存储,也很容易提取数据。

  • 与关系型数据库相反,非关系型数据库不适合存储在数据表的行和列中,而是大块组合在一起。非关系数据库通常存储在数据集中,就像文档,键值对或者图结构。

数据及其特性是选择数据存储和提取方式 的首要影响因素


1.7.2 扩展方式不同

SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的欲求当然要扩展

  • 要支持更多并发量,SQL数据库是纵向扩展,也就是说提高梳理能力,使用速度更快的计算机,这样处理相同的数据集就更快了。因为数据集存储在关系表中,操作的性能瓶颈可能涉及到多个表,这都需要通过提高计算机性能来克服。虽然SQL数据有很大扩展空间,但是最终肯定会达到纵向扩展的上限

  • 而NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多的普通的数据库服务器(节点)来分担负载

1.7.3 对事务性的支持不同

  • 如果数据操作需要高事务陷阱或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是最佳选择。SQL数据库支持对数据原子性细粒度控制,并且易于回滚事务。
  • 翠然NoSQL数据库也可以使用事务操作,但是稳定性方面没法和关系型数据库比较,所以他们真正的闪亮的价值是在操作的扩展性和大数据量处理方面

1.8 非关系型数据库产生背景

可用于应对Web2.0纯动态网站类型的三高问题

  1. High performance ——对数据库高并发读写需求
  2. Huge Storage ——对海量数据高效存储与访问需求
  3. High Scalability && High Availability ——对数据库高可扩展性与高可用性需求

关系型数据库和非关系型数据库都有各自的特点与应用场景,两者紧密结合将会个Web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,非关系型数据库关注在存储上。例如,在读写分离的MySQL数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。



二:redis的安装与部署

2.1 关闭防火墙,上传软件包

[root@host103 ~]# systemctl disable firewalld  --now
[root@host103 ~]# setenforce  0

#将redis软件包上传到/opt目录
[root@host103 ~]# cd /opt/
[root@host103 opt]# ls redis-5.0.7.tar.gz 
redis-5.0.7.tar.gz


2.2 解压编译安装

#安装必须的软件包
[root@host103 opt]# yum -y install gcc gcc-c++ make

[root@host103 opt]# tar zxvf redis-5.0.7.tar.gz
[root@host103 opt]# cd /opt/redis-5.0.7/

[root@host103 redis-5.0.7]# make -j 4
#工作目录为/usr/local/redis
[root@host103 redis-5.0.7]# make PREFIX=/usr/local/redis install

由于redis源码包中直接提供了Makefile文件,所以在解压完软件包后,不用先执行./configure进行配置,可以直接执行make与make install 命令进行安装

image-20210914231026714



2.3 执行脚本文件

执行软件包提供的install_server.sh脚本文件,设置redis服务所需要的相关配置文件

[root@host103 redis-5.0.7]# cd /opt/redis-5.0.7/utils/
[root@host103 utils]# ./install_server.sh
........... #一直回车直到出现redis executable path 
#可执行文件路径。在redis的工作目录的bin目录下,有个redis-server文件
Please select the redis executable path [] /usr/local/redis/bin/redis-server

#配置完会输出配置信息。如果正确,就回车,如果有错误就ctrl c终止
Is this ok? Then press ENTER to go on or Ctrl-C to abort.

image-20210914232521905

image-20210914232603695



2.4 将redis命令放入PATH变量定义的路径中

ln -s /usr/local/redis/bin/* /usr/local/bin/

image-20210914233140664



2.5查看redis的6379端口是否启用 

当 install_server.sh脚本运行完毕,Redis服务就已经启动。默认监控6379端口

[root@host103 ~]# netstat -natp |grep redis
#redis使用的是tcp 6379端口
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      17382/redis-server  

2.6 Redis的服务控制

/etc/init.d/redis_6379 stop #停止redis服务

/etc/init.d/redis_6379 start #启动redis服务

/etc/init.d/redis_6379 restart #重启redis服务

/etc/init.d/redis_6379 status #查看redis服务状态


2.7 修改redis配置文件参数

redis 的主配置文件为/etc/redis/6379.conf

[root@host103 ~]# vim /etc/redis/6379.conf

#70行,添加监听的主机地址
70// bind 127.0.0.1 192.168.23.103

#93行,redis的默认监听地址。保持默认即可
93// port 6379

#137, 启用守护进程。保持默认即可
137// daemonize yes

#167,定义redis的日志级别为notice。保持默认即可
167// loglevel notice

#172,指定redis的日志文件。保持默认即可
172// logfile /var/log/redis_6379.log

#保存退出
:wq

#重启服务
[root@host103 ~]# /etc/init.d/redis_6379 restart


三:redis的命令工具

3.1 redis的bin目录下可执行文件

[root@host103 ~]# cd /usr/local/redis/bin/
[root@host103 bin]# ll
总用量 32768
-rwxr-xr-x 1 root root 4366224 9月  14 23:09 redis-benchmark
-rwxr-xr-x 1 root root 8125848 9月  14 23:09 redis-check-aof
-rwxr-xr-x 1 root root 8125848 9月  14 23:09 redis-check-rdb
-rwxr-xr-x 1 root root 4807408 9月  14 23:09 redis-cli
lrwxrwxrwx 1 root root      12 9月  14 23:09 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 8125848 9月  14 23:09 redis-server


redis 的bin目录下一共有6个文件。除去一个redis-sentinel 是redis-server的软连接外,其余的5个都是可执行文件


  • redis-server: 用于启动redis的工具
  • redis-benchmark: 用于检测redis在本机的运行效率
  • redis-check-aof: 修复AOF持久化文件
  • redis-check-rdb:修复RDB持久化文件
  • redis-cli:redis命令行工具


3.2 redis-cli 命令行工具

语法: redis-cli -h host -p port -a password

选项 释义
-h 指定远程主机
-p 指定redsi服务的端口号
-a 指定密码。未设置数据库面,可以省略-a选项

如果不添加热河选项,则表示使用127.0.0.1:6379 连接本机上的redis数据库

#进入192.168.23.103主机的redis数据库,连接端口为6379
[root@host103 ~]# redis-cli -h 192.168.23.103 -p 6379
192.168.23.103:6379>    #当前连接提示符

#默认连接本机127.0.0.1的6379端口
[root@host103 ~]# redis-cli
127.0.0.1:6379>


3.3 redis-benchmark 测试工具

redis-benchmark 工具是官方自带的redsi性能测试工具。可以有效的测试redis服务的性能。

语法:redis-benchmark [选项] [选项值]

选项 释义
-h 指定服务器主机名
-p 指定服务器端口
-s 指定服务器socket
-c 指定并发连接数
-n 指定请求数
-d 以字节的形式指定 SET/GET值的数据大小
-k 1=keep alive , 0=reconnect
-r SET/GET/INCR 使用随机key,SADD使用随机值
-p 通过管道传输<numreq>请求
-q 强制退出redis,仅显示query/sec值
--csv 以CSV格式输出
-l(小写的L) 生成循环,永久执行删除
-t 仅运行以逗号分隔的测试命令列表
-I(大写的 i ) Idle模式。仅打开N个idle连接并等待
#向ip为192.168.23.103 ,端口为6379的redis服务器发送100 个并发连接与100000个请求,测试性能
[root@host103 ~]# redis-benchmark  -h 192.168.23.103 -p 6379 -c 100 -n 100000


#测试存取大小为 100 字节的数据包的 性能
[root@host103 ~]# redis-benchmark -h 192.168.23.103 -p 6379 -q -d 100


#测试本机上Redis 服务正在进行set与;lpush操作时的性能
[root@host103 ~]# redis-benchmark  -t set,lpush -n 100000 -q


四 redis 数据库操作


4.1 set 存放数据,get获取数据

格式

set 存放数据:set key value

get 存放数据: get key

#设置 键 boss,值Wiewanglei
127.0.0.1:6379> set boss wanglei
OK

#获取 键boss的值
127.0.0.1:6379> get boss
"wanglei"


4.2 keys 查看键值列表

keys 命令可以获取符合规则的价值列表,通常情况可以结合 * 、? 等选项来使用


*: 匹配任意字符任意次数

?:匹配任意字符一次


keys * 查看当前数据库中所有键

keys a* 查看当前数据库中所有以a 开头的数据

keys b? 查看当前数据库中所有b开头后面包含任意一位的数据

keys b?? 查看当前数据库中所有b 开头后面包含任意两位的数据

#先创建一下几个键值对
set a1 1
set a2 2
set a3 3
set b1 4
set b5 5
set b22 5

#查看当前数据库中所有键
127.0.0.1:6379> keys *
1) "boss"
2) "b1"
3) "a1"
4) "b22"
5) "a2"
6) "b5"
7) "a3"

#查看当前数据库中所有以a 开头的键
127.0.0.1:6379> keys  a*
1) "a1"
2) "a2"
3) "a3"

#查看b开头,后面包含任意一位的数据
127.0.0.1:6379> keys  b?
1) "b1"
2) "b5"

#查看b 开头,后面包含任意两位位的数据
127.0.0.1:6379> keys  b??
1) "b22"

4.3 exists , del ,type命令

exists命令可以判断键值是否存在。

  • existis key_name
    • 返回1 表示该键存在'
    • 返回0 表示改键不存在

del命令可以删除当前数据库的指定key

  • del key_name
    • 返回值表示删除键的数量

tyep命令可以获取key 对应的value 值类型

  • type key_name
    • 返回的值表示键的类型

#查看 boss键是否存在
27.0.0.1:6379> EXISTS boss
#返回1表示 boss键存在
(integer) 1

#查看键 hello是否存在
127.0.0.1:6379> EXISTS hello
#返回 0 表示不存在
(integer) 0



#删除键b5
127.0.0.1:6379> del b5
#返回值表示删除的键的数量
(integer) 1

#删除a1,a2键
127.0.0.1:6379> del a1 a2 
#返回2,表示删除了2个
(integer) 2

#c1,d1键不存在,所以命令执行后,返回0,表示删除了0个
127.0.0.1:6379> del c1 d1 
(integer) 0


#查看boss键的值类型(redis默认值类型是string)
127.0.0.1:6379> type boss
#string表示字符类型
string

#查看b22键的值类型
127.0.0.1:6379> type b22
string

4.4 rename,renamex重命名

rename 命令对已有的key进行重命名(覆盖)

renamex 命令的作用是对key 进行重命名,并检测新名是否存在,如果目标key存在,则不进行重命名(不覆盖)

使用rename 命令经行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值。在实际使用过程 中,建议先用exists 命令查看目标key是否存在,然后再决定是否执行rename 命令,以避免覆盖重要数据

格式:

rename或者renamex 源key_name 目标key_name

127.0.0.1:6379> keys *
1) "boss"
2) "b1"
3) "a1"
4) "a2"
5) "b22"
6) "a3"

#当前a1 值为“1”
127.0.0.1:6379> get a1
"1"
#将a1 重命名为 a11
127.0.0.1:6379> rename a1 a11
OK
#a11有值 "1",而a1 键则没有了
127.0.0.1:6379> get a11
"1"
127.0.0.1:6379> exists a1
(integer) 0

#当前b1键存在,且值为 ”4“
127.0.0.1:6379> get b1
"4"
# 将 键a11 重命名为b1
127.0.0.1:6379> rename a11 b1
OK
#查看b1 键的值,发现值被a11的值覆盖
127.0.0.1:6379> get b1
"1"
#原键 a11 不再存在
127.0.0.1:6379> exists a11
(integer) 0


#使用 renamex 将键 b1 重命名为 b11
127.0.0.1:6379> RENAMENX b1 b11
(integer) 1
#键b11 存在,值为”1“
127.0.0.1:6379> get b11
"1"

#当前键 b22 存在,且值为”5“
127.0.0.1:6379> get b22
"5"
#使用 renamex 将b11 键重命名为b22
127.0.0.1:6379> RENAMENX b11 b22
#可以从返回值为0看出失败了
(integer) 0
#查看键b22 和b11,都存在,且值没有改变,renamex重命名操作没有执行成功
127.0.0.1:6379> get b22
"5"
127.0.0.1:6379> get b11
"1"


4.5 dbsize统计key个数 

dbsize 命令的作用是查看当前数据库中key的数目,返回值表示key的数目

#查看所有key,可以看出一共有5个
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

#dbsize统计当前数据库的key个数,返回5表示有5个
127.0.0.1:6379> dbsize
(integer) 5

4.6 设置,查看,验证通过密码

设置密码:config set requirepass 密码

  • 一旦设置密码,必须先验证通过密码,否则所有操作不可用


查看密码:config get requirepass



验证通过密码:auth 密码

  • 退出redis数据库后,重连失效,要再次验证
  • 在连接数据库时,使用 -a 选项跟上密码可以不用auth验证

#设置密码abc123
127.0.0.1:6379> config set requirepass abc123
OK
#当没有验证通过时,命令不可用
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.

--------------------------

#验证通过密码
127.0.0.1:6379> auth  abc123
OK
#此时,命令可以使用
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

----------------------------------------------

#获取密码
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "abc123"

-------------------------------------

#退出redis 数据库
127.0.0.1:6379> exit

#重新进入redis数据库 
[root@host103 ~]# redis-cli 

#再次使用命令,报错。因为auth验证通过,在退出数据库后失效
127.0.0.1:6379> keys
(error) ERR wrong number of arguments for 'keys' command
#重新使用auth 命令进行密码验证后,命令可用
127.0.0.1:6379> auth abc123
OK
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

------------------------------

#退出数据库
127.0.0.1:6379> exit

#在连接数据库时,使用 -a 选项指定密码,则可以不用auth验证
[root@host103 ~]# redis-cli  -a abc123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
#在没有使用auth 命令验证的情况下,也可以正常使用数据库命令
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"


--------------------------
#将密码设置为空
127.0.0.1:6379> config set  requirepass ''
OK
#退出连接后再进入数据库
[root@host103 ~]# redis-cli  
#此时也可以正常使用命令了
127.0.0.1:6379> set a123 123
OK




4.7 redis 多数据库常用命令

redis 支持多数据库,默认情况下包含16 个数据库,数据库名称是用数字0-15来依次命名的。

多数据库相互独立,互不干扰

4.7.1多数据库之间的切换

命令格式: select 序号

使用redis-cli连接redis数据库后,默认使用的是0号数据库.

除了0号数据库,其余数据库会在提示符后面使用 [序号] 标明

#切换到 10 号数据库
127.0.0.1:6379> select 10
OK

#当前提示符后面有[10],表明是10号数据库
#切换到15号数据库
127.0.0.1:6379[10]> select 15
OK

#当前提示符后面有[15],表明是15号数据库
#切换到0号数据库
127.0.0.1:6379[15]> select 0
OK

#此时,0号数据库没有标识
#切换到16号数据库(没有这个序号的数据库)
127.0.0.1:6379> select 16
#报错提示,超出范围
(error) ERR DB index is out of range


4.7.2 多数据库之间移动数据

格式: move 键值 序号

#再当前的0 号库,设置 k1 键,值为”100“
127.0.0.1:6379> set k1 100
OK
#当前可以获取到k1键的值
127.0.0.1:6379> get k1
"100"

#切换到 10 号库
127.0.0.1:6379> select 10
OK
#查看发现 k1 键不存在,因为多数据库相互独立
127.0.0.1:6379[10]> EXISTS k1
(integer) 0

-------------

#切换会 0号库
127.0.0.1:6379[10]> SELECT 0
OK

#将 当前库中的 k1 键 移动到 10 号库
127.0.0.1:6379> MOVE k1 10
(integer) 1
#当前库查看,k1 键不存在
127.0.0.1:6379> EXISTS k1
(integer) 0

#切换到10 号库
127.0.0.1:6379> SELECT 10
OK

#k1键存在,且值为"100"
127.0.0.1:6379[10]> EXISTS k1
(integer) 1
127.0.0.1:6379[10]> GET k1
"100"


4.7.3 清空数据库库

flushdb 清空当前数据库数据

flushall 清空所有数据库数据

#切换到 15 号库,创建键 k222,值为"2222"
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> set k222 2222
OK
127.0.0.1:6379[15]> keys *
1) "k222"

#切换到10号库,当前10号库有键 k1
127.0.0.1:6379[15]> select 10
OK
127.0.0.1:6379[10]> keys *
1) "k1"

#使用flushdb 命令,清空当前库数据
127.0.0.1:6379[10]> FLUSHDB 
OK
#当前10号库没有数据
127.0.0.1:6379[10]> keys *
(empty list or set)

#切换到15号库和0号库查看,数据都存在。flushdb命令没有影响其他库
127.0.0.1:6379[10]> select 15
OK
127.0.0.1:6379[15]> keys *
1) "k222"
127.0.0.1:6379[15]> select 0
OK
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

-------------------------------------------

#在 0 号库执行 flushall 命令,清空所有库的数据
127.0.0.1:6379> flushall 
OK
#查看,当前库数据为空
127.0.0.1:6379> keys *
(empty list or set)

#切换到15号库查看,数据也为空。flushall 命令影响到了所有的库
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> keys *
(empty list or set)



五:redis的性能管理

5.1 查看redis的内存

可以进入数据库中查看,也可以在linux 命令行中直接查看

进入数据库执行info memory 查看:

[root@host103 ~]# redis-cli   
127.0.0.1:6379> info memory

直接在linux命令行查看
[root@host103 ~]# redis-cli info memory

查询到的信息详解

指标 含义
used_memory 由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)为单位,即当前redis使用内存大小。
used_memory_human 已更直观的单位展示分配的内存总量。
used_memory_rss 向操作系统申请的内存大小,与 top 、 ps等命令的输出一致,即redis使用的物理内存大小。
used_memory_rss_human 已更直观的单位展示向操作系统申请的内存大小。
used_memory_peak redis的内存消耗峰值(以字节为单位),即历史使用记录中redis使用内存峰值。
used_memory_peak_human 以更直观的格式返回redis的内存消耗峰值
used_memory_peak_perc 使用内存达到峰值内存的百分比,used_memory/ used_memory_peak) 100%,即当前redis使用内存/历史使用记录中redis使用内存峰值100%
used_memory_overhead Redis为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog。
used_memory_startup Redis服务器启动时消耗的内存
used_memory_dataset 数据实际占用的内存大小,即used_memory-used_memory_overhead
used_memory_dataset_perc 数据占用的内存大小的百分比,100%*(used_memory_dataset/(used_memory-used_memory_startup))
total_system_memory 整个系统内存
total_system_memory_human 以更直观的格式显示整个系统内存
used_memory_lua Lua脚本存储占用的内存
used_memory_lua_human 以更直观的格式显示Lua脚本存储占用的内存
maxmemory Redis实例的最大内存配置
maxmemory_human 以更直观的格式显示Redis实例的最大内存配置
maxmemory_policy 当达到maxmemory时的淘汰策略
mem_fragmentation_ratio 碎片率,used_memory_rss/ used_memory。ratio指数>1表明有内存碎片,越大表明越多,<1表明正在使用虚拟内存,虚拟内存其实就是硬盘,性能比内存低得多,这是应该增强机器的内存以提高性能。一般来说,mem_fragmentation_ratio的数值在1 ~ 1.5之间是比较健康的。详解
mem_allocator 内存分配器
active_defrag_running 表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行(defrag:表示内存碎片整理)详解
lazyfree_pending_objects 0表示不存在延迟释放的挂起对象


5.2 内存碎片率

查看Redis内存使用

92.168.9.236:7001> info memory

----内存碎片率 --------

操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memoryit算得出

内存碎片是由操作系统低效的分配/回收物理内存导致的(不连续的物理内存分配)


跟踪内存碎片率对理解Redis实例的资源性能是非常重要的:·

  • 内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低·

  • 内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率。需要在redis-cli工具上输入shutdown save命令,并重启Redis服务器。

  • 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少Redis内存占用。



5.3 内存使用率

----内存使用率----

redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。

避免内存交换发生的方法:

  • 针对缓存数据大小选择安装Redis实例
  • 尽可能的使用Hash数据结构存储
  • 设置key的过期时间


5.4 内回收key

----内回收key--

内存清理策略,保证合理分配redis有限的内存资源。


当达到设置的最大阀值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除。

配置文件中修改maxmemory-policy属性值:

vim /etc/redis/6379.conf

--598--

maxmemory-policy noeviction


策略有

  • volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据(移除最近最少使用的key,针对设置了TTL的key)
  • volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰(移除最近过期的key)
  • volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰(在设置了TTL的key里随机移除)
  • allkeys-lru:使用IRU算法从所有数据集合中淘汰数据(移除最少使用的key,针对所有的key)
  • allkeys-random:从数据集合中任意选择数据淘汰(随机移除key)
  • noeviction:禁止淘汰数据(不删除直到写满时报错)

image-20210917114209340

posted @ 2021-09-15 21:21  知己一语  阅读(825)  评论(0编辑  收藏  举报