redis学习3高级--黑马
持久化
RDB
save
bgsave
- 工作原理
bgsave->发送指令到redis,redis返回Background saving started给客户端,然后调用fork函数生成子进程,子进程创建rdb文件,成功后返回消息给redis,可通过日志文件查看 - bgsave命令时针对save阻塞问题的优化。Reids内部所有涉及到RDB操作都采用bgsave的方式,save命令可放弃使用
问题
可能会忘记执行保存命令,因为不知道数据产生了多少变化,不知道何时保存数据
解决
自动执行
save second changes
- 作用
满足限定时间范围内key的变化数量达到指定数量即进行持久化 - 参数
second:监控时间范围
changes:监控key的变化量 - 位置
conf配置文件
AOF
RDB存储的弊端
- 存储量大时效率低,io性能低
- 基于fork创建子进程,内存产生额外消耗
- 宕机带来的数据丢失的风险
AOF概念
- 以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的
- AOF主要解决了数据持久化的实时性
AOF写数据三种策略
- always
每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用 - everysec
每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高性能较高,在系统宕机的情况下丢失1秒的数据 - no
由操作系统控制每次同步到AOF文件的周期,整体过程不可控
AOF功能启动
- 配置
appendonly yes|no
appendfsync always|everysec|no
AOF重写
将同一个数据的若干条命令执行结果转化成最终结果数据对应的指令进行记录
- 作用
降低磁盘占用量,提高磁盘利用率
提高持久化效率,降低持久化写时间,提高io性能
降低数据恢复勇士,提高数据恢复效率 - 重写方式
手动重写:bgrewriteaof
自动重写:auto-aof-rewrite-min-size size/auto-aof-rewrite-percentage percentage
事务
一个队列中一次性、顺序性、排他性地执行一系列命令
基本操作
- 开启事务
multi:开启后,后续地所有指令均加入到事务中 - 执行事务
exec:设定事务地结束位置,同时执行事务,与multi成对出现,成对使用 - 取消事务
discard
注意事项
- 定义事务的过程出现语法错误,则所有命令不执行
- 定义事务的过程出现运行错误,则能够正确运行的命令会执行,错误的命令不执行
锁
监视锁
- 对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2...] - 取消对所有key的监视
unwatch
分布式锁
- 使用setnx设置公共锁
setnx lock-key value:有值则返回设置失败,不具有控制权,排队或等待,无值则返回设置成功,拥有控制权,进行下一步的具体业务操作 - 操作完毕通过del操作释放锁
业务场景
拿到锁后宕机问题,加锁后未解锁问题
- 使用exoire为锁key添加时间限定,到时不释放,放弃锁
expire lock-key second
expire lock-key milliseconds
删除策略
数据删除策略
定时删除
- 创建一个定时器,当key到达过期时间时由定时器任务立即执行对键的删除操作
惰性删除
- 数据到达过期时间时不做处理,等下次访问该数据时删除
定期删除
- 周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除额度
逐出算法
- redis使用内存存储数据时,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略成为逐出算法。住处数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。党对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息
相关配置
- 最大可使用内存
maxmemory:占用物理内存的比例,默认值为0,表示不限制,生产环境中根据需求设定,通常那个设置为50%以上 - 每次选取待删除数据的个数
maxmmory-samples:选取数据时并不会全库扫描导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据 - 删除策略
maxmemory-policy:达到最大内存后的,对被挑选出来的数据进行删除的策略 - 检验易失数据(可能会国企的数据集server.db[i].expires)
LRU:Least Recently Used
LFU:Least Frequently Used
- 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))
redis.conf
服务器基础配置
- 设置服务器以守护进程的方式运行
daemonize yes|no - 绑定主机地址
bind 127.0.0.1 - 设置服务器端口号
port 6379 - 设置数据库数量
databases 16 - 设置服务器以指定日志记录级别
loglevel debug|verbose|notice|warning:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低日志IO的频度 - 日志记录文件名
logfile 端口号.log - 设置同一时间最大客户端连接数,默认无限制。当客户点连接到达上限,redis会关闭新的连接
maxclients 0 - 客户端限制等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为0
timeout 300 - 导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件(多服务器),便于维护
include /path/server-端口号.conf
高级数据类型
Bitmaps
基础操作
- 获取指定key对应偏移量上的bit值
getbit key offset - 设置指定key对应偏移量上的bit值,value只能是1或0
setbit key offset value
扩展操作
- 对指定的key按位进行交、并、非、异或操作,并将结果保存到destKey中
bitop op destKey key1 [key2...]
and:交
or:并
not:非
xor:异或 - 统计指定key中1的数量
bitcount key [start end]
HyperLogLog
基本操作
- 添加数据
pfadd key element [element...] - 统计数据
pfcount key [key...] - 合并数据
pfmerge destKey sourcekey [sourcekey...]
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] - 获取指定点对应的坐标hash值
geohash key member [member...]

浙公网安备 33010602011771号