设为首页 加入收藏

TOP

[redis]redis概述(一)
2015-02-03 04:25:34 】 浏览:277
Tags:redis 概述

Redis是一个开源支持网络基于内存、可持久化日志型、key-value键值对数据库,使用ANSI C编写。并提供多种语言的API。

特性

速度快

Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和110000/s。

持久化

由于所有数据保持在内存中,所以对数据的更新将异步地保存到磁盘上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。

数据结构

可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构。

自动操作

Redis对不同数据类型的操作是自动的,因此设置或增加key值,从一个集合中增加或删除一个元素都能安全的操作。

支持多种语言

Redis支持多种语言,诸如Ruby, Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure等。

主-从复制

Redis支持简单而快速的主-从复制。官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。

Sharding

很容易将数据分布到多个Redis实例中,但这主要看该语言是否支持。目前支持Sharding功能的语言只有PHP、Ruby和Scala。

性能

当数据依赖不再需要,Redis这种基于内存的性质,与在执行一个事务时将每个变化都写入硬盘的数据库系统相比就显得执行效率非常高。写与读操作速度没有明显差别。

数据类型

Redis的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis中值的类型不仅限于字符串,还支持这些抽象数据类型:string,list,set,zset,hash.值的类型决定了值本身支持的操作。Redis支持不同无序、有序的列表,无序、有序的集合间的交集、并集等高级服务器端原子操作。

string字符串

string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

从内部实现来看其实string可以看作byte数组,最大上限是1G字节。string类型的值也可视为integer,从而可以让“incr”命令族操作,这种情况下,该integer的值限制在64位有符号数

在list、set和zset中包含的独立的元素类型都是string类型

list双向链表

redis的list类型其实就是一个每个子元素都是string类型的双向链表所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1),另外list会记录链表的长度,所以llen操作也是O(1).可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。

list的最大长度是2^32-1个元素,约等于4亿个。

set无序不重复集合

set就是redis string的无序集合,不允许有重复元素。对set的操作有交集、并集、差集等

set的最大元素数是2^32-1,约等于4亿。

zset有序不重复集合

zset是set的一个升级版本,set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安照指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。

zset的最大元素数是2^32-1,约等于4亿。

对于已经有序的zset,仍然可以使用sort命令,通过指定asc|desc参数对其进行排序。

hast表

键、值都为字符串的哈希表(hash)。redis Hash类型对数据域和值提供了映射,这一结构很方便表示对象。

在Hash中可以只保存有限的几个“域”,而不是将所有的“域”作为key,这可以节省内存

同步

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

主从复制

Redis的复制功能是完全建立在基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你的系统内存容量规划――物理内存使用量不要超过3/5

配置slave服务器很简单,只需要在配置文件中加入如下配置

slaveof 192.168.1.1 6379 #指定master的ip和端口

下面是关于redis主从复制的一些特点

lmaster可以有多个slave除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。

主从复制的过程

当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完成写文件后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。接着master就会把缓存的命令转发给slave。而且后续master收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从client发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自动重新建立连接。如果master同时收到多个slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。

Redis复制流程在Slave和Master端各自是一套状态机流转,涉及的状态信息是:

Slave 端:

REDIS_REPL_NONEREDIS_REPL_CONNECTREDIS_REPL_CONNECTED

Master端:

REDIS_REPL_WAIT_BGSAVE_STARTREDIS_REPL_WAIT_BGSAVE_ENDREDIS_REPL_SEND_BULKREDIS_REPL_ONLINE

整个状态机流程过程如下:

Slave端在配置文件中添加了slave of指令,于是Slave启动时读取配置文件,初始状
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【MongoDB】数组和范围查询的相互.. 下一篇数据库节点二VIP异常故障分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目