缓存策略
Cache-Aside
应用程序(Application)会与缓存(Cache)和数据源(Data Source)进行通信,请求在命中数据源之前先检查缓存是否存在,如果不存在则读取数据库再写入缓存,反之直接返回,需要修改数据库操作时删除相应的缓存数据
场景:最常用的缓存策略,基本都是使用这种策略
优点:当缓存发生故障后,系统任然可以直接访问数据库返回数据
缺点:首次请求的时候总会缓存未命中
注意:TTL
Read-Through
Cache-Aside 需要应用程序与缓存和数据库打交道,而ReadThrough无需引用程序管理缓存数据源和缓存,只需将数据源同步委托给缓存提供程序,所有数据交互通过抽象缓存层完成的
场景:数据预热
Write-Through Cache
首先将数据写入缓存,然后写入数据库。缓存与数据库保持一致,写操作总是通过缓存到达主数据库
Write-Around
数据直接写入数据库,只有读取的数据才能进入缓存。Write-around可以与read-through结合使用,并在数据只写一次、读取次数较少或从不读的情况下提供良好的性能。
Write-Back
应用程序将数据写入缓存,缓存会立即确认,并在延迟一段时间后将数据写入数据库,相当于一种异步回写操作(异步写可以减少与物理磁盘存储的交互,也可以进行合并写等优化)
场景:扣减库存
缓存穿透
概念:指在高并发长江下,一个key被高并发访问,没有被命中,会去后端数据库获取,从而导致了大量请求数据到达数据库,而当该key对应的数据本身为空的情况下,这就导致了不必要的查询操作从而导致巨大冲击和压力
解决方案
1.缓存空对象
空值做了缓存意味着缓存层中存了更多的建(内存空间)像缓存空对象要设置一个较短时间,缓存层和存储层会有一段时间窗口不一致,可能会对业务有一定的影响 如果此时存储的和缓存层不一致可以利用消息系统清空空对象
成本:代码简单,需要过多的缓存空间,数据不一致
2.布隆过滤器拦截
将存在的key用布隆过滤器提前保存起来做一层拦截
成本:代码维护复杂,缓存空间占用小
3.使用锁的互斥
互斥锁可以用代码的锁实现,也可以使用redis setnx命令实现
常用命令
congfig设置
获取配置
config get {param}
设置配置
config set {param} {n}
maxmemory,最大内存
设置最大内存,最大内存默认为0,相当于和系统一样大
config set maxmemory {n}
timeout,检测空闲连接超时时间
设置超时时间,默认为0 不会检测,建议可以设置为30
单位:秒
config set timeout {n}
tcp-keepalive,检测tcp连接活性的周期
查询tcp连接活性周期,默认为300,建议可以设置为60
单位:秒
config set tcp-keepalive {n}
slowlog,慢查询记录
查询慢查询配置
CONFIG GET slowlog-*
slowlog-log-slower-than 代表慢查询的阈值,单位微妙,当执行查询命令消耗大于配置的阈值会将改命令记录到慢查询的日志,默认为10毫秒
slowlog-max-len 记录慢查询日志最大条数,默认为128,不要设置过大,设置过大可能一条记录页不会记录
查询慢查询命令
# n 为条数 例如:slowlog get 5 查询前5条
slowlog get {n}
查询内存使用情况
info memory
常用的参数如下:
used_memory redis分配器分配的内存总量
used_memory_rss 由操作系统申请内存大小
used_memory_peak redis内存消耗峰值
total_system_memory 系统内存总量
used_memory_lua lua 脚本占用总量
maxmemory_policy 使用的策略 有6种,可以看基础篇了解maxmemory_policy
mem_fragmentation_ratio 碎片率
大于1.5,说明碎片率很大 最好的处理方式就是重启,
小于1,说明操作系统吧Redis 做 内存交换(swap)redis性能会变得很差 甚至僵死
其中参数_human 是换算出来后的显示
查看主从关系
info replication
#主节点 role:master # 从节点的连接数 connected_slaves:2 # 从节点详细信息 IP PORT 状态 命令(单位:字节长度)偏移量 延迟秒数 # 主节点每次处理完写操作,会把命令的字节长度累加到master_repl_offset中。 # 从节点在接收到主节点发送的命令后,会累加记录子什么偏移量信息slave_repl_offset,同时,也会每秒钟上报自身的复制偏移量到主节点,以供主节点记录存储。 # 在实际应用中,可以通过对比主从复制偏移量信息来监控主从复制健康状况。 slave0:ip=192.168.10.102,port=6379,state=online,offset=23866,lag=0 slave1:ip=192.168.10.103,port=6379,state=online,offset=23866,lag=0 # master启动时生成的40位16进制的随机字符串,用来标识master节点 master_replid:acc2aaa1f0bb0fd79d7d3302f16bddcbe4add423 master_replid2:0000000000000000000000000000000000000000 # master 命令(单位:字节长度)已写入的偏移量 master_repl_offset:23866 second_repl_offset:-1 # 0/1:关闭/开启复制积压缓冲区标志(2.8+),主要用于增量复制及丢失命令补救 repl_backlog_active:1 # 缓冲区最大长度,默认 1M repl_backlog_size:1048576 # 缓冲区起始偏移量 repl_backlog_first_byte_offset:1 # 缓冲区已存储的数据长度 repl_backlog_histlen:23866 # 从节点 role:slave # 主节点详细信息 master_host:192.168.10.101 master_port:6379 # slave端可查看它与master之间同步状态,当复制断开后表示down master_link_status:up # 主库多少秒未发送数据到从库 master_last_io_seconds_ago:1 # 从服务器是否在与主服务器进行同步 0否/1是 master_sync_in_progress:0 # slave复制命令(单位:字节长度)偏移量 slave_repl_offset:24076 # 选举时,成为主节点的优先级,数字越大优先级越高,0 永远不会成为主节点 slave_priority:100 # 从库是否设置只读,0读写/1只读 slave_read_only:1 # 连接的slave实例个数 connected_slaves:0 # master启动时生成的40位16进制的随机字符串,用来标识master节点 master_replid:acc2aaa1f0bb0fd79d7d3302f16bddcbe4add423 # slave切换master之后,会生成了自己的master标识,之前的master节点的标识存到了master_replid2的位置 master_replid2:0000000000000000000000000000000000000000 # master 命令(单位:字节长度)已写入的偏移量 master_repl_offset:24076 # 主从切换时记录主节点的命令偏移量+1,为了避免全量复制 second_repl_offset:-1 # 0/1:关闭/开启复制积压缓冲区标志(2.8+),主要用于增量复制及丢失命令补救 repl_backlog_active:1 # 缓冲区最大长度,默认 1M repl_backlog_size:1048576 # 缓冲区起始偏移量 repl_backlog_first_byte_offset:1 # 缓冲区已存储的数据长度 repl_backlog_histlen:24076
查询状态
info stats
total_connections_received:redis自启动以来处理的客户端连接总数
rejected_connection:redis自启动以来拒绝的客户端连接数,需要重点监控
查询客户端信息
info clients
maxclients: 默认最大客户端连接数,默认是10000
connected_clients:当前连接数
系列链接
Redis学习笔记一 入门基础_记性差的程序员的博客-CSDN博客
Redis学习笔记二 主从复制_记性差的程序员的博客-CSDN博客
Redis学习笔记三 哨兵(Sentinel)_记性差的程序员的博客-CSDN博客
Redis学习笔记四 集群(cluster)_记性差的程序员的博客-CSDN博客
参考
缓存使用过程中的五种策略总结及优缺点 - 进击的Ace - 博客园
《redis开发与运营》