Redis基础

2019/04/14 分布式

Redis基础

1.数据类型

string,hash,list,set,sorted set。

  • string:做简单的KV缓存;
  • hash:类似map的结构,可以将结构化的数据存入redis,比如一个对象(前提是这个对象没有嵌套其他对象),然后每次读写缓存的时候,可以只操作hash里的某个字段;
  • list:有序列表,可以存储列表型的数据结构,比如文章评论列表之类的;可以通过lrange命令读取某个闭区间的元素,实现分页查询;
  • set:无序列表,自动去重;
  • sorted set:排序的set,自动去重。

2.持久化

  • RDB:对redis中的数据周期化的持久化;

    • 会生成多个数据文件,每个数据文件代表某一个时刻中redis中的数据,非常适合做冷备,可以将这种完整的数据文件发送到远程的安全存储上去;

    • redis主进程fork一个子进程来进行RDB备份,可以让redis保持高性能;
    • 相对于AOF,直接基于RDB数据文件来重启和恢复redis进程更加快速;
    • RDB数据快照文件每个5分钟或更长时间生成一次,有可能丢失数据。
  • AOF:对每条写入命令作为日志,以append-only的模式写入一个日志文件中。

    • AOF每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒的数据;
    • AOF记录命令,可读性高,非常适合做灾难性的误删除的紧急恢复
    • 对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大;
    • AOF开启后,支持的写QPS比RDB支持的写QPS低,因为AOF一般配置为每秒fsync一次日志文件。

如何选择:

  • RDB会导致丢失更多的数据;

  • AOF没有RDB生成的数据快照那样健壮,如果要做冷备,没有RDB的恢复速度快;

  • redis支持同时开启两种持久化方式,默认开启RDB,如果都开启,默认用AOF来重新构建数据。

    AOF做数据恢复,RDB做冷备,如果AOF文件丢失或损坏,再使用RDB做数据恢复。

3.过期策略

redis的过期策略是:定期删除+惰性删除。

  • 定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,过期就删除。
  • 惰性删除:定期删除可能导致很多过期的key没有被删除掉,这时候使用惰性删除。在获取某个key的时候,redis检查这个key是否过期,如果过期了此时会删除,不会返回任何东西。

如果定期删除漏掉了很多过期key,也没有及时的查询,没走惰性删除,大量过期key堆积在内存中,此时会走内存淘汰机制。

4.内存淘汰机制

当内存不足以容纳新写入的数据时,redis的内存淘汰机制会起作用:

  • noeviction:新写入数据报错;
  • allkeys-lru(最常用):在键空间中,移除最近最少使用的key;
  • allkeys-random:在键空间中,随机移除某个key;
  • volatile-lru:在设置了过期时间的键空间中,移除最近最少使用的key;
  • volatile-random:在设置了过期时间的键空间中,随机移除某个key;
  • volatile-ttl:在设置了过期时间的键空间中,有更早过期时间的key优先移除;

参考:

Redis 内存淘汰机制

Search

    Table of Contents