redis .
key-value类型的nosql数据库,支持事务,持久性,
redis持久化之RDB和AOF
RDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。(每隔一段时间将内存中的数据写完本地文件,重启后从本地文件中恢复数据)
优点: 1 适合大规模的数据恢复。 2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点: 1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。 2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。 所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。
AOF 详解
AOF :Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。(默认每秒写入一次)
优点:数据的完整性和一致性更高 缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
总结
-
Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
-
RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
-
Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
-
AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
-
Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
-
若只打算用Redis 做缓存,可以关闭持久化。
-
若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。
redis实现原理
redis使用单线程多路复用模型,采用IO多路复用机制同时监听多个socket,根据socket上的事件状态,通过文本事件分派器分派给对应的事件处理器进行处理(连接应答处理器,命令请求处理器,命令回复处理器)
Redis支持是的数据结构
-
string(字符串)
-
byte数组,最大上限是1G字节
-
1.二进制序列字符串。 2.整型数据。 3.浮点数据。
-
-
hash(哈希)
-
key-value对组成
-
-
list:有序的字符串序列
-
最大长度为2^32
-
-
set: 集合
-
不允许重复的元素出现在一个Set
-
-
zset
-
不允许重复的元素出现在一个Set
-
增加了排序的功能
-
Redis之所以执行速度很快
-
Redis是纯内存的,读写速度非常快 避免了硬盘 I/O 速度的限制
-
单线程操作, 节省了上下文切换线程的时间
-
采用了非阻塞I/O多路复用机制
Redis与Memcached的区别
-
redis支持更丰富的数据类型,Memcached只支持string类型
-
Redis支持数据的持久化而,Memecache把数据全部存在内存之中
-
Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的非阻塞 IO多路复用模型
Redis支持5种数据类型,速度为什么那么快?
Redis全程使用hash结构,读取速度快,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);数据操作简单,不同场景使用不同数据类型。
Redis常见的使用场景
-
限时业务的运用(限时的优惠活动信息、手机验证码,限流等业务场景)
-
计数器
-
排行榜
-
分布式锁
-
队列(秒杀活动)
3.6 缓存和数据库间数据一致性
使用缓存经常会出现缓存和数据库的数据不一致的问题:如果项目是强一致性,不建议缓存;使用缓存针对是经常访问,不经常改变的数据。需要考虑的问题:刷新缓存、缓存过期时间、缓存获取失败、多级缓存等。
解决方案:启动一个子线程去从数据库中按顺序取出修改数据,依次进行对缓存值的修改。
使用缓存因该注意那些细节
-
缓存穿透
我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,在流量大时,可能DB就挂掉了,造成缓存穿透。
-
缓存雪崩
如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成缓存雪崩。(解决:互斥锁排队,将所有可能的合理请求(请求参数),放入白名单,不合法的直接禁止访问)
页面访问量很大,缓存失效,缓存击穿怎么办
引起这个问题的主要原因:高并发,并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。 一个简单方案就是讲缓存失效时间散列,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
redis挂了怎么办
开启一个子线程异步从缓存中备份数据
Redis中一个键过期了,什么时候会被删除呢?有以下三种策略
定时删除: 在设置键过期时间的同时,创建一个定时器,让定时器在过期时间来临时,立即执行对键的删除操作 惰性删除: 放任键过期不管,但是每次从键空间获取键时,都检查取得的键是否过期,过期的话就删除该键,没过期的话就返回该键 定期删除: 每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键,至于要删除多少个过期键,检查多少个数据库,由算法决定