Redis(高级)

本文详细介绍了Redis的服务启动、客户端连接、配置文件设置,重点关注了持久化机制,包括RDB和AOF的区别及配置,以及AOF的重写。此外,还讨论了Redis的事务处理、锁的实现、数据删除策略(定时删除、惰性删除、定期删除)以及逐出算法。最后,提到了Redis的高级数据类型Bitmaps、HyperLogLog和GEO的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

基础知识

Redis服务启动

客户端连接

redis服务配置文件基本配置

持久化

RDB

save相关的配置

自动存储save 配置:

save、bgsave对比

AOF

AOF写数据的三种策略:将命令同步到aof的频率

配置文件

AOF重写

 RDB、AOF的区别

Redis 事务

事务的基本操作

 锁

监视锁

分布式锁

Redis 删除策略

数据删除策略

定时删除

惰性删除

定期删除

逐出算法(8种)

 Redis核心配置(redis.conf)

服务端设定

日志配置

客户端配置

多服务器快捷配置

Redis高级数据类型

Bitmaps

HyperLogLog

GEO


基础知识

基于Center OS7安装Redis

  1. 下载安装包:wget http://download.redis.io/releases/redis-5.0.5.tar.gz
  2. 解压:tar –xvf 文件名.tar.gz
  3. 安装:进入redis-5.0.5文件夹 make install

环境配置

  • 创建配置文件管理目录   mkdir conf   
  •  创建数据文件管理目录   mkdir data(存放日志)

Redis服务启动

  • redis-server  默认启动
  • redis-server –-port 6379  指定端口号启动
  • redis-server conf/redis-6379.conf 指定配置文件启动

客户端连接

  • redis-cli 默认连接
  • redis-cli –port 6379  指定端口号连接

redis服务配置文件基本配置

  • daemonize yes:以守护进程方式启动,使用本启动方式,redis将以服务的形式存在,日志将不再打印到命令窗口中(在后台启动,可以同时打开多个服务器)
  • port 6***:指定端口号
  • dir “/自定义目录/redis/data“:设定当前服务文件保存位置,
  • logfile "6***.log“:设定日志文件名称

配置文件示例

目录结构

持久化

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

持久化过程分为两种:

  • 将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据(RDB)
  • 将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程(AOF)

RDB

save:手动执行一次保存操作

save相关的配置

  • dbfilename dump-端口号.rdb    设置本地数据库文件名
  • rdbcompression yes    设置存储至本地数据库时压缩数据
  • rdbchecksum yes    设置进行RDB文件格式校验

save指令执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞

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

bgsave相关配置:在save配置的基础上添加

  • stop-writes-on-bgsave-error yes  后台存储过程中如果出现错误现象,停止保存操作

bgsave原理:不会阻塞主进程,它会生成一个新的子进程来完成保存操作

配置文件

自动存储save 配置:

save second changes   second:监控时间范围   changes:监控key的变化量

例如:save 900 12  在900秒内 有12次修改数据 就会进行保存

做演示可以设置为:save 10 2

save、bgsave对比

方式

savebgsave
读写同步异步
阻塞客户端指令
额外内存消耗
启动新进程

补充:关闭服务器时会自动执行bgsave  (shutdown命令)

AOF

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

AOF写数据的过程

写数据(set)->服务器开启子进程->将指令放入aof缓存区内->满足条件,将命令同步到aof文件中

AOF写数据的三种策略:将命令同步到aof的频率

  • always(每次)
  • everysec(每秒)(默认)
  • no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控

配置文件

  • appendonly yes  开启AOF持久化
  • appendfsync always|everysec|no  设置AOF写数据策略
  • appendfilename appendonly-端口号.aof   设置AOF持久化文件名

配置文件示例

AOF重写

作用

  • 降低磁盘占用量,提高磁盘利用率
  • 提高持久化效率,降低持久化写时间,提高IO性能
  • 降低数据恢复用时,提高数据恢复效率

例如:set a 1  set  a 8  set a 9 =>set a 9  (删除掉无效指令,同一数据的多条写命令将合并为一条命令)

bgrewriteaof  手动重写(在客户端执行)

自动配置(自行设置参数):

  • auto-aof-rewrite-min-size size
  • auto-aof-rewrite-percentage percent

 自动重写触发比对参数( 运行指令info Persistence获取具体信息 )

  • aof_current_size
  • aof_base_size

触发条件

 AOF重写流程(注意有一个aof重写缓冲区)

 RDB、AOF的区别

持久化方式RDBAOF
占用存储空间小(数据级)大(指令级)
存储速度
恢复速度
数据安全性会丢失数据依据策略决定
资源消耗重量级轻量级
启动优先级

注:

  • 对数据非常敏感,建议使用默认的AOF持久化方案
  • 数据呈现阶段有效性,建议使用RDB持久化方案

Redis 事务

在Redis执行指令过程中,多条连续执行的指令被干扰,打断,插队;所以我们要使用事务

例子:

客户端1:①set a 11 ③get a    客户端2:②set a 12

序号表示执行顺序,客户端1想要得到“11”,但是得到了“12”

事务的基本操作

  • 开启事务:multi
  • 执行事务:exec
  • 取消事务:discard   终止当前事务的定义,发生在multi之后,exec之前

加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行

注意事项:

  • 在事务过程中,命令格式输入错误,整个事务会直接销毁
  • 在事务过程中,命令执行出现错误,运行错误的命令不会被执行,它会返回提示信息
  • redis不会事务回滚

事务的工作流程(5种指令)

 锁

监视锁

多个人监视同一个属性,这个属性一旦发生改变就会取消其事务

watch key1 [key2……]:对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行

unwatch:取消监视

在exec之前,其他客户端已经将name修改了

分布式锁

避免多个用户同时操作一个数据

思想:先上锁,再执行指令

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

del lock-key:释放锁

为锁添加时间限定 ,到时间自动放锁

  • expire lock-key second
  • pexpire lock-key milliseconds

 

10s后自动放锁 

Redis 删除策略

redis的数据状态

  • XX :具有时效性的数据
  • -1 :永久有效的数据
  • -2 :已经过期的数据 或 被删除的数据 或 未定义的数据

注意:过期数据并没有被立即删除

数据删除策略

定时删除

创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作。

特点:节约内存、占用CPU    用处理器性能换取存储空间(时间换空间)

​ 

expires中 存储的是数据的地址值和对应的时效时间

惰性删除

数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据;发现已过期,删除,返回不存在

特点:节约CPU性能、内存的压力很大,出现长期占用内存的数据;用存储空间换取处理器性能(空间换取时间)

定期删除

定时删除、惰性删除的折中方案

步骤:

Redis启动服务器初始化时,读取配置server.hz的值,默认为10

每秒钟执行server.hz次serverCron()会调用databasesCron方法->databasesCron()轮询每一个数据库并调用其-activeExpireCycle方法>activeExpireCycle()对数据库中的数据进行随机检测

特点:内存定期随机清理、每秒花费固定的CPU资源维护内存(随机抽查、重点抽查)

activeExpireCycle()方法:

  • 在检测中,删除数据个>随机抽取数据总个数/4,继续循环检测
  • 在检测中,删除数据个<=随机抽取数据总个数/4,进入到下一个数据库进行检测

 注意事项:redis使用的是惰性删除和定期删除

逐出算法(8种)

当内存不足时,写入数据 的过程中会清除一些数据。清理数据的策略称为逐出算法。

检测易失数据(可能会过期的数据集server.db[i].expires)

  • volatile-lru:挑选最近最少使用的数据淘汰(最早使用的
  • volatile-lfu:挑选最近使用次数最少的数据淘
  • volatile-ttl:挑选将要过期的数据淘汰
  • volatile-random:任意选择数据淘汰

检测全库数据(所有数据集server.db[i].dict )

  •  allkeys-lru:挑选最近最少使用的数据淘汰
  •  allkeys-lfu:挑选最近使用次数最少的数据淘汰
  •  allkeys-random:任意选择数据淘汰

放弃数据驱逐

  • no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)

影响数据逐出的相关配置

  • 最大可使用内存:maxmemory  占用物理内存的比例通常设置在50%以上
  • 每次选取待删除数据的个数:maxmemory-samples
  • 删除策略:maxmemory-policy

 Redis核心配置(redis.conf)

服务端设定

  • daemonize yes|no  :设置服务器以守护进程的方式运行
  • bind 127.0.0.1   :绑定主机地址
  • port 6379    :设置服务器端口号
  • databases 16    :设置数据库数量

日志配置

  • loglevel debug|verbose|notice|warning  :设置服务器以指定日志记录级别 (开发时期配置为verbose即可)
  • logfile 端口号.log   :日志记录文件名

客户端配置

  • maxclients 0   :设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
  • timeout 300   :客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0

多服务器快捷配置

  • include /path/server-端口号.conf   :导入并加载指定配置文件信息

Redis高级数据类型

Bitmaps

基于string 存放bit值(存放数据的状态),存放的的信息 只有0或1,应用场景:存放大家的性别、存放大家是否为党员

  • getbit key offset:获取指定key对应偏移量上的bit值
  • setbit key offset value:设置指定key对应偏移量上的bit值,value只能是1或0
  • bitop op destKey key1 [key2...]:对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中

                op: and-交  or-并   not-非   xor-异或

  • bitcount key [start end]:统计指定key中1的数量

应用场景:

  • 统计每天某部电影是否被点播:查看哪部电影的状态为1
  • 统计每天有多少部电影被点播:计算一日内状态为1的个数
  • 统计每年有多少部电影被点播:进行或运算,再统计状态为1的个数
  • 统计年度没被点播的电影:进行或运算他,再统计状态为0的个数

描述:

        2020/01/01 有2部电影被点播(0,7)

        2020/01/02 有3部电影被点播 (0,7,8)

        两天被点播的电影个数是3

HyperLogLog

它是用来做基数计算的,该计算方法为估算,消耗空间极小,每一个hyperloglog key占用了12k的内存用于标记基数,性能优于bitmaps

补充知识

        {1,1,1,2,2} 基数集:{1,2}  基数:2

常用方法:

  • pfadd key element [element ...]:添加数据
  • pfcount key [key ...]:统计数据
  • pfmerge destkey sourcekey [sourcekey...]:合并数据

应用场景:与BitMapps相同,直接存放电影的id即可

描述:

2008/08/08 被点播了3部电影(1,2,7)

2008/08/09 被点播了3部电影(1,78,74)

两日共被点播电影的个数为5 

GEO

存放坐标,并进行一系列运算

  • geoadd key longitude latitude member [longitude latitude member ...]:添加坐标点
  • geopos key member [member ...]:获取坐标点
  • geodist key member1 member2 [unit]:计算坐标点距离
  • georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]:根据坐标查找指定范围的点
  • georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]:根据点查找指定范围的点
  • geohash key member [member ...]:获取哈希值

 

分析描述:

abcd 构成了一个正方形 e中点,f,h分别位于e的正上方和正下方 eh=111 ea=158

后面是使用指令查找指定范围内的点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值