浅析redis
一,redis概念
Redis是一款基于C语言开发的nosql数据库。
数据保存在内存中。
数据都是以键值对的形式保存。
默认编码使用utf-8.
二,常用的5中数据类型
1.String
2.hash
3.list
4.set
5.sortedSet
三,过期策略
redis是基于内存的,内存都是有限的,如果我们往redis中添加的数据超出了redis的内存范围会怎么样呢?答案:某些数据将会被删除。
redis最常用的淘汰策略,allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
四,指令:1.开启事物:multi 2.提交事务:exec
执行原理:开启事务multi后,所有执行的命令会进入到事务队列中,如果客户端正处于事务状态, 那么当 exec 命令执行时, 服务器根据客户端所保存的事务队列, 以先进先出(FIFO)的方式执行事务队列中的命令: 最先入队的命令最先执行, 而最后入队的命令最后执行。
五,持久化机制
1.RDB(默认):Redis 会单独的创建(fork) 一个子进程来进行在指定的时间间隔内将内存中的数据集快照写入磁盘。
优点:1.RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据。
2.对redis对外提供的读写服务影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可。
3.相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速。
缺点:1.RDB可能会导致最后一次的持久化不能完成,导致大量数据丢失。
AOF:1.以日志的形式记录每个写操作,将 redis 执行过的所有写指令记录下来(读操作不记录)写入到appendonly.aof这个文件,持久化的时机可以配置 always、everysec、 no
优点:AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync(异步)操作,最多丢失1秒钟的数据
缺点:1.AOF的文件会越来越大,提供了AOF文件越大的解决方案,redis会自动重新根据当前的redis内存中的数据给生成一个新的最小写操作的AOF文件。
2.AOF 恢复的速度比RDB慢。
线程模式:多路复用IO:1.“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗)
文件事件分派器:根据客户端操作将socket关联的事务处理器。注:由于文件事件分派器是单线程工作的,所以redis是单线程
为啥redis单线程模型也能效率这么高?
1.简洁的命令表达式。
2.纯内存操作 ,时间复杂度O(1)。
3.核心是基于非阻塞的IO多路复用机制。
4.单线程反而避免了多线程的频繁上下文切换问题。