`

redis存储类型以及持久化存储方式介绍

 
阅读更多
redis存储数据类型

与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多。最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set.

Redis内部使用一个redisObject对象来表示所有的key和value。redisObject最主要的信息:type代表一个 value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一 个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前 提是这个字符串本身可以用数值表示,比如:"123" "456"这样的字符串。这里需要特殊说明一下vm字段,只有打开了Redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的。通过 Figure1我们可以发现Redis使用redisObject来表示所有的key/value数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给Redis不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用。下面我们先来逐一的分析下这五种数据类型的使用和内部实现方式。

1)String
常用命令:set/get/decr/incr/mget等;
应用场景:String是最常用的一种数据类型,普通的key/value存储都可以归为此类;
实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
2)Hash
常用命令:hget/hset/hgetall等
应用场景:我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;
实现方式:Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如图2所示,Key是用户 ID, value是一个Map。这个Map的key是成员的属性名,value是属性值。这样对数据的修改和存取都可以直接通过其内部Map的 Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据。当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存 储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成 真正的HashMap,此时encoding为ht。
3)List
常用命令:lpush/rpush/lpop/rpop/lrange等;
应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;
实现方式:Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
4)Set
常用命令:sadd/spop/smembers/sunion等;
应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的;
实现方式:set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
5)Sorted Set
常用命令:zadd/zrange/zrem/zcard等;
应用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的 是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

redis持久化存储方式
Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。

Redis的AOF日志
Redis支持将当前数据的快照存成一个数据文件的持久化机制,即RDB快照。这种方法是非常好理解的,但是一个持续写入的数据库如何生成快照呢?Redis借助了fork命令的copy on write机制。在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件。
我们可以通过Redis的save指令来配置RDB快照生成的时机,比如你可以配置当10分钟以内有100次写入就生成快照,也可以配置当1小时内有 1000次写入就生成快照,也可以多个规则一起实施。这些规则的定义就在Redis的配置文件中,你也可以通过Redis的CONFIG SET命令在Redis运行时设置规则,不需要重启Redis。
Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的,当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件 中,然后通过原子性rename系统调用将临时文件重命名为RDB文件,这样在任何时候出现故障,Redis的RDB文件都总是可用的。同时,Redis 的RDB文件也是Redis主从同步内部实现中的一环。
但是,我们可以很明显的看到,RDB有他的不足,就是一旦数据库出现问题,那么我们的RDB文件中保存的数据并不是全新的,从上次RDB文件生成到 Redis停机这段时间的数据全部丢掉了。在某些业务下,这是可以忍受的,我们也推荐这些业务使用RDB的方式进行持久化,因为开启RDB的代价并不高。 但是对于另外一些对数据安全性要求极高的应用,无法容忍数据丢失的应用,RDB就无能为力了,所以Redis引入了另一个重要的持久化机制:AOF日志。
Redis的AOF日志
AOF日志的全称是append only file,从名字上我们就能看出来,它是一个追加写入的日志文件。与一般数据库的binlog不同的是,AOF文件是可识别的纯文本,它的内容就是一个个 的Redis标准命令。当然,并不是发送发Redis的所有命令都要记录到AOF日志里面,只有那些会导致数据发生修改的命令才会追加到AOF文件。那么每一条修改数据的命令都生成一条日志,那么AOF文件是不是会很大?答案是肯定的,AOF文件会越来越大,所以Redis又提供了一个功能,叫做AOF rewrite。其功能就是重新生成一份AOF文件,新的AOF文件中一条记录的操作只会有一次,而不像一份老文件那样,可能记录了对同一个值的多次操 作。其生成过程和RDB类似,也是fork一个进程,直接遍历数据,写入新的AOF临时文件。在写入新文件的过程中,所有的写操作日志还是会写到原来老的 AOF文件中,同时还会记录在内存缓冲区中。当重完操作完成后,会将所有缓冲区中的日志一次性写入到临时文件中。然后调用原子性的rename命令用新的 AOF文件取代老的AOF文件。
AOF是一个写文件操作,其目的是将操作日志写到磁盘上,所以它也同样会遇到我们上面说的写操作的5个流程。那么写AOF的操作安全性又有多高呢。实际上 这是可以设置的,在Redis中对AOF调用write(2)写入后,何时再调用fsync将其写到磁盘上,通过appendfsync选项来控制,下面 appendfsync的三个设置项,安全强度逐渐变强。
1)appendfsync no
当设置appendfsync为no的时候,Redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了。对大多数Linux操作系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上。
2)appendfsync everysec
当设置appendfsync为everysec的时候,Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。但是当这一次的 fsync调用时长超过1秒时。Redis会采取延迟fsync的策略,再等一秒钟。也就是在两秒后再进行fsync,这一次的fsync就不管会执行多 长时间都会进行。这时候由于在fsync时文件描述符会被阻塞,所以当前的写操作就会阻塞。所以结论就是,在绝大多数情况下,Redis会每隔一秒进行一 次fsync。在最坏的情况下,两秒钟会进行一次fsync操作。这一操作在大多数数据库系统中被称为group commit,就是组合多次写操作的数据,一次性将日志写到磁盘。
3)appednfsync always
当设置appendfsync为always时,每一次写操作都会调用一次fsync,这时数据是最安全的,当然,由于每次都会执行fsync,所以其性能也会受到影响。

分享到:
评论

相关推荐

    redis 可持久化 Key-Value数据库

    Redis的持久化机制主要有两种方式:RDB(Redis Database Backup)和AOF(Append Only File)。RDB是在特定时间点对数据库进行快照保存,生成一个纯二进制文件,这种方式持久化效率高,恢复速度快,但可能会丢失最近...

    redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用

    Redis 提供了两种持久化方式:RDB 和 AOF。 * RDB 持久化:将 Redis 的数据快照保存到磁盘上,可以通过 SAVE 或 BGSAVE 命令触发。 * AOF 持久化:将 Redis 的每条命令记录到日志文件中,可以通过 BGREWRITEAOF ...

    数据不丢失:Redis RDB与AOF持久化深度解析

    2. **持久化**:尽管 Redis 是一个内存数据库,但它提供了持久化机制,可以将内存中的数据保存到磁盘,防止数据丢失。 3. **支持事务**:Redis 支持简单的事务功能,可以保证操作的原子性。 4. **丰富的数据类型**:...

    redis 和 redis 可视化工具

    2. **数据持久化**:Redis 提供了AOF(Append Only File)和RDB(Snapshotting)两种持久化方式,确保即使在系统崩溃后也能恢复数据。 3. **主从复制**:支持主从复制,可以实现数据冗余和故障切换,提高系统的可用...

    Redis数据类型视频

    在本课程中,你将了解Redis是什么、能干什么、如何用,了解NoSQL的使用场景和概念,快速掌握Redis的安装配置、五大数据类型、常用操作命令、Redis持久化、主从复制、事务控制以及用Jedis操作进行Java开发等知识。...

    redis 缓存技术学习笔记

    2. **数据持久化**:Redis支持数据的持久化存储,可以通过定期将数据写入磁盘或者追加日志的方式来实现,而Memcached只支持纯内存存储。 3. **主从复制**:Redis支持主从复制机制,允许数据在多个服务器之间同步,...

    Redis下载以及Redis可视化工具下载

    本教程将详细介绍如何下载Redis以及推荐几个实用的Redis可视化工具。 一、Redis的下载 1. 访问官方网站:首先,你需要访问Redis的官方网站,地址是`http://redis.io/download`。在网站上,你可以找到最新的稳定...

    redis可视化工具

    3. **持久化**:提供RDB和AOF两种持久化方式,确保数据安全。 4. **事务支持**:可以原子地执行多个操作。 5. **网络通信协议兼容**:使用简单明了的RESP(Redis序列化协议)与客户端交互。 **redis-desktop-...

    Redis介绍的课件

    Redis提供了RDB(Redis Database)和AOF(Append Only File)两种持久化方式。RDB通过创建数据集的快照进行持久化,适合大规模数据恢复但可能会丢失最近的数据更改。而AOF则是记录每一个写操作命令,数据恢复更安全...

    Redis实战_Redis实战中文完整版_Redis快速入门_Redis数据类型及操作_Redis常用

    4. **Redis持久化**:为了防止数据丢失,Redis提供了两种持久化方式:RDB(快照)和AOF(Append Only File)。这两种方式的原理、优缺点和应用场景会在书中进行深入解析。 5. **Redis复制**:通过主从复制,可以...

    redis介绍.pdf

    2. 数据持久化 – Redis 支持数据的持久化 3. 数据备份 – Redis 支持数据的备份 4. 集群支持 – Redis 支持集群模式 Redis 是一个高性能的 key-value 数据库,具有丰富的数据结构、原子性、支持订阅和发布、支持...

    Redis(开源,持久性的键值对存储数据库)

    1. **内存存储与持久化**: Redis以其在内存中的存储方式实现了极高的读写速度,使得数据处理效率非常高。同时,为了防止数据丢失,Redis提供了多种持久化策略,包括RDB(快照)和AOF(Append Only File),以及混合...

    redis安装包和redis图形化工具

    Redis是一款高性能的键值数据库,常用于数据缓存、消息队列和数据持久化等多个场景。它以键值对的形式存储数据,支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。本资源包含Redis的安装包和一个图形化...

    Redis启动,数据结构存储系统

    Redis,全称Remote Dictionary Server,是一款高性能的键值对存储系统,被广泛应用于缓存、数据库、消息中间件等...在实际应用中,应根据具体需求选择合适的数据结构,合理配置持久化方式,以及优化Redis的各项设置。

    redis 数据类型详解 以及 redis适用场景场合

    Redis可以存储用户会话信息,利用其持久化功能确保会话数据的安全性,同时也能够快速检索会话信息。 #### 任务队列 通过Redis的列表结构,可以很容易地实现任务队列的功能,支持先进先出(FIFO)和后进先出(LIFO)...

    Redis的持久化方案.pdf(两种持久化方案:RDB 和 AOF,共15页)

    RDB方式按照一定的时间间隔对数据集创建基于时间点的快照,是Redis的默认持久化方式。这种方式可以理解为半持久化模式,即按照一定的策略周期性地将数据保存到磁盘。 **优点** 1. **紧凑的备份**: RDB是Redis数据...

    使用 Redis 存储用户和他们的帖子.zip

    性能优化:根据需要使用 Redis 的持久化、分区等功能。 数据一致性:在设计系统时考虑数据一致性,例如使用事务或 Lua 脚本来保证操作的原子性。 这个示例提供了一个基本的框架,你可以根据实际需求进行扩展和优化。

    redis介绍文档学习

    ### Redis介绍文档学习...以上就是关于Redis的基本介绍、特点、优势、与Memcached的对比、持久化机制、主从复制、哨兵以及集群架构的相关知识点。通过学习这些内容,初学者可以更好地理解Redis的工作原理和应用场景。

    redis持久化和内存策略1

    然而,内存中的数据在服务器断电或宕机后会丢失,因此,为了保证数据的持久性,Redis 提供了两种持久化策略:RDB(Redis Database Backup)模式和AOF(Append Only File)模式。 **RDB 模式** RDB 是一种快照式的...

    Redis入门指南(第2版)电子书

    以通俗易懂的方式介绍了Redis基础与实践方面的知识,包括历史与特性、在开发和生产环境中部署运行Redis、数据类型与命令、使用Redis实现队列、事务、复制、管道、持久化、优化Redis存储空间等内容,并采用任务驱动的...

Global site tag (gtag.js) - Google Analytics