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优先移除;