Redis是什么?
远程字典服务(Remote dictionary server ),是一种使用C语言编写的,可基于内存亦可持久化的日志型,Key_Value数据库,并提供多种语言的API。会周期性地把更新的数据写入磁盘,或者把修改操作写入追加的记录文件,并在此基础上实现主从复制。
Redis是一个开源的,内存中的数据结构存储系统。它可以用作数据库,缓存,消息中间件MQ。它支持多种类型的数据结构,如字符串,散列,列表,集合。有序集合。范围查询;bitMaps,地理空间索引半径查询。内置了复制,LUA脚本,LRU驱动事件,事务和不同级别的磁盘持久化,并通过redis哨兵和自动分区提供高可用性。
Redis能干什么?
1、 内存存储、持久化。内存断电即失,持久化很重要(rdb,AOF)!
2、 效率高,用于高速缓存;
3、 发布订阅系统;
4、 地图信息分析;
5、 计时器,计数器(浏览量);
Redis有什么特性?
1、多样化的数据类型
2、持久化
3、集群
4、事务、
Redis为什么是单线程还很快?
Redis是基于机器的内存和网络的带宽,是可以单线程实现的。为什么是不用多线程呢?因为多线程不一定是比单线程快,多线程有上下文切换,这
是一个耗时的操作。对于内存来说,如果没有上下文的切换,效率就是最高的。多次读写都在一个CPU上,在内存上就是一个最佳方案。
Redis事务?
Redis单条命令是保证原子性的,但是redis事务是不保证原子性的!
Redis事务的本质就是一组命令的集合。一个事务的所有命令都会被序列化,会按照顺序执行。一次性,顺序性,排他性!执行一系列的命令。
Redis事务没有隔离级别的概念。所有的命令在事务中并没有直接被执行。只有发起执行命令的时候才会被执行。
Redis的事物务分为三种阶段:
开启事务(multi)
命令入队(…..)
执行事务(exec)
Redis的几种数据类型?
String,List,Hash,set,Zset, Geo,hyperloglog,bitMaps。
Redis的几种过期策略?
惰性删除
Redis的惰性删除策略由 db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。
定期删除
由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。
定时删除
在设置某个key 的过期时间的同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。
惰性删除
设置该key 过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。
定期删除
每隔一段时间,我们就对一些key进行检查,删除里面过期的key。
Redis持久化
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失,所有redis提供了持久化的功能。
Redis 的RDB
RDB(RedisDataBase)
在指定的时间间隔内,将内存中的数据集快照写入磁盘,也就是snapshot快照,恢复时是将快照文件直接读入内存中。
Redis会单独创建一个fork子进程来进行持久化,它会先将数据写入一个临时文件。待持久化操作结束后,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。
RDB的缺点:最后一次持久化会丢失数据,这就确保了极高的性能,rdb保存的文件dump.rdb都是在快照中进行配置的。
RDB触发机制
1、 save规则满足的情况下,会自动触发rdb规则;
2、 执行flushall命令,也会触发我们的rdb规则;
3、 退出redis命令,也会产生rdb文件;
4、 备份就会自动生成一个dump.rdb。
如果恢复rdb文件,可以这样做:
1 只需要将rdb文件放在我们redis启动目录就好。Redis启动的时候会自动检查dump.rdb恢复其中的数据。
2 查看需要存在的位置;
127.0.0.1:6379> config get dir
- "dir"
- "D:\Redis" 如果这个目录下存在dump.rdb,那么启动就会自动恢复其中的数据。
RDB优缺点
优点:
1、适合大规模数据恢复!
2、如果你对数据完整性要求不高,也是可以使用rdb。
缺点:
1 需要一定的时间间隔进程操作,如果redis意外宕机了,这个最后一次修改的数据就没有了。
2 Fork进程的时候,会占用一定的内容空间。