Redis介绍
Redis就是一个数据库;是和Oracle不一样的数据库;非关系数据库===NOSQL
NOSQL(NotOnlySQL)===>非关系型数据库
非关系型数据库的特点
1. 结构比较简单:key-value的方式存储数据、文档的方式存储数据
2. 在内存中存储数据===》弱化了事务的处理
3. 自动持久化===》可以自动把内存中的数据写入到磁盘中
4. 支持脚本语言
5. 支持集群环境
Redis是一个非关系型数据库;Redis的特点
1. key-values方式存储数据
2. 内存中存储数据
3. 自动持久化
Redis就是在内存中,以key-value的方式存储数据;并且可以自动持久化的一个非关系型数据库
Redis持久化机制
-
RDB:全本快照
触发的时候把内存中所有的数据写入到硬盘 默认的磁盘文件是 dump.rdb触发方式:
- save触发方式:该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止(把原有数据全部覆盖替换,不可取)
- bgsave触发方式:执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求
- 自动触发:在redis.conf中配置 “save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000缺点:服务器故障的时候可能会丢失数据,进行全本快照持久化啊的时候可能会丢失数据
-
AOF:日志记录
redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解 就是日志记录。默认的磁盘文件appendonly.aof触发方式:
- 每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
- 每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失
- 不同no:从不同步
appendonly yes //启用aof持久化方式
appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,
但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
appendfsync no //完全依赖os,性能最好,持久化没保证缺点:AOF的文件大于RDB文件,恢复数据可能会有丢失
开启日志重写:确定appendonly.aof文件中的命令都是对于恢复数据来说有意义的命令,根据内存中现有数据,生成对应的命令写入到磁盘文件中;把文件中原本的内容覆盖掉
no-appendfsync-on-rewrite yes //开启日志重写
auto-aof-rewrite-percentage 100 //aof日志重做时机
auto-aof-rewrite-min-size 64md //aof日志重做大小
-
RDB和AOF如何选择
两者同时开启最优
不要仅仅使用 RDB,因为那样会导致你丢失很多数据也不要仅仅使用 AOF,因为那样有两个问题,第一,你通过 AOF 做冷备,没有 RDB 做冷备,来的恢复速度更快; 第二,RDB 每次简单粗暴生成数据快照,更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug。
redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的第一选择; 用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复。
RedisCluster集群
集群内置了16384个slot(哈希槽)并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作