redisredis

    分布式缓存为什么采用redis?

    • 开发活跃。社区非常成熟,包括StackOverflow/暴雪/新浪微博/Flickr等公司广泛使用。

    • 高性能:100k+TPS。

    • 功能丰富。K/V存储的Value不仅仅支持string,还支持list、hash、set、sorted set。大量的原子操作。基本涵盖了memcached的功能。

    • 支持经典的Master/Slave高可用部署架构,支持缓存内容的持久化。

    redis有哪些数据类型?

    string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

    string:

    string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

    string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

    string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB

    hash:

    Redis hash 是一个键值(key=>value)对集合。

    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

    list:

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    set:

    Redis 的 Set 是 string 类型的无序集合。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

    zset:

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

    zset的成员是唯一的,但分数(score)却可以重复。

    redis有几种数据过期策略?

    • 被动删除:当读/写 一个过期的key时,会触发惰性删除策略,直接删除这个key

    • 主动删除由于惰性策略无法保证冷数据已经被删除,所以redis会定期主动删除一些已过期的key,或者当内存达到为redis服务器设置的最大内存的时候,会主动的删除一些数据(触发数据淘汰策略)

    redis内存淘汰策略

    其实当内存占用过多的时候,此时会进行内存淘汰,redis提供了如下策略:

    • noeviction:当内存不足以容纳新写入数据时,新写入数据会报错。

    • allkeys-lru:当内存不足以容纳新写入数据时,会移除最近最少使用的key。

    • allkeys-random:当内存不足以容纳新写入数据时,会随机移除某个key。

    • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。

    • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

    • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

    以上几个策略最常用的应该是allkeys-lru,其实这个也要根据业务场景去选择

    redis的持久化机制

    AOF 介绍:https://redisbook.readthedocs.io/en/latest/internal/aof.html

    RDB 介绍:https://redisbook.readthedocs.io/en/latest/internal/rdb.html

    • RDB和AOF机制

    RDB持久化机制原理是对redis中的数据执行者周期性的持久化,是redis默认的持久化机制,他的默认持久化策略是如果在900S之内执行了一次数据变更操作,或者在300S内执行了10次,再或者在60s执行了10000次,那么在这个900S、300S、60S将会生成一个redis数据快照文件。

    AOF持久化机制对每条redis的写入指令都会做一条日志,以append-only的模式写入一个日志文件中,在redis重启的时候会回放日志文件中的指令来重新构建数据,它默认会每秒保存一个文件。

    如果同时启用了RDB和AOF的话,redis会使用AOF来恢复数据,因为AOF的数据会更加完整。

    在我们实际生产使用中,可以定期把RDB和AOF做备份到云服务器来做灾难恢复,数据恢复。

    • RDB的优缺点

    RDB机制有几个优点,首先它会生成多个数据文件,每个文件都代表某个时刻redis中的数据快照,这种文件非常适合我们做冷备,可以定期把这种文件推送到云服务做存储来应对灾难恢复;其次,RDB对redis对外提供的读写服务影响比较小,可以让redis保持高性能,因为redis只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化;而且由于RDB是基于数据文件恢复的,所以说相对于AOF来说更加快速。

    RDB的缺点在于2个方面,首先在redis故障的时候,RDB由于它是定期去数据快照,所以说可能会丢失一部分数据;其次RDB每次在fork子进程来生成快照文件的时候,如果数据文件特别大,可能会导致对客户端提供服务暂停数毫秒,甚至数秒。

    • AOF机制的优缺点

    AOF机制的优点:

    1.AOF可以更好的避免数据丢失问题,默认AOF每隔1S,通过后台线程执行一次fsync操作,它最多丢失1S的数据。2.AOF日志文件以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能比较高,而且文件不容易受损坏,redis也提供了修复受损坏AOF文件的方式,很容易修复。3.AOF日志文件可读性比较高,可以追踪误操作记录(如flush all),来删除这个日志记录进行紧急恢复。

    AOF机制的缺点:

    1.对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大。2.AOF开启之后,支持的写QPS会比RDB支持的写QPS低,因为默认AOF会每秒去fsync一次日志。

    • RDB和AOF该如何选择?

    其实我们应该两者一起使用的,用AOF来保证尽可能的不丢失数据,作为数据恢复的第一选择,利用RDB来做冷备,当AOF丢失或者不可用的时候来使用RDB快照来快速回复。如果单一选择RDB的话对比AOF可能会丢失部分数据,选择AOF的换又没有RDB回复的速度快而且AOF的备份很复杂。