Redis:基础
简介
Redis 是一种运行在内存中数据结构存储,可用作 数据库 缓存 消息中间件。Redis 是键值型数据库。
特点
- 支持数据的持久化,可将内存中的数据保存在磁盘中,重启后可再次加载使用;
- 是基于内存的,因此读写性能极高,其读写速度约是关系型数据库的几倍至几十倍。其读的速度是十一万次每秒,写的速度是八万次每秒;
- 丰富的数据类型;
- 所有的操作都是原子性的,且支持流水线(pipline)技术;
- 丰富的特性,支持 publish / subscribe 通知 key 过期等特性。
数据类型
- String:字符串,二进制安全,可以接受任何格式的数据,例如 jpeg 图像数据或者 json 对象描述信息等。数据长度是 512M;
- List:按照插入顺序排序的字符串链表,类似 Java 中的 LinkedList;
- Set:无序的字符串集合,类型 Java 中的 HashSet;
- Sorted Set:字符串集合,和 Redis Sets 类似,区别是 Sorted Sets 中的每一个成员都有一个分数 (score)与之关联,通过分数的大小对成员进行排序,虽然 Sorted Sets 成员必须是唯一的,但是分数可以重复;
- Hash:类似 Java 中的 HashMap,键值都是字符串;
- Bit array (or simply bitmaps):位图,官方解释是 it is possible, using special commands, to handle String values like an array of bits: you can set and clear individual bits, count all the bits set to 1, find the first set or unset bit, and so forth.
- HyperLogLog:是一个概率数据结构,用于估计集合的基数,官方解释是 this is a probabilistic data structure which is used in order to estimate the cardinality of a set.
- Stream:流,官方解释是 append-only collections of map-like entries that provide an abstract log data type.
前五种比较常用,后面两种主要用于海量数据计算,最后一种用于消息队列。
数据持久化
- RDB 持久化:在指定的时间间隔内将内存中的数据集快照写入磁盘;
- AOF 持久化:以日志的形式记录服务器所处理的每一个写操作(append only file),Redis 服务器启动之初会以读取该日志文件构建数据库;
Redis 可以采用上面任意一种,也可以同时采用两种,也可以禁用持久化机制。
RDB 优点
- 数据的备份和恢复非常方便,因为一个数据库只有一个持久化文件;
- 性能最大化。对于 Redis 的服务进程而言,在开始持久化时,它唯一需要做的只是 fork 出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行 IO 操作了;
- 相比于 AOF 机制,如果数据集很大,RDB 的启动效率会更高。
RDB 缺点
- 系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失;
- 由于 RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
AOF 优点
- 该机制可以带来更高的数据安全性,即数据持久性。Redis 中提供了3种同步策略,即每秒同步、每修改同步和不同步;
- 对日志文件的写入操作采用的是 append 模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容;
- 如果日志过大,Redis 可以自动启用 rewrite 机制迅速瘦身(也可手动触发aof的rewrite操作,命令:bgrewriteaof)
- AOF日志格式清晰、易于理解,很容易用 AOF 日志文件完成数据的重建
AOF 缺点
- 对于相同数量的数据集而言,AOF 文件通常要大于 RDB 文件;
- 根据同步策略的不同,AOF 在运行效率上往往会慢于 RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和 RDB 一样高效。
参考:
Redis 官网文档 https://redis.io/topics/introduction