Redis-概述
Redis支持的类型:
String,List,Map,Set,Sorted set
Redis的持久化:
1、Redis DataBase (RDB): RDB是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能
缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
2、Append Only File (AOF): 将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠,它和mysql中bin.log、apache.log、zookeeper中txn-log简直异曲同工。AOF文件内容是字符串,非常容易阅读和解析。
优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。
缺点:AOF文件比RDB文件大,且恢复速度慢。
Redis主从面临的问题:
1、主从机制,可以提供读写分离,分担读的请求压力。但是主只有一个,存在单点故障的问题。
哨兵机制面临的问题:
1、解决了主从的单点问题,但是主服务器只有一个,写性能不足。
Redis集群:终极解决方案 ,解决了主从机制的单点问题,和哨兵机制的主服务器唯一,写性能问题。
Redis为什么这么快:
1、 纯内存操作。
2、单线程,避免线程切换的开销。
3、使用I/O多路复用机制。
缓存面临的问题:
1、缓存雪崩
问题描述:缓存同一时间大面积失效,当请求到达的时候,导致所有的请求都怼到数据库上,导致数据库链接异常。
解决方案: a、缓存预热的时候,设置随机过期时间。
b、利用互斥锁,缓存失效的时候,先获取互斥锁,得到锁再去操作数据库,否则休眠等待锁。(缺点:吞吐量下降)
2、缓存击穿
问题描述:黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。
解决方案: a、利用互斥锁,缓存失效的时候,先获取互斥锁,得到锁再去操作数据库,否则休眠等待锁。
b、黑名单机制,禁止黑名单中的ip地址访问。
3、缓存与数据库双写一致性问题
问题描述:请求A为读请求,请求B为修改请求,它们请求的为同一个东西。请求B先到达,修改数据库数据成功,未来得及更新缓存。此时请求A到达,获取缓存中的脏数据。
解决方案:先删除缓存,再更新数据库,最后再更新缓存。
4、缓存的并发竞争问题。
问题描述:同时有多个子系统去设置同一个key。
解决方案: a、分布式锁,得到锁才进行操作,其它线程等待。
b、使用队列,将set操作,变成串行访问。
Redis 采用的是定期删除+惰性删除策略、内存淘汰策略
1、定期删除:固定时间内,随机抽取Redis内的数据,进行过期检查。
2、惰性删除:当获取该key的时候,再判断是否过期。
3、内存淘汰策略:在 redis.conf 中有一行配置:maxmemory-policy volatile-lru 就是配置内存淘汰的策略,用以补充定期删除+惰性删除的不足。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。推荐使用。(其余的分别是:noeviction、allkeys-random、volatile-lru、volatile-random、volatile-ttl)