八股文_常规_redis

116 阅读3分钟

基础篇

基础命令

  • exists:检查某个键是否存在
  • hexists:检查哈希表中某个字段是否存在,用法:hexists key field
  • select 1:切换数据库为db1
  • set mykey value ex 60:设置过期时间为60秒,ex 60可选
  • set mykey value222 nx:当mykey不存在时才添加数据,nx可选
  • set mykey value333 ex 60 nx:当mykey不存在时添加数据,并设置过期时间为60秒

数据类型

  • String:原子操作加减
  • Hash:存储商品的各属性
  • List:有序集合,底层实现为双向链表
  • Set:可以存储用户点赞收藏的帖子
  • ZSet:延时队列,限流
  • Bitmap:布隆过滤器
  • Hyperloglog:统计页面访问量

使用场景

  • 缓存
  • 接口幂等(setnx)
  • 限流、延时队列(zset)
  • 分布式锁(setnx+expire)
  • 网站页面访问量(hyperLogLog)
  • 判断是否签到,是否是活跃用户(位图)

缓存一致性

先更新数据库,后删除缓存,这种方案能最终保持数据的一致性,其他方案像“先更新缓存、再更新数据库”,“先更新数据库、再更新缓存” 在并发情况下可能会导致数据不一致

解决方案:先更新数据库,后删除缓存(推荐)

@RequestMapping("/cache/db/delete")
@PutMapping
public String updateDelete(@RequestBody User user){
    //更新数据
    userMapper.updateById(user);
    //删除缓存
    stringRedisTemplate.delete("user:"+user.getId());
    return "success";
}

持久化策略

Redis 提供了三种持久化机制:RDBAOF、以及两者混合持久化机制,这三者都是开启子线程进行持久化不会影响主线程操作

  • RDB:在指定的时间间隔内将内存中的数据写入dump.rdb文件中
  • AOF:将写操作命令写入appendonly.aof文件中,重启redis时会执行aof文件中的命令来恢复数据,aof是先执行命令,后写日志,只记录执行成功的命令,避免出现记录错误命令的情况

数据淘汰策略

  • 惰性删除:每次访问键时,判断是否已过期,如果已过期则将其删除
  • 定期删除:每隔一定时间随机检查一定数量的键,如果已过期则将其删除
  • 主动删除:当内存使用达到设置的最大限制时,会促发内存回收机制,删除策略包括:删除最近最少使用的(LRU)、存活时间最少的键(TTL)

架构篇

主从复制

将主节点的数据复制到多个从节点,主从架构可以实现读写分离,写操作请求主节点,读操作只请求从节点,从而减轻主节点的压力

主从复制.jpg

哨兵模式

使用 Redis 主从服务的时候,会有一个问题,就是当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,为了解决这个问题,Redis 增加了哨兵模式,哨兵模式可以监控主从服务器,当主节点发生故障时 哨兵节点会选择一个合适的从节点升级为主节点

1.png

Redis集群

  • 多个redis实例组成一个集群,每个实例存储部分数据(即每个实例之间数据是不重复的),整个reids集群把键空间分成16384个槽slot位,每个redis实例负责一定范围的哈希槽,数据的key 经过哈希函数计算后 对16384取余即可得到槽位号 进而定位到对应的redis节点

  • redis集群中每个节点之间都会保存完整的拓扑信息,包括每个节点的id、ip地址、端口、负责的哈希槽范围

  • 客户端发送请求时,会连接集群中的任意一个节点,如果该节点存储了对应的数据则直接返回,否则会根据请求的key计算哈希槽 并路由到正确的节点

redis集群.jpg

1.png