性能常识 redis 性能分析

goodpassion · 2020年12月07日 · 1505 次阅读

Redis 性能剖析

高并发性能瓶颈点:

商品秒杀的业务场景为什么说跟其他的业务场景不一样呢?不一样在哪里呢?

用户扎堆现象很严重。
大数据时代的 3V:

海量 (Volume)、多样 (Variety) 、实时 (Velocity)

海量:现在的股票,期货的开盘时间固定的,这样就有海量的用户同时登陆
多样:电商,打车...
实时:操作软件的时候,1,2 秒钟没有响应的活,几乎就失去用户了
互联网需求的 3 高:

高并发,高性能(高可用),高可扩。

在这里插入图片描述

如果用传统的数据库来做,IO 操作很频繁。因为 mysql 是以文件的形式存储在硬盘上的
现在 redis 是缓存级别的,一般在项目里面是单独部署在一个服务器上面的。 对内存要求比较高。

关于数据库,有好多种:
在这里插入图片描述

一般文件的话,有文件服务器:mongdb

redis 是缓存的,阶段性的高频信息适合用 redis 来做。
在这里插入图片描述

高并发一般就是两种做法:

  • 1.加缓存:一般就是 redis

  • 2.队列:rabbitmq(用户的并发量来了,内部的机制,可以做一个基本的队列)

在这里插入图片描述

输入验证的同时,就是把时间拉长了。就是异步的机制。还有其他的一些策略。排队啊。倒计时。。。其实就是在分散好多压力
如果没有缓存、异步化这些技术,A 所有的请求都直接去访问 DB 话,不管你的数据库是 mysql 还是 oracle,都扛不住。

Redis 方案简介
在这里插入图片描述

Redis 就是将高频的数据放在 redis 的内存服务器上,减轻 mysql 的 IO 操作。对磁盘的读写的操作
在这里插入图片描述

优点:
在这里插入图片描述

最重要的就是解决并发的时候,对数据库的操作

一般 tomcat 和 nginx 挂了,是在页面上面能直接看出来的。都不能访问的
Redis 是存数据的,存频繁常用的数据。如果直接挂了,存在里面的 token 值,就是不能用了

分布式:

不同服务器一般放不同的模块(订单就是订单,购买就是购买)

集群:

不同服务器一般放相同的模块

在这里插入图片描述

相关操作:
在这里插入图片描述

为什么使用 Redis?
在项目中使用 Redis,主要考虑两个角度:性能和并发。否则用 Redis 干嘛??

  • 性能角度

    传统:
    在这里插入图片描述

    我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓
    存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
    特别是在秒杀系统,在同一时间,几乎所有人都在点,都在下单。。。执行的是同一操作———向数据库查数据

  • 并发角度

    在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。
    传统:
    在这里插入图片描述

1.Redis 安装:

wget http://download.redis.io/releases/redis-5.0.8.tar.gz #下载redis
tar zxvf redis-5.0.8.tar.gz #解压redis文件
mv redis-5.0.8 /usr/local #移到local目录下
cd /usr/local #进入local目录
mv redis-5.0.8 redis #重命名为redis目录
cd redis #进入redis目录
make #编译文件

2、Redis 常用工具
redis 最主要的工具都在 src 里面
在这里插入图片描述

绿色的表示可以执行的,

.c:redis是c语言写的。.c表示源文件
.h: 表示头文件
.o:out 文件,编译后的文件
redis-benchmark:
    基准测试工具,相当于一个自检的东西。
redis-cli:
    Redis 命令行工具,客户端
redis-server:
    启动 Redis,服务端
    redis有服务端和客户端
redis-check-aof:
    AOF :持久化文件检测工具和修复工具,检测文件类的

启 redis 就是启启动 Redis 服务端
(页面能打开,不代表 tomcat 和 nginx 是正常的,如果有 redis 的话,不代表 redis 是正常的)

关闭redis
    ps -ef|grep redis kill -9 进程ID
启动redis
    cd /usr/local/redis/src
    ./redis-server ../redis.conf
        :./redis-server是直接启;./redis-server ../redis.conf:从配置参数里面启
        ../:表示上一层目录

在这里插入图片描述

这个页面,不能关
正常来说是不应该有警告的,
通常会有 3 个警告:
在这里插入图片描述

1.tcp 连接数 (TCP 监听队列),默认是 128 个,一般改成 3 万多以上。
2.内存分配策略
3.THP
有这些警告,就需要让开发改

TCP 监听队列(somaxconn)

该内核参数默认值是128,作用是定义了系统中每一个端口最大的监听队列长度。对于负载很大的服务
程序来说大大的不够。一般会将它修改为32768(最大值65535的一半)。
使用:
    cat /proc/sys/net/core/somaxconn 查看
修改方法:
    编辑/etc/sysctl.conf ,改net.core.somaxconn =32768,再sysctl -p 使配置文件生效(永久有效)
    echo 32768 > /proc/sys/net/core/somaxconn(重启操作系统失效)

内存分配策略

overcommit_memory是操作系统内核对内存分配的一种策略。取值有0、1、2三种。
cat /proc/sys/vm/overcommit_memory 查看策略设置
grep -i commit /proc/meminfo最大可申请内存和已分配内存
    0:操作系统默认值。内核检查是否有足够的内存;有则允许申请;无则申请失败,返回错误给进程。
    1:不管需要多少内存,都允许申请
    2:当系统分配的内存超过:swap+物理RAM*N%时,会被拒绝(N%由vm.overcommit_ratio参数指
    定)
优化:
    redis在备份数据时,会fork出一个子进程,理论上子进程所占用的内存和父进程是一样的,如父进程占
    用内存为5G,这个时候也要同样分配5G的内存给子进程,如果内存无法负担,往往会造成redis服务器
    的宕机或者IO负载过高,效率下降。所以内存分配策略应该设置为 1。vm.overcommit_ratio参数默认为
    50,且当vm.overcommit_memory=2才生效,所以暂时可以不用管。
    设置方法有三种:
    编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,再sysctl -p 使配置文件生效(永久有效)
    sysctl vm.overcommit_memory=1(临时有效)
    echo 1 > /proc/sys/vm/overcommit_memory(临时有效)

关闭 THP

THP是Transparent Huge Pages的缩写,透明大页。linux内存采用分段分页机制,默认请求下一页大小
为4096kb,1M内存被分为256页。内存越大大页越多,就有大量的内存映射表需要去管理,对Oracle、
Redis等数据库,需要操作大量的内存,会影响系统性能。Huge Pages是提高内存页的大小来的,对于
G级别的内存,内存页大小设置为2M。由于 Huge pages 很难手动管理。于是引入了THP。但是在某些
情况下,THP会导致异常节点重启,和性能问题。因此建议禁用。
如何查看HTP是否启动呢?可以运行:
    cat /sys/kernel/mm/redhat_transparent_hugepage/enabled#小红帽
    cat /sys/kernel/mm/transparent_hugepage/enabled #其他Linux下。
结果是:[always]表示已启用,[never]表示已禁用。
禁用THP的方法如下(先临时禁用,再加入到配置文件):

# echo never > /sys/kernel/mm/transparent_hugepage/enabled
    # vi /etc/rc.local #添加如下代码(重启服务器生效)
    if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
        echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
    fi

Redis 的 redis-benchmark 工具

进入命令行工具
    cd /usr/local/redis/src
    ./redis-cli
    输入密码命令:auth 密码
    若显示OK则登录成功:

Redis 常见命令
在这里插入图片描述

在这里插入图片描述

可以有多个客户端,退出的话:ctrl+c

查看 redis 所有的信息

info
redis_version:redis版本号
gcc_version:linux里面编辑的版本
process_id:redis的进程号
uptime_in_seconds:redis启了多长时间(秒)
uptime_in_days:启了多少天
connected_clients:连接的客户端数
这个里面的值通过grafana是可以收集的

redis 配置文件
在这里插入图片描述

在这里插入图片描述

在 redis 的根目录下,有一个 redis.conf 文件,则是 redis 的配置文件。
它的参数非常多,主要参数有:

daemonize no #是否后台运行,一般改为yes
   logfile “” #日志文件,可设为:logfile “/usr/local/redis/redis.log”
   requirepass sq #启用Redis密码,sq是设置的密码
   protected-mode yes #保护模式,外部网络不能使用
   bind 127.0.0.1 #哪些ip可以连redis,后面可以带多个地址
   maxmemory #redis作为缓存一般需要设置,作为数据库不需要
   maxmemory-policy #key的回收策略。一共有6种策略
   maxclients 10000 #允许最大的连接数10000

6 种 key 的回收策略:

1. volatile-lru: 在所有带有过期时间的 key 中使用 LRU 算法淘汰数据;
   2. alkeys-lru: 在所有的 key 中使用最近最少被使用 LRU 算法淘汰数据,保证新加入的数据正常;
   3. volatile-random: 在所有带有过期时间的 key 中随机淘汰数据;
   4. allkeys-random: 在所有的 key 中随机淘汰数据;
   5. volatile-ttl: 在所有带有过期时间的 key 中,淘汰最早会过期的数据;
   6. noeviction: 不回收,当达到最大内存的时候,在增加新数据的时候会返回 error,不会清除旧数
   据,这是 Redis 的默认策略;

redis 基准测试
Redis 的 redis-benchmark 工具(不需要装,可以模拟 redis 性能)
如果有人问,你这个项目里面 redis 的性能怎么样?可以通过这个工具来测。好的话,性能 QPS 能到几十万。
这个工具就是测试不同的操作的 QPS 是多少?

    cd /usr/local/redis/src
    ./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
以上实例中:主机为 127.0.0.1,端口号为 6379(默认),执行的命令为 set,lpush(redis不同的操作),请求数为 10000,通过-q 参数让结果只显示每秒执行的请求数(QPS)

在这里插入图片描述

在这里插入图片描述

redis 是内存服务器,就是把数据放在内存里面的,所以有就是内存服务器
有 IO 型的服务器,比如文件型的服务器
有 cpu 型的服务器等等

redis 还有一个叫持久化技术
如果说 redis 有故障的时候,会主动把数据写到磁盘里面去

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册