什么是Redis?
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间 (geospatial) 索引半径查询。 Redis 内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的磁盘持久化 (persistence)-- RDB和AOF , 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
为什么需要Redis?
就数据的存储而言,服务器的数据存储设计大概经历了一下几个过程:
1、单机MySQL时代
这种模式下的瓶颈:
- 数据量太大,一个机器存放不下
- 数据的索引太大,一个机器的内存放不下
- 访问量(读写混合)太大,一个服务器承受不住
2、缓存 Memcached+读写分离
网站上80%的情况都是在读,每次都去查询数据库,效率很低。这时候可以加入缓存机制,第一次查 询去MySQL中读取数据,将数据返回给用户的同时,在缓存中也存储下来。第二次访问,就可以直接从 缓存中读取。
3、分库分表 + 水平拆分(MySQL集群)
但是随着社会的发展,要存储数据的类型(音乐,视频,地理位置,人际交往圈、用户自己产生的数 据,用户日志等)也越来越繁多,数据量也爆发式增长。这样MySQL等关系型数据库就越来越不够用 了!NoSQL数据库就开始进入人们的视野!NoSQL数据库可以很好的解决这些问题。
4、什么是NoSQL
NoSQL(Not Only SQL)泛指非关系型数据库。 NoSQL的特点
- 方便扩展(数据之间没有关系)
- 大数据量高性能(Redis写8w/s, 读11w/s,NoSQL的缓存记录级是一种细粒度的,性能会更高)
- 数据类型是多样型的! 不需要事先设计数据库,随取随用
- 存储方式多样, 键值对,列存储,文档存储,图形数据库
- 没有固定的查询语言
Redis基本工作原理
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务 器中的数据库状态也会消失。所以Redis提供了持久化的功能。
1、RDB (Redis DataBase)
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文 件直接读到内存中。
Redis会单独创建(fork)一个子进程来进程持久化,会先将数据写入到一个临时文件中,待持久化 过程都结束了,再用这个临时文件替换上一次持久化好的文件。整个过程中,主进程是不进行任何IO操 作的,这就确保了极高的性能。如果需要进程大规模数据的恢复,且对数据恢复的完整性不是非常敏 感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
rdb保存的文件是dump.rdb
触发机制
- save的规则满足的情况下,会自动触发rdb操作
- 执行flushall命令,会触发rdb操作
- 对出redis时,也会触发rdb操作
备份会自动生成也给dump.rdb文件
如何恢复rdb文件
只需要将rdb文件放在redis的启动目录下就可以。redis启动时会自动检查dump.rdb文件恢复其中的数据。
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/bin" //如果这个目录下存在dump.rdb文件,启动就会根据这个文件恢复数据
优点
- 适合大规模的数据恢复
- 对数据的完整性要求不高
缺点
- 需要一定的时间间隔进行操作,如果redis意外宕机,最后一次持久化后的操作数据就没有了
- fork进程的时候,会需要占用一定的内存空间
2、AOF(Append Only File)
将所有写操作的命令都记录下来,类似history,恢复时将所有的命令都执行一遍!
AOF保存的文件是appendonly.aof
如果这个aof文件被恶意修改,这个时候redis是启动不起来的,我们需要修复这个aof文件!
redis提供的一个工具 redis-check-aof --fix 来修改aof文件。
优点
- 每一次修改都同步,文件的完整性比较好
- 每秒同步一次,可能会丢失1s的数据
缺点
- 相对于数据文件来说,aof远远大于rdb
- 修复的速度比rdb慢
- AOF的运行效率也比rdb慢
Redis的五个基本类型
- 字符串 string
- 列表 list
- 集合 set
- 哈希 hash
- 有序集合 zset