Redis基础学习记录

Redis

1.Redis的介绍

2.在linux上操作redis的一些记录

2.1 安装Redis
  • 下载安装包
    wget http://download.redis.io/releases/redis-4.0.0.tar.gz(版本随意)
  • 解压
    tar -vxf 文件名.tar.gz
  • 编译
    make
  • 安装
    make install
cat makefile               //查看安装的设定
make install          //安装
2.2 启动Redis
##进入Redis的目录下的src
redis-server         //启动服务端
## 另开一个窗口进入Redis的目录下的src
redis-cli           //启动客户端

ctrl+c 强制退出redis服务

2.3 多端口启动Redis

进入Redis的src目录下

redis-server --port 6380   //在6380端口启动redis服务

redis-cli -p 6380        //在6380端口启动redis客户端
2.4 使用配置文件的方式多端口启动redis
cat redis.conf | grep -v "#" |grep -v "^$" >redis-6379.conf

grep -v "#"    //表示去除注释
grep -v "^$"   //表示去除空格
>redis-6379.conf  //表示创建新的文件redis-6379.conf

配置文件的修改

port 6379                 //配置启动的端口号
daemonize yes             //以守护进程方式启动,使用本启动方式,redis将以服务的形式存在,日志不在打印到命令窗口中
logfile "6379.log"        //日志文件
dir /redis-4.0.0/data     //日志文件生成的位置

使用配置文件的方式启动

redis-server redis-6379.conf
2.5 配置文件启动目录管理

可以将所的配置文件放置于 conf 这个目录下然后通过命令启动redis服务。(根据不同的配置文件,启动不同的redis服务)

redis-server conf/redis-6379.conf
redis-server conf/redis-6380.conf

3.Redis持久化

3.1持久化简介

利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。

3.2 RDB方式
save           //手动执行一次保存操作

1.save指令的相关配置:

  • dbfilename :通常设置为dump-端口号.rdb(例:dump-6379.rdb)
  • rdbcompression yes:通常默认为开启状态,(设置存储本地数据库时是否压缩,采用LZF压缩)
  • rdbchecksum yes:通常默认为开启状态。(设置是否进行RDB文件格式校验,读写过程均进行。)

2.数据量过大,单线程执行方式造成效率太低问题解决方式: bgsave 指令

bgsave

作用: 手动启动后台保存操作,但是不是立即执行。

Redis内部所有涉及到RDB操作的都建议采用bgsave的方式。

stop-writes-on-bgsave-error  yes

说明:后台存储过程中如果出现错误现象,是否停止保存操作。
经验: 通常默认为开启状态。

3.Redis的自动保存指令:

  save second changes

//second : 监控时间范围
//changes: 监控Key的变化量

作用:满足限定时间范围内可以的变化数量达到指定数量即进行持久化。

具体操作:在redis的conf文件中加入

save 90 10
##  表示的是在90秒内,key发生了10次改变就持久化

一个对比图:
在这里插入图片描述
4.RDB的优缺点:
优点:

  • RDB是一个紧凑压缩的二进制文件,存储效率较高
  • RDB内部存储的是redis在某个时间点的数据快照,适合数据备份,全量复制等
  • RDB回复数据的速度比AOF快很多
  • 应用:服务器中没X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。

缺点:

  • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能丢失数据。
  • bgsave指令每次运行都要执行fork操作创建子进程,会牺牲性能
3.3 AOF方式

1.概念:

  • AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF中的命令达到恢复数据的目的。与RDB相比可以简单描述为记录数据的产生过程。
  • AOF主要作用是解决了数据持久化实时性

2.AOF写数据三种策略:

  • always(每次)
    每次写入操作均同步到AOF文件中,数据零失误,性能较低
  • everysec(每秒)
    每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高。(默认就是此种配置
  • no(系统控制)
    有操作系统控制同步周期,整体过程不可控

在这里插入图片描述
3.AOF重写:解决AOF文件过大的问题

  • 手动重写方式:
bgrewriteaof
  • 自动重写方式:
    在这里插入图片描述
4. AOF与RDB的区别

在这里插入图片描述

4. 事务

4.1 事务简介

一个队列中,一次性、顺序性、排他性的执行一系列命令。

4.2事务的基本操作
  • 开启事务
multi

设定事务的开启位置,此指令执行之后,后续的所有指令均加入到事务中。

  • 执行事务
exec

设定事务的结束位置,同时执行事务。

  • 取消事务
discard

终止当前事务的定义,发生在multi之后,exec之前。

4.3 事务的操作流程

事务操作流程

4.4 锁

1.基于特定条件的事务执行

  • 对key添加监视锁,在执行exec前如果key发生了变化,终止事务的执行。
watch key1 [key2.....]
  • 取消对所有key的监视
unwatch

watch的实际应用案例:不同的人对同一个操作都有权限的时候,此时用watch监视具体指的变化,就能达到锁的目的。(如双11对中不同店员对已售馨商品追加补货的操作)

2.超卖问题的解决

  • 使用setnx设置一个公共锁
setnx lock-key value

利用setnx命令的返回值特征,有值则返回失败,无值则返回设置成功。

3.操作完毕后通过del操作释放锁

set num 10     
setnx lock-num true   //给num这个key加锁,后面的值随意
incrby num -1        // 对num进行操作
del lock-num         //释放对num 的锁

实际应用:redis应用基于分布式锁对应的场景控制
4.死锁问题及解决方式

  • 由于锁操作是用户控制加锁解锁,必定会存在加锁后未解锁的风险
  • 需要解锁操作不能仅依赖于用户控制,系统级别要给出对应的处理方案
    • 使用expire为锁key添加时间限定,到时不释放,放弃锁
    expire lock-key second
    pexpire lock-key milliseconds
    

锁时间的设置

5. 删除策略

5.1 Redis中的数据特征
  • Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态。
    • XX:具有时效性的数据
    • -1:永久有效的数据
    • -2:已经过期的数据 或 被删除的数据 或 未定义的数据。
5.2 数据删除策略

时效性数据的存储结构
数据删除策略的目标:
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成redis的性能下滑,甚至是引发服务器的宕机或内存泄露

5.2.1 定时删除
  • 创建一个定时器,当key设置有过期时间,且时间到达时,由定时器任务立即执行删除操作
  • 优点:节约内存,快速释放掉不必要的内存占用
  • 缺点:CPU压力很大,无论CPU此时负载多高,均会占用CPU,会影响redis的服务器响应时间和吞吐指令
  • 总结:用处理器性能换取存储空间(拿时间换空间)
5.2.2 惰性删除
  • 数据到达过期时间,不做处理。等下次访问的时候
    • 如果未过期,返回数据
    • 发现过期了,删除,返回不存在
  • 优点:节约CPU性能,
  • 缺点:内存压力很大,出现长期占用内存的数据
  • 总结:用存储空间换取处理器性能(拿时间换空间)
5.2.3定期删除

定期删除

  • 周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。
  • CPU性能占用设置有峰值,检测频度可自定义设置
  • 内存压力不是很大,数据会被持续的清理
5.3 逐出算法
  • Redis使用内存存储数据时,在执行每一个命令前,会调用freeMemoryIsNeeded()算法检测内存是否充足。如果不足则redis会临时删除一些数据。清理数据的策略称为逐出算法。
  • 最大可使用内存
maxmemory

占用物理内存的比例,生产环境下一般设置在50%以上。

  • 每次待选取删除数据的个数
maxmemmory-samples

选取数据时一般是随机选取待检测的数据。

  • 删除策略
maxmemory-policy

到达最大内存后,删除被选出来的数据。
在这里插入图片描述

6. 服务器基本配置

6.1 服务器端设定
  • 设置服务器以守护进程的方式进行
daemonize  yes|no
  • 绑定主机地址
bind 127.0.0.1
  • 设置服务器端口号
port  6379
  • 设置数据库数量
databases  16
6.2日志配置
  • 设置服务器以指定日志记录级别
loglevel   debug|verbose|notice|warning
  • 日志记录文件名
logfile  端口号.log

注意:日志级别开发时设置为verbose即可,生产环境配置为notice,简化日志输出量。

6.3 客户端配置
  • 设置同一时间最大客户端连接数,默认无限制。当连接达到上限时,redis会关闭新的连接。
maxclients  0
  • 客户端闲置等待最大时长,达到最大值后关闭连接。
timeout 300
6.4 多服务器快捷配置
  • 导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件。
include  /path/server-端口号.conf

7. 高级数据类型

7.1 Bitmaps类型的基本操作
  • 获取指定key对应偏移量上的bit值
getbit  key  offset
  • 设置指定key对应偏移量上的bit值,value只能是1或者0
setbit  key  offset value

在这里插入图片描述

7.2 HyperLogLog

基数

  • 基数是数据集去重后元素个数
  • HyperLogLog使用来最基数统计的,运用了LogLog算法
    在这里插入图片描述
  • 用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
  • 核心是基数估算算法,最终数值存在一定误差。
7.3 GEO类型的基本操作

在这里插入图片描述

8.redis集群

8.1主从复制

主从复制即将master中的数据即时、有效的复制到slave中。一个master可以有多个slave,一个slave只有一个master

  • master:
    • 写数据
    • 执行写操作,将出现变化的数据自动同步到slave
    • 读数据(可忽略)
  • slave:
    • 读数据
      在这里插入图片描述
8.2 主从复制的作用
  • 读写分离:master写、slave读,提高服务器的读写负载能力
  • 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,根据需求的变化,改变slave的数量 ,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
  • 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复。
  • 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式。
  • 高可用基石:基于主从复制,构建哨兵模式与集群,实现redis的高可用方案。
8.3主从复制的工作流程
  • 主从复制的3个阶段
    • 建立连接阶段
      在这里插入图片描述
      连接的几的方式:
      在这里插入图片描述

    • 数据同步阶段

数据同步阶段

数据同步时可能存在的一些问题:
master:
在这里插入图片描述

slave:
在这里插入图片描述

- 命令传播阶段

在这里插入图片描述

复制缓冲区:

  • 又名积压缓冲区,是一个先进先出(FIFO)的队列,用于存储服务器执行过的命令。
    • 组成
      • 偏移量
      • 字节值
    • 工作原理
      • 通过offset区分不同的slave当前数据传播的差异。

授权访问
在这里插入图片描述

在这里插入图片描述
心跳机制:
在这里插入图片描述

8.4 哨兵模式

哨兵:
哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障是通过投票机制选择新的master,并将所有的slave连接到新的master。

在这里插入图片描述

8.4.1配置哨兵
  • 配置一拖二的主从结构
  • 配置三个哨兵(配置相同,端口不同)
  • 启动哨兵
redis-sentinel  sentinel-端口号.conf

工作原理
在这里插入图片描述

8.5集群

集群作用:

  • 分散单台服务器的访问压力,实现负载均衡
  • 分散单台服务器的存储压力,实现可扩展性
  • 降低单台服务器宕机带来的业务灾难
8.5.1 Redis集群结构设计

数据存储设计

  • 通过算法设计,计算出key应该保存的位置
  • 将所有的存储空间切割成16384份,每台主机保存一部分,每份代表一个存储空间,不是一个key的保存空间。
  • 将key按照计算出的结果放到对应的存储空间
    在这里插入图片描述
    Cluster配置
    在这里插入图片描述

9企业级解决方案

9.1缓存预热

在这里插入图片描述
**总结:**缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免用户在请求时,先查数据库再缓存。

9.2缓存雪崩

一些解决思路:
在这里插入图片描述
在这里插入图片描述

9.3缓存击穿

缓存击穿就是单个高热数据过期的瞬间,数据访问量较大,为命中redis后,发起了大量对同一数据的数据库访问,导致数据库服务器造成压力。
在这里插入图片描述
在这里插入图片描述

9.4缓存穿透
9.5性能指标监控

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值