Redis进阶

Redis

1. 数据结构

  1. 字符串(String)
  2. 链表(List)
  3. 哈希(Hash)
  4. 集合(Set)
  5. 有序集合(Zset)

2. 持久化策略

redis是内存型数据库,有点是读取数据快,缺点是数据易失性,断电后内存数据消失。

解决方案:

1. RDB(Redis Data Base)

原理:把redis内存中的数据生成一个快照(RDB文件)保存在硬盘中。

手动触发
  1. save命令,主线程执行rdbsave函数,服务器进程阻塞。

  2. bgsave命令,fork一个子进程去执行rdbsave函数。服务器进程不会阻塞。

自动触发

配置文件中写入 save m n,代表当m内发生n次变化时候,会执行bgsave

2. AOF(Append Only File)

原理:记录之后的所有对redis数据进行修改的操作。通过AOF文件执行文件中的命令恢复。

手动触发
  1. bgrewriteaof
自动触发
  1. 配置文件中设置appendonly yes 开启
  2. 写入策略(always、everysec,no),默认everysec

3. 缓存

1. 缓存淘汰

  • 先进先出FIFO
  • 最近最少使用LRU
  • 最不经常使用LFR

2. 缓存删除

  • 主动删除
  • 惰性删除
  • 定时删除

3. 缓存一致

CacheAside
  • 模式一(更新数据之前先删除缓存。问题:读比写快,另一个客户端即使缓存失效去读取数据库,也有可能读取到老数据)
  • 模式二(先更新数据,再删除缓存。问题:因网络、程序问题小概率发生读取到老旧数据)

解决方案:延时双删(删除缓存,更新数据,再次删除缓存)

Read/Write Throuth

核心在于运用把缓存作为主要的数据读取方式,避免缓存击穿。(不删缓存,而是直接更新缓存)

Write Behind

CacheAside和Read/Write Throuth 都是同步删除、同步更新缓存。存在延时问题。

Write Behind核心是异步处理

  • 利用MQ异步执行
  • 模拟mysql主从复制

4. 缓存击穿

定义:查询某个数据的值,该值再缓存中无,在数据库中有。

问题:如果对该值的查询量突然特别大,由于缓存中无数据,所有请求就会打到后端数据库上。

解决方案:

  • mysql角度:减少直接流量
  • redis角度:设置数据不过期;异步线程刷新过期时间

5. 缓存穿透

定义:查询某个数据的值,该值再缓存中无,在数据库中无。

解决方案:

  1. 拦截非法查询请求
  2. 缓存空对象
  3. 布隆过滤器

6. 缓存雪崩

与缓存击穿类似,缓存击穿是单点,缓存雪崩是多点。多发生在服务启动的时候

解决方案:

  • mysql角度:减少直接流量
  • redis角度:设置数据不过期;分散失效时间点;缓存预热。

4. 集群

1. 主从复制

主库负责执行写命令、将数据同步到从库

从库负责执行读命令

2. 哨兵

哨兵系统(类似服务注册中心)

3. cluster (分区)

分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

5. 分布式锁

1)互斥性

在任意时刻只有一个客户端可以获取锁。

这个很容易理解,所有的系统中只能有一个系统持有锁。

2)防死锁

假如一个客户端在持有锁的时候崩溃了,没有释放锁,那么别的客户端无法获得锁,则会造成死锁,所以要保证客户端一定会释放锁。

Redis中我们可以设置锁的过期时间来保证不会发生死锁。

3)持锁人解锁

解铃还须系铃人,加锁和解锁必须是同一个客户端,客户端A的线程加的锁必须是客户端A的线程来解锁,客户端不能解开别的客户端的锁。

4)可重入

当一个客户端获取对象锁之后,这个客户端可以再次获取这个对象上的锁。

代码示例

setnx k v
# 业务
del k
set k v ex 10 nx
# 业务
del k
-- 获取锁中的线程标示,动态传递参数
local keyName = redis.call('get',KEYS[1])
-- 比较线程标示与锁中的是否一直
if (ARGV[1] == keyName) then
   -- 释放锁
    redis.call('del',KEYS[1])
    return 1
     -- 如果不一致,则返回结果为0
else
    return 0
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值