什么是持久化?
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。
为什么要进行持久化?
防止数据的意外丢失,确保数据安全性
持久化过程保存什么?
save指令:
命令:
save
作用:手动执行一次保存操作
save指令相关配置:
dbfilename dump.rdb
dump.rdb
dump-端口号.rdb
dir
.rdb
文件的路径data
rdbcompression yes
rdbchecksum yes
save指令工作原理:
注意:save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞,线上环境不建议使用。
bgsave指令:
命令:
bgsave
作用:手动启动后台保存操作,但不是立即执行
bgsave指令工作原理:
注意: bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用,推荐使用bgsave
bgsave指令相关配置:
dbfilename dump.rdb
dir
rdbcompression yes
rdbchecksum yes
stop-writes-on-bgsave-error yes
RDB启动方式——save配置:
配置:
save second changes
作用:满足限定时间范围内key的变化数量达到指定数量即进行持久化
参数:
位置:在conf文件中进行配置
RDB启动方式——save配置原理:
注意:
RDB特殊启动形式:
全量复制:在后面的主从复制在详细讲解
服务器运行过程中重启:
debug reload
关闭服务器时指定保存数据:
shutdown save
默认情况下执行shutdown命令时,自动执行 bgsave(如果没有开启AOF持久化功能)
优点:
缺点:
AOF概念:
AOF写数据过程:
AOF功能开启:
配置
appendonly yes|no
作用:是否开启AOF持久化功能,默认为不开启状态
配置
appendfsync always|everysec|no
作用:AOF写数据策略
AOF相关配置:
配置
appendfilename filename
作用:AOF持久化文件名,默认文件名未appendonly.aof
,建议配置为appendonly-端口号.aof
配置
dir
作用:AOF持久化文件保存路径,与RDB持久化文件保持一致即可
AOF重写:随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录。
AOF重写作用:
AOF重写规则:
AOF重写方式:
手动重写
bgrewriteaof
自动重写
//触发重写的最小大小 auto-aof-rewrite-min-size size //触发重写须达到的最小百分比 auto-aof-rewrite-percentage percentage
RDB与AOF的选择之惑:
redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰
一个队列中,一次性、顺序性、排他性的执行一系列命令
开启事务:
multi
作用:设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中
取消事务:
discard
作用:终止当前事务的定义,发生在multi之后,exec之前
执行事务:
exec
作用:设定事务的结束位置,同时执行事务。与multi成对出现,成对使用
事务操作的基本流程:
定义事务的过程中,命令格式输入错误怎么办?
定义事务的过程中,命令执行出现错误怎么办?
注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚。
基于特定条件的事务执行——锁:
对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1, key2....Copy
取消对所有key的监视
unwatch
基于特定条件的事务执行——分布式锁:
使用 setnx 设置一个公共锁
//上锁 setnx lock-key value //释放锁 del lock-keyCopy
利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功
注意:上述解决方案是一种设计概念,依赖规范保障,具有风险性
基于特定条件的事务执行——分布式锁改良:
使用 expire 为锁key添加时间限定,到时不释放,放弃锁
expire lock-key seconds pexpire lock-key millisecondsCopy
由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态
时效性数据的存储结构:
Redis中的数据,在expire中以哈希的方式保存在其中。其value是数据在内存中的地址,filed是对应的生命周期
数据删除策略的目标:
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露
定时删除:
惰性删除:
定期删除:
删除策略对比:
当新数据进入redis时,如果内存不足怎么办 ?
影响数据逐出的相关配置:
最大可使用内存
maxmemoryCopy
占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上。
每次选取待删除数据的个数
maxmemory-samplesCopy
选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据
删除策略
maxmemory-policyCopy
达到最大内存后的,对被挑选出来的数据进行删除的策略
影响数据逐出的相关配置:
LRU:最长时间没被使用的数据
LFU:一段时间内使用次数最少的数据
数据逐出策略配置依据:
使用INFO命令输出监控信息,查询缓存 hit 和 miss 的次数,根据业务需求调优Redis配置
基础操作:
获取指定key对应偏移量上的bit值:
getbit key offset
设置指定key对应偏移量上的bit值,value只能是1或0:
setbit key offset value
扩展操作:
对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
bitop op destKey key1 [key2...]Copy
统计指定key中1的数量
bitcount key [start end]
基数:
基本操作:
添加数据
pfadd key element1, element2...
统计数据
pfcount key1 key2....
合并数据
pfmerge destkey sourcekey [sourcekey...]
相关说明:
基本操作:
添加坐标点
geoadd key longitude latitude member [longitude latitude member ...] georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]Copy
获取坐标点
geopos key member [member ...] georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]Copy
计算坐标点距离
geodist key member1 member2 [unit] geohash key member [member ...]
最后喜欢的小伙伴,记得三联哦!