【redis】redis知识点总结

redis

  1. redis支持事务、持久化、LUA脚本、LRU驱动时间、多体集群
  2. redis与本地缓存(map)的区别?
    • 本地缓存:主要特点轻量以及快速,生命周期随着JVM的销毁而结束,多实例各自保存一份缓存,不具有一致性
    • redis:分布式缓存,具有一致性
  3. redis与memcached区别?
    • 支持的数据类型
      • redis支持更丰富的(支持更复杂的应用场景)k/v、list、set、zset、hash等
      • memcache仅支持简单数据类型string
    • 持久化
      • redis支持持久化,重启可恢复数据
      • memcache仅能保存在内存中
    • 集群支持
      • redis原生支持cluster
      • memcache需要靠客户端分片写入数据实现集群
    • 多线程
      • redis 单线程多路由IO复用模型
      • memcache 多线程非阻塞IO复用模型
    • 对比图
      【redis】redis知识点总结_第1张图片
  4. 常见数据结构分析
    • Hash 存储对象
    key=JavaUser293847
    value={
        “id”: 1,
        “name”: “SnailClimb”,
        “age”: 22,
        “l ocation”: “Wuhan, Hubei”
    }
    
    • List 存储链表 支持反向查找、遍历、分页
    • Set 对比List可以自动排序,去重,比List多了一个判断某元素是否存在的接口
    • Sorted Set 带权重的排序
  5. 过期时间
    • 过期删除机制
      • 定期删除:每隔100s 随机抽取一些过期时间的key进行删除
      • 惰性删除:对被定期删除遗漏的Key调用时,进行删除操作
      • 内存淘汰机制:某一个key如果永不调用,就会错过上两次删除,一直存在在内存中,此时会启用内存淘汰机制保持内存中都是热点数据
        • volatile-lru :挑选最近最少使用的数据淘汰
        • volatile-ttl :挑选将要过期的数据淘汰
        • volatile-random :在已设置过期时间的数据集中任意选择数据淘汰
        • allkeys-lru :从数据集(server.db[i].dict)中任意选择数据淘汰
        • no-enviction :禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错
  6. 持久化机制
    • 快照(RDB):redis创建某个时间点的副本
      • save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照
      • save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照
      • save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照
    • 追加文件(AOF): 每次更新会把最新备份写入 appendonly.aof 文件中
      • 开启方式添加参数 appendonly yes
      • appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
      • appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘
      • appendfsync no #让操作系统决定何时进行同步
      • AOF文件支持重写成为一个和原来保存数据一样,体积更小的文件
  7. 缓存雪崩和穿透解决方案
    • 缓存雪崩 : 缓存崩盘
      • 事前:尽量保证整个 redis 集群的高可用性,发现机器宕机尽快补上。选择合适的内存淘汰策略。
      • 事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL崩掉
      • 事后:利用 redis 持久化机制保存的数据尽快恢复缓存
      • 图解
        【redis】redis知识点总结_第2张图片
    • 缓存穿透 :一般是黑客故意去请求缓存中不存在的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。两种办法:
      • 1.将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉
      • 2.如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存但它的过期时间会很短,最长不超过五分钟
  8. 如何解决 Redis 的并发竞争 Key 问题
    • 分布式锁(zookeeper 和 redis 都可以实现分布式锁)

你可能感兴趣的:(redis,redis)