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后,发起了大量对同一数据的数据库访问,导致数据库服务器造成压力。