初识Redis

227 阅读5分钟
1. Redis介绍

Redis是一个远程内存数据库,是一种速度非常快的非关系型数据库(non-relational database),它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片(client-side sharding)来扩展写性能,用户可以很方便地将Redis扩展成一个能够包含数百GB数据,每秒处理百万次请求的系统。

分片是一种将数据划分为多个部分的方法,对数据的划分可以基于键包含的ID,基于键的散列值,或者基于以上两者的某种组合。通过对数据进行分片,用户可以将数据存储到多台机器里面,也可以从多台机器里面获取数据,这种方法在解决某些问题时可以获得线性级别的性能提升。

2. 与其它数据库和软件对比

如果你熟悉关系数据库,那么你肯定写过用来关联两个表的数据的sql查询。而Redis则属于人们常说的NoSQL数据库或者非关系数据库:Redis不用表,它的数据库也不会预定义或者强制去要求用户对Redis存储的不同数据进行关联。

高性能键值缓存服务器memcached也经常被拿来和Redis比较:这两者都可以用于存储键值映射,彼此的性能也相差无几,但是Redis能够自动以两种不同的方式将数据写入硬盘,并且Redis除了能存储普通的字符串键之外,还可以存储其他4种数据结构(列表,集合,散列表,有序集合),而memcached只能存储普通的字符串键,这些不同之处使得Redis可以用于解决更为广泛的问题,并且既可以用作主数据库(primary database)使用,又可以作为其他存储系统的辅助数据库(auxiliary database)使用。

3. 一些数据库和缓存的区别
名称
类型
数据存储选项
查询类型附加功能
Redis
使用内存存储(in-memory)的非关系型数据库
字符串、列表、集合、散列表、有序集合
每种数据类型都有自己的专属命令,另外还有批量操作和不完全的事务支持
发布与订阅,主从复制,持久化,脚本
memcached
使用内存存储的键值缓存
键值之间的映射
创建、读取、更新、删除以及其他几个命令为提升性能而设的多线程服务器
MySQL
关系型数据库
每个数据库可以包含从多个表,每个表可以包含对个行:可以处理多个表的视图;支持空间和第三方扩展
SELECT、INSERT、UPDATE、DELETE函数,存储过程
支持ACID性质(需要使用Innodb),主从复制和主主复制
PostgreSQL
关系型数据库
每个数据库可以包含从多个表,每个表可以包含对个行:可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型SELECT、INSERT、UPDATE、DELETE内置函数,自定义的存储过程支持ACID性质,由第三方支持的多主复制
MongoDB
使用硬盘存储(on-disk)的非关系文档存储
每个数据库可以包含从多个表,每个表可以包含多个无schema的BSON文档创建、读取、更新、删除、条件查询等命令支持map-reduce操作,主从复制,分片,空间索引


4. 附加特性

在使用类似Redis这样的内存数据库时,一个首先要考虑的问题就是“当服务器被关闭时,服务器存储的数据将何去何从呢?” Redis拥有两种不同形式的持久化方法,他们都是可以用小而紧凑的格式将是存储在内存中的数据写入硬盘:第一种持久方法为时间点转储,转储操作既可以在“指定时间段内有指定数量的写操作执行” 这一条件被满足时执行,又可以通过调用两条转储到硬盘命令中的任何一条执行;第二种持久方法将所有修改了数据库的命令都写入一个只追加文件里面,用户可以根据数据的重要程度,将只追加写入设置为从不同步、每秒同步一次或者每写入一个命令就同步一次。

另外。尽管Redis的性能很好,但受限于Redis的内存存储设计,有时候只使用一台Redis服务器可能没有办法处理所有的请求。因此,为了扩展Redis的读性能,并为Redis提供故障转移支持,Redis实现了主从复制特性:执行复制的从服务器会链接上主服务器,接收主服务器的从服务器去执行,从而实时地更新从服务器的数据集。因为从服务器包含的数据会不断地进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。

扫码关注我们
在编程的路上,希望越走越远!