Redis杂化

 

Redis:Remote Dictionary Server

本质上是一个key-value类型的内存数据库。

较其他内存型数据库的优势:

  • 支持较为丰富的数据类型:String、List、Set、Sorted Set、hashes;
  • 操作速度较快;
  • 可以持久化其数据

 

缓存类型:本地缓存、分布式缓存、多级缓存

数据淘汰策略:

  1. noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外);
  2. allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放;
  3. volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放;
  4. allkeys-random: 回收随机的键使得新添加的数据有空间存放;
  5. volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键;
  6. volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

 

Redis哈希槽:

  Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

  集群的每个节点负责一部分hash槽,使用哈希槽的好处就在于可以方便的添加或移除节点,新增或移除节点的时候不用先停掉所有的 redis 服务。

事务和持久化:

  Redis 提供的不是严格的事务,Redis 只保证串行执行命令,并且能保证全部执行,但是执行命令失败时并不会回滚,而是会继续执行下去。

  Redis 提供了 RDB 和 AOF 两种持久化方式,RDB 是把内存中的数据集以快照形式写入磁盘,实际操作是通过 fork 子进程执行,采用二进制压缩存储;AOF 是以文本日志的形式记录 Redis 处理的每一个写入或删除操作。

  RDB 把整个 Redis 的数据保存在单一文件中,比较适合用来做灾备,但缺点是快照保存完成之前如果宕机,这段时间的数据将会丢失,另外保存快照时可能导致服务短时间不可用。

  AOF 对日志文件的写入操作使用的追加模式,有灵活的同步策略,支持每秒同步、每次修改同步和不同步,缺点就是相同规模的数据集,AOF 要大于 RDB,AOF 在运行效率上往往会慢于 RDB。

 

缓存穿透:查redis缓存、DB数据库都无数据(恶意攻击);

  1. 对不存在的用户,在缓存中保存一个空对象进行标记,防止相同 ID 再次访问 DB。不过有时这个方法并不能很好解决问题,可能导致缓存中存储大量无用数据。
  2. 使用 BloomFilter 过滤器,BloomFilter 的特点是存在性检测,如果 BloomFilter 中不存在,那么数据一定不存在;如果 BloomFilter 中存在,实际数据也有可能会不存在。非常适合解决这类的问题。

缓存击穿:某个热点数据失效时,大量针对这个数据的请求会穿透到数据源;

  1. 可以使用互斥锁更新,保证同一个进程中针对同一个数据不会并发请求到 DB,减小 DB 压力。
  2. 使用随机退避方式,失效时随机 sleep 一个很短的时间,再次查询,如果失败再执行更新。
  3. 针对多个热点 key 同时失效的问题,可以在缓存时使用固定时间加上一个小的随机数,避免大量热点 key 同一时刻失效。

缓存雪崩:缓存挂掉,这时所有的请求都会穿透到 DB;

  1. 使用快速失败的熔断策略,减少 DB 瞬间压力;
  2. 使用主从模式和集群模式来尽量保证缓存服务的高可用。

 

详情:https://segmentfault.com/a/1190000021103991

 

原文地址:https://www.cnblogs.com/fqfanqi/p/14881852.html