Redis概述


一、缓存技术

缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据的目的,因为CPU的速度太快了,CPU需要的数据由于硬盘往往不能在短时间内满足CPU的需求,因此CPU缓存、内存、Raid 卡缓存以及硬盘缓存就在一定程度上满足了CPU的数据需求,即CPU 从缓存读取数据可以大幅提高CPU的工作效率。
在这里插入图片描述

系统缓存

buffer与cache
buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存再写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间在写入磁盘,所以服务器突然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,一般用于读操作,CPU读文件从内存读,如果内存没有就先从硬盘读到内存再读到CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。

如何清除缓存?
向 /proc/sys/vm/drop_caches 写入相应的修改值,会清理缓存。建议先执行sync(强制将所有未写入的系统缓冲区数据刷新到磁盘上)

echo 1 > /proc/sys/vm/drop_caches
清除页面缓存
echo 2 > /proc/sys/vm/drop_caches
清除dentry和inode缓存
echo 3 > /proc/sys/vm/drop_caches
清除所有缓存(包括页面缓存、dentry和inode缓存)

如果因为是应用有像内存泄露、溢出的问题时,从swap的使用情况是可以比较快速可以判断的,但通过执行free 反而比较难查看。但核心并不会因为内存泄露等问题并没有快速清空buffer或cache(默认值是0),生产也不应该随便去改变此值。

一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的。当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。

排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。

缓存保存位置及分层结构

  • 用户层: 浏览器DNS缓存,应用程序DNS缓存,操作系统DNS缓存客户端。
  • 代理层: CDN,反向代理缓存。
  • Web层: Web服务器缓存。
  • 应用层: 页面静态化,利用软件将 数据库中的 资源,提前生成静态页面。
  • 数据层: 分布式缓存,数据库。
  • 系统层: 操作系统cache。
  • 物理层: 磁盘cache, Raid Cache。

cache的特性
自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除。
强制过期:源网站更新图片后CDN是不会更新的,需要强制是图片缓存过期,通过CDN管理后台实现。
命中率:即缓存的读取命中率。

CDN缓存

什么是CDN?

内容分发网络(Content Delivery Network,CDN)是建立并覆盖在承载网上,由不同区域的服务器组成的分布式网络。将源站资源缓存到全国各地的边缘服务器,利用全球调度系统使用户能够就近获取,有效降低访问延迟,降低源站压力,提升服务可用性。
在这里插入图片描述
用户请求CDN的流程
假设您的业务源站域名为 www.test.com ,域名接入 CDN 开始使用加速服务后,当您的用户发起 HTTP 请求时,实际的处理流程如下图所示:
在这里插入图片描述
详细说明如下:

  1. 用户向 www.test.com 下的某图片资源(如:1.jpg)发起请求,会先向 Local DNS 发起域名解析请求。
  2. 当 Local DNS 解析 www.test.com 时,会发现已经配置了 CNAME www.test.com.cdn.dnsv1.com ,解析请求会发送至 Tencent DNS(GSLB),GSLB 为腾讯云自主研发的调度体系,会为请求分配最佳节点 IP。
  3. Local DNS 获取 Tencent DNS 返回的解析 IP。
  4. 用户获取解析 IP。
  5. 用户向获取的 IP 发起对资源 1.jpg 的访问请求。
  6. 若该 IP 对应的节点缓存有 1.jpg,则会将数据直接返回给用户(10),此时请求结束。若该节点未缓存 1.jpg,则节点会向业务源站发起对 1.jpg 的请求(6、7、8),获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点(9),并返回给用户(10),此时请求结束。

CDN主要优势
CDN 有效地解决了目前互联网业务中网络层面的以下问题:

  • 用户与业务服务器地域间物理距离较远,需要进行多次网络转发,传输延时较高且不稳定。
  • 用户使用运营商与业务服务器所在运营商不同,请求需要运营商之间进行互联转发。
  • 业务服务器网络带宽、处理能力有限,当接收到海量用户请求时,会导致响应速度降低、可用性降低。
  • 利用CDN防止和抵御DDos等攻击,实现安全保护。

二、Redis部署和使用

redis简介

Redis (Remote Dictionary Server)在2009年发布,开发者Salvatore Sanfilippo是意大利开发者,他本想为自己的公司开发一个用于替换MySQL的产品Redis,但是没有想到他把Redis开源后大受欢迎,短短几年,Redis就有了很大的用户群体,目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎网,GitHub,Twitter 等。

Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久性等功能。Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛。

redis特性

  • 速度快: 10W QPS,基于内存,C语言实现
  • 单线程
  • 持久化
  • 支持多种数据结构
  • 支持多种编程语言
  • 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
  • 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
  • 主从复制
  • 支持高可用和分布式

单线程

Redis 6.0版本前一直是单线程方式处理用户的请求。
在这里插入图片描述
单线程为何如此快?

  • 纯内存
  • 非阻塞
  • 避免线程切换和竞态消耗

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

注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。
在这里插入图片描述

redis对比memcached

  • 支持数据的持久化:可以将内存中的数据保持在磁盘中,重启redis服务或者服务器之后可以从备份文件中恢复数据到内存继续使用
  • 支持更多的数据类型:支持string(字符串)、hash(哈希数据)、list(列表)、set(集合)、zset(有序集合)
  • 支持数据的备份:可以实现类似于数据的master-slave模式的数据备份,另外也支持使用快照+AOF
  • 支持更大的value数据:memcache单个key value最大只支持1MB,而redis最大支持512MB(生产不建议超过2M,性能受影响)
  • 在Redis6版本前,Redis 是单线程,而memcached是多线程,所以单机情况下没有memcached 并发高,性能更好,但redis 支持分布式集群以实现更高的并发,单Redis实例可以实现数万并发
  • 支持集群横向扩展:基于redis cluster的横向扩展,可以实现分布式集群,大幅提升性能和数据安全性
  • 都是基于 C 语言开发
memcachedredis
类型key-valuekey-value
过期策略支持支持
数据类型单一数据类型五大数据类型
持久化不支持支持
主从复制不支持支持
虚拟内存不支持支持

Memcached简介

Memcached 是一个高性能、分布式的内存对象缓存系统。

  1. 定义:
  • 一个开源的、高性能的分布式内存缓存系统。
  • 用于动态 Web 应用程序,减少数据库负载。
  1. 主要特点:
  • 简单的键值存储。
  • 内存存储,快速读写。
  • 分布式架构,可横向扩展。
  • 支持多种编程语言。
  1. 工作原理:
  • 将数据存储在内存中。
  • 使用 LRU(最近最少使用)算法管理缓存。
  • 支持 get、set、delete 等基本操作。
  1. 用途:
  • 缓存数据库查询结果。
  • 存储会话数据。
  • 缓存 API 调用结果。
  • 减少应用程序对数据库的依赖。
  1. 优点:
  • 极快的读写速度。
  • 易于扩展。
  • 减轻数据库负载。
  • 提高应用程序响应速度。
  1. 局限性:
  • 不持久化存储。
  • 支持数据结构操作。
  • 没有内置的安全机制。

redis典型应用场景

  • Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享。
  • 缓存:数据查询、电商网站商品信息、新闻内容。
  • 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景。
  • 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等。
  • 消息队列:ELK的日志缓存、部分业务的订阅发布系统。
  • 地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能。
    在这里插入图片描述

安装redis

前最新release版本redis 源码包:http://download.redis.io/releases/
yum -y install gcc jemalloc-devel systemd-devel
安装依赖包,支持systemd
make USE_SYSTEMD=yes PREFIX=/apps/redis install
指定安装目录
echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
配置变量,并且写在profile.d下,开机自启。

mkdir /apps/redis/{etc,log,data,run}
创建配置文件、日志、数据等目录

cp redis.conf /apps/redis/etc/
源码包中自带配置文件

前台启动redis
1.指定配置文件

redis-server /apps/redis/etc/redis.conf
指定配置文件启动。

在这里插入图片描述
2.systemd 启动
需要准备用户

useradd -r -s /sbin/nologin redis
增加用户
chown -R redis.redis /apps/redis/
设置目录权限

准备service文件

[Unit]
Description=Redis persistent key-value database
After=network.target


[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
#Type=notify 如果支持systemd可以启用此行,表示该服务会在启动完成后主动通知systemd
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755


[Install]
WantedBy=multi-user.target

处理redis的warning信息

在这里插入图片描述

  1. TCP backlog
    backlog参数控制的是三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列。
vim /etc/sysctl.conf
net.core.somaxconn = 1024

在这里插入图片描述

  1. vm.overcommit_memory
vim /etc/sysctl.conf
vm.overcommit_memory = 1

0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1、表示内核允许分配所有的物理内存,而不管当前的内存状态如何
2、表示内核允许分配超过所有物理内存和交换空间总和的内存

  1. transparent hugepage
    您在内核中启用了透明大页面(THP,不同于一般内存页的4k为2M)支持。 这将在Redis中造成延迟和内存使用问题。 要解决此问题,请以root 用户身份运行命令“echo never> /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local中,以便在重启后保留设置。禁用THP后,必须重新启动Redis。
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local

连接到Redis

客户端连接redis
redis-cli
-p 端口
-h 主机
-a 密码

默认无密码连接

在这里插入图片描述
图形化界面连接

安装软件redis-desktop-manager-0.8.8.384
可自行上网搜索。
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值