Redis基础篇

介绍的内容:

  1. 缓存相关概念与背景
  2. Redis介绍
  3. Redis部署与使用
  4. Redis高可用与集群

  

  1. 缓存概念

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

    1. 系统缓存

buffer:写缓冲,一般用于写操作,可以将数据写入内存再写入磁盘中。用于解 决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到 内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间在写入磁盘,所以服务器突然断电 会丢失内存中的部分数据。

 cache:读缓存,一般用于读操作,CPU读文件从内存读取。如果内存没有就先从硬盘读到内存再读到 CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。

cache的保存位置

客户端:浏览器

内存:本地服务器、远程服务器

硬盘:本机硬盘、远程服务器硬盘

cache的特性

自动过期:给缓存数据加上有效时间,超出时间后自动过期删除

过期时间:强制过期,源网站更新图片后不会更新,需要强制使图片缓存过期命中率,也即缓存的读取命中率

    1. 用户层缓存

  DNS缓存

  默认为60秒,即60秒之内在访问同一个域名就不在进行DNS解析

浏览器缓存过期机制

最后修改时间:系统调用文件的时候会获取文件的最后修改时间,如果没有发生变化就返回给浏览器304的状态码,表示没有发生变化,然后浏览器就使用的本地的缓存展示资源。

如果服务端返回最后修改时间没有发生过变化,则直接使用浏览器的本地缓存,状态码就是304

    1. CDN缓存

 1.3.1、CDN概念

  内容分发网络(Content Delivery Network),通过将服务内容分发至全网加速节点,利用全球调度系统使用户能 够就近获取,有效降低访问延迟,提升服务可用性。

第一降低机房的使用带宽,因为很多资源通过CDN就直接返回用户了;

第二解决不同运营商之间的互联,因为可以让联通的网络访问联通让电信的网络访问电信,起到加速用户访问的目的;

第三:解决用户访问的地域问题,就近返回用户资源;

百度CDN:内容分发网络CDN_CDN加速_CDN内容加速_全球CDN加速-百度智能云

阿里CDN:https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n 腾讯CDN:CDN 内容分发网络 _CDN内容加速_CDN加速 - 腾讯云

1.3.2、用户请求CDN流程

提前对静态内容进行预缓存,避免大量的请求回源,导致主站网络带宽被打满而导致数据无法更新,另外CDN可以 将数据根据访问的热度不同而进行不同级别的缓存,例如访问量最高的资源访问CDN 边缘节点的内存,其次的放 在SSD或者SATA,再其次的放在云存储,这样兼顾了速度与成本。

尽量减少IO设备的读写,把最常用的数据放在内存中作为缓存是所有程序的通识。像memcached 和redis这样的高速缓存系统近几年的异军突起,就是为了解决这个问题。

1.3.3、CDN的优点

 能够提前对静态内容预缓存,避免大量请求回源。

  调度准确-将用户调度到最近的边缘节点

性能优化-CDN 专门用于缓存响应速度快

安全相关-抵御攻击

节省带宽:由于用户请求由边缘节点响应,因此大幅降低到源站带宽

    1. 应用层缓存

Nginx、PHP等web服务可以设置应用缓存以加速响应用户请求,另外有些解释性语言比如PHP/Python/Java不能 直接运行,需要先编译成字节码,但字节码需要解释器解释为机器码之后才能执行,因此字节码也是一种缓存,有 时候会出现程序代码上线后字节码没有更新的现象。

    1. 其他层面缓存

1.5.1、CPU缓存

CPU缓存(L1的数据缓存和L1的指令缓存)、二级缓存、三级缓存

1.5.2、cookie与session

cookie

(1)访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤,比如加密后的账 户名密码等信息;

(2)、是服务器在客户端浏览器上存储的小段文本并随每一个请求发送至同一个服务器,是一种实现客户端保持状态的方案;

session

(1)、称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当浏览器请求http地址时,可以基于之前的session实现会话保持、session共享等;

1.5.3、session与cookie的区别

(1)、cookie以文本文件格式存储在浏览器中,而session存储在服务端;

(2)、cookie的存储限制了数据量,只允许4KB,而session是无限制的;

(3)、cookie包含在每一个客户端请求报文中,因此容易被人捕获;

(4)、cookie和session都可以设置过期时间;

2、Redis背景介绍

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

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

2.1.1、Redis典型应用场景

session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享

消息队列:ELK的日志缓存、部分业务的订阅发布系统

计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景

缓存:数据库查询缓存、电商网站商品信息、新闻内容

微博/微信社交场合:共同好友、点赞评论等

支持数据的持久化:可以将内存中的数据保持在磁盘中,重启redis服务或者服务器之后可以从备份文件中恢复数 据到内存继续使用。

2.1.2、redis对比memcached

  支持更多的数据类型:支持string(字符串)、hash(哈希数据)、list(列表)、set(集合)、zet(有序集合)

支持数据的备份:可以实现类似于数据的master-slave模式的数据备份,另外也支持使用快照+AOF

支持更大的value数据:memcache单个key value最大只支持1MB,而redis最大支持512MB。

Redis 是单线程,而memcache是多线程,所以单机情况下没有memcache并发高,但redis 支持分布式集群以实现 更高的并发,单Redis实例可以实现数万并发。

支持集群横向扩展:基于redis cluster的横向扩展,可以实现分布式集群,大幅提升性能和数据安全性。 都是基于C语言开发。

3、Redis部署与使用

Redis官网:https://redis.io/

安装两种方式:二进制编译安装、yum安装

编译安装redis

下载当前最新release版本redis 源码包:Index of /releases/

yum方式安装

yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

yum --enablerepo=remi install redis

……….

大页内存(2MB)

大内存页”有助于 Linux 系统进行虚拟内存管理。 顾名思义,除了标准的 4KB 大小的页面外,它们还能帮助管理内存中的巨大的页面。 使用“大内存页”,你最大可以定义 1GB 的页面大小。 在系统启动期间,你能用“大内存页”为应用程序预留一部分内存。

3.1、redis配置文件

 bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听IP

 protected-mode yes #redis3.2 之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访问 127.0.0.1:6379,远程访问将提示警告信息并拒绝远程访问

port 6379 #监听端口

tcp-backlog 511 #三次握手的时候server端收到client ack确认号之后的队列值。

timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时。

tcp-keepalive 300 #tcp 会话保持时间

daemonize n #认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes,当redis作 为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面

supervised no #和操作系统相关参数,可以设置通过upstart和systemd管理Redis守护进程,centos 7以后都使用 system

pidfile /var/run/redis_6379.pid #pid文件路径

loglevel notice #日志级别

logfile "" #日志路径

databases 16 #设置db 库数量,默认16个库,0-15

always-show-logo yes #在启动redis 时是否显示log

save 900 1 #在900秒内有一个键内容发生更改就出就快照机制

save 300 10

save 60 10000

stop-writes-on-bgsave-error no #快照出错时是否禁止redis 写入操

rdbcompression yes #持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之

rdbchecksum yes #是否开启RC64校验,默认是开启

dbfilename dump.rdb #快照文件名

dir ./ #快照文件保存路径

replica-serve-stale-data yes #当从库同主库失去连接或者复制正在进行,从机库有两种运行方式

(1)、当设置为yes(默认设置),从库会继续响应客户端的读请求。

  (2)、当设置为no,除去指定的命令之外的任何请求都会返回一个错误"SYNC with master in progress"。

  replica-read-only yes #是否设置从库只读

  repl-diskless-sync no #是否使用socket方式复制数据(无盘同步),新slave连接连接时候需要做数据的全量同步, redis server就要从内存dump出新的RDB文件,然后从master传到slave,有两种方式把RDB文件传输给客户端:

  (1)、基于硬盘(disk-backed):master创建一个新进程dump RDB,RDB完成之后由父进程(即主进程)传给 slaves。

  (2)、基于socket(diskless):master创建一个新进程直接dump RDB到slave的socket,不经过主进程,不经过硬盘。

参数设置依据不同的场景

  基于硬盘的话,RDB文件创建后,一旦创建完毕,可以同时服务更多的slave,但是基于socket的话, 新slave连接 到master之后得逐个同步数据。

  在较慢并且网络较快的时候,可以用diskless(yes),否则使用磁盘(no)

 repl-diskless-sync-delay 30 #diskless**复制的延迟时间**,设置0为关闭,在延迟时间内连接的新客户端,会一 起通过disk方式同步数据,但是一旦复制开始还没有结束之前,master节点不会再接收新slave的复制请求,直到 下一次同步开始。

repl-ping-slave-period 10 #slave根据master指定的时间进行周期性的PING 监

repl-timeout 60 #复制连接的超时时间,需要大于repl-ping-slave-period,否则会经常报超时

repl-disable-tcp-nodelay no #在socket模式下是否在slave套接字发送SYNC之后禁用 TCP_NODELAY,

如果选择“yesRedis将使用更少的TCP包和带宽来向slaves发送数据,但是这将使数据传输到slave上有延迟,Linux 内核的默认配置会达到40毫秒,如果你选择了 "no"** 数据传输到salve**的延迟将会减少但要使用更多的带

repl-backlog-size 512mb #复制缓冲区内存大小,只有在slave连接之后才分配内存。

repl-backlog-ttl 3600 #多次时间master没有slave连接,就清空backlog缓冲区。

replica-priority 100 #当master不可用,Sentinel会根据slave的优先级选举一个master,最低的优先级的slave, 当选master,而配置成0,永远不会被选举。

requirepass foobared #设置redis 连接密码

rename-command #重命名一些高危命令

maxclients 10000 #Redis最大连接客户端

maxmemory #最大内存,单位为bytes字节,8G内存的计算方式8(G)1024(MB)1024(KB)*1024(Kbyte),需要注意 的是slave的输出缓冲区是不计算在maxmemory内。

appendonly no #是否开启AOF日志记录,默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用 了,但是redis如果中途宕机,会导致可能有几分钟的数据丢失(取决于dumpd数据的间隔时间),根据save来策略 进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性,Redis会把每次写入的数据在 接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。

appendfilename "appendonly.aof" #AOF文件名

appendfsync everysec #aof持久化策略的配置,no表示不执行fsync,由操作系统保证数据同步到磁盘,always表示 每次写入都执行fsync,以保证数据同步到磁盘,everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。

no-appendfsync-on-rewrite no在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁 盘IO开支和请求阻塞时间。默认为no,表示"不暂缓",新的aof记录仍然会被立即同步,Linux的默认fsync策略是30 秒,如果为yes 可能丢失30秒数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐。

auto-aof-rewrite-percentage 100 # 当Aof log增长超过指定百分比例时,重写AOF文件, 设置为0表示不自动重 写Aof 日志,重写是为了使aof体积保持最小,但是还可以确保保存最完整的数据,

auto-aof-rewrite-min-size 64mb #触发aof rewrite的最小文件大小

aof-load-truncated yes #是否加载由于其他原因导致的末尾异常的AOF文件(主进程被kill/断电等)

aof-use-rdb-preamble no #redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重写产生的文 件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则 用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成 重写文件,也能够在出现问题时,快速地载入数据)。

lua-time-limit 5000 #lua脚本的最大执行时间,单位为毫秒

cluster-enabled yes #是否开启集群模式,默认是单机模式

cluster-config-file nodes-6379.conf #由node节点自动生成的集群配置文件

cluster-node-timeout 15000 #集群中node节点连接超时时间

cluster-replica-validity-factor 10 #在执行故障转移的时候可能有些节点和master断开一段时间数据比较旧,这些 节点就不适用于选举为master,超过这个时间的就不会被进行故障转移

cluster-migration-barrier 1 #集群迁移屏障,一个主节点拥有的至少正常工作的从节点,即如果主节点的slave节 点故障后会将多余的从节点分配到当前主节点成为其新的从节点。

cluster-require-full-coverage no #集群请求槽位全部覆盖,如果一个主库宕机且没有备库就会出现集群槽位不 全,那么yes情况下redis集群槽位验证不全就不再对外提供服务,而no则可以继续使用但是会出现查询数据查不到 的情况(因为有数据丢失)。

#Slow log 是 Redis 用来记录查询执行时间的日志系统,slow log 保存在内存里面,读写速度非常快,因此你可以 放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。

slowlog-log-slower-than 10000 #以微秒为单位的慢日志记录,为负数会禁用慢日志,为0会记录每个命令操作。 slowlog-max-len 128 #记录多少条慢日志保存在队列,超出后会删除最早的,以此滚动删除

不同的业务里,存放不同的DB,否则后面的key会覆盖,容易出问题

BGSAVE是通过后台保存,不影响应用访问

  1. RDB和AOF持久化的优缺点
  2. 配置文件
  3. 熟悉通过脚本读写数据(python)
  4. Redis的各种安装方式以及使用service启动(自启动)
  5. 备份脚本

使用bgsave执行快照——>mv 快照文件成2022-03-06_22_56.rdb

  只保留最近一天的rdb文件,超过时间就自动删除

注意点:

(1)、通过redis-cli里config set 修改参数,重启以后会失效,想要永久修改,必须加在配置文件中,和数据库中的alter操作不一样;

(2)、必须设置为开机自启enable

redis帮助命令网站

redis命令手册

keys * 执行之前,查看DB大小DBSIZE

                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值