Redis知识点整理

知识点

Redis 是什么?

Redis 是 C 语言开发的一个开源的高性能键值对(key-value)的 NoSQL数据库,可以用作数据库、缓存、消息中间件等。


Redis知识点整理
redis核心对象.png

丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。支持数据持久化。主从复制,哨兵,高可用。可以用作分布式锁。可以作为消息中间件使用,支持发布订阅。

Redis 为什么快?

  • 使用单线程模型能带来更好的可维护性,方便开发和调试,避免线程上下文切换;
  • I/O多路复用;
  • Redis 服务中运行的绝大多数操作的性能瓶颈都不是 CPU;。

redis中的多线程

对于 Redis 中的一些超大键值对,几十 MB 或者几百 MB 的数据并不能在几毫秒的时间内处理完,Redis 可能会需要在释放内存空间上消耗较多的时间,这些操作就会阻塞待处理的任务,影响 Redis 服务处理请求的 PC和可用性。然而释放内存空间的工作其实可以由后台线程异步进行处理,这也就是 UNLINK 命令的实现原理,它只会将键从元数据中删除,真正的删除操作会在后台异步执行。

redis的淘汰策略(设置过期时间集合 未设置过期时间集合)

noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。
allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
allkeys-random: 所有key通用; 随机删除一部分 key。
volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。

redis删除策略

1,定时删除:在设置键的过期时间的同时,创建一个timer,让定时器在键的过期时间到达时,立即执行对键的删除操作。
优缺点:对内存友好,但是对cpu时间不友好。
2,定期删除:每隔一段时间就对数据库进行一次检查,删除里面的过期键。
优缺点:选择一个好的策略来设置删除操作的时长和执行频率。
3,惰性删除:获取键时,如果过期就删除,如果没过期就返回该键。
优缺点:对cpu时间友好,对内存不友好。

redis缓存一致性

注:强一致性同步成本太高,如果追求强一致,那么没必要用缓存了,直接查数据库即可。通常考虑的,都是最终一致性
方案一
通过key的过期时间,mysql更新时,redis不更新。
这种方式实现简单,但不一致的时间会很长。如果读请求非常频繁,且过期时间比较长,则会产生很多长期的脏数据。
方案二
在方案一的基础上扩展,通过key的过期时间兜底,并且,在更新mysql时,同时更新redis。
方案三
针对方案二的同步写redis进行优化,增加消息队列,将redis更新操作交给kafka,由消息队列保证可靠性,再搭建一个消费服务,来异步更新redis。
方案四
通过订阅binlog来更新redis,把我们搭建的消费服务,作为mysql的一个slave,订阅binlog,解析出更新内容,再更新到redis。