redis简要介绍
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构
Page 11
11
Redis特点
原子操作 Redis对不同数据类型的操作是原子的,因此设置或增加key值,从一 个集合中增加或删除一个元素都能安全的操作。 支持多种语言 Redis支持多种语言,诸如Ruby, Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure等。 主-从复制 Redis支持简单而快速的主-从复制。官方提供了一个数据,Slave在21 秒即完成了对Amazon网站10G key set的复制。
Page 3
3
RDBMS适用情景
数据定义高度结构化的情景(关系结构严谨,字段固定) 数据一致性要求高的情景(事物要求) 数据实时性要求不高(无数据大量写入,查询返回结果实 时性要求不高)
无需进行过多索引更改(添加或删除)的表
Page 4
4
RDBMS所不擅长的情景
大量数据的写入处理(磁盘I/O) 为有数据更新的表做索引或表结构(schema)变更 对简单查询需要快速返回结果的处理(实时要求高) 字段不固定时应用(数据结构为半结构化数据)
Page 23
23
来自百度文库 AOF过程
保存过程如下
1. redis调用fork ,现在有父子两个进程
2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命 令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。 4.当子进程把快照内容以命令方式写入临时文件中后,子进程发信号通知父进程。然后 父进程把缓存的写命令也写入到临时文件。 5.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始 往新的aof文件中追加。
Sharding
很容易将数据分布到多个Redis实例中,但这主要看该语言是否支持。 目前支持Sharding功能的语言只有PHP、Ruby和Scala。
Page 12
12
Redis适用场景
数据结构不固定的半结构化数据 读写请求数量大且实时性要求高 后台RDB数据库压力大,需要缓存的情况 数据结构复杂,需要与应用程序内数据结构相对应的情况
Page 7
7
NoSQL基本原理
CAP理论: Consistency(一致性), 数据一致更新,数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容错性) 可靠性 关系数据库的ACID模型拥有高一致性 + 可用性 很难进行分 区: Atomicity原子性:一个事务中所有操作都必须全部完成, 要么全部不完成。 Consistency一致性. 在事务开始或结束时,数据库应该在 一致状态。 Isolation隔离层. 事务将假定只有它自己在操作数据库,彼 此不知晓。 Durability. 一旦事务完成,就不能返回。
list的最大长度是2^32-1个元素
Page 16
16
set类型
set就是redis string的无序集合,不允许有重复元素 set的最大元素数是2^32-1 对set的操作还有交集、并集、差集等
Page 17
17
zset类型
zset是set的一个升级版本,在set的基础上增加了一个顺序 属性,这一属性在添加修改元素时可以指定,每次指定后 zset会自动安装指定值重新调整顺序。可以理解为一张表, 一列存value,一列存顺序。操作中的key理解为zset的名字。 zset的最大元素数是2^32-1。
Redis简要介绍
朱自升
2016.06.25
主要内容
RDBMS发展现状及适用情景
NoSQL的出现,NoSQL基本原理
Redis简介及应用场景 Redis基本数据结构及重要操作 Redis命令总结 Jedis:Java-Redis
操作实践:简单博客系统
Page 2
2
RDBMS现状及适用情景
从1969年,埃德加发表关系数据模型论文开始,以 MySQL,Oracle,Sybase,PostgreSQL 为代表的传统关 系数据库在过去的 20 多年里得到了广泛应用。 SQL是一种用于数据查询的描述型语言。SQL允许用户透 明的执行查询,不需要考虑数据在哪块儿磁盘上,使用何 种算法来处理数据。大多数RDBMS都有一个重要的架构组 件:查询优化器。 关系数据库遵循关系数据模型,关系模型中不同现实世界 的实体被存储到不同的表格中。 关系模型和SQL的结合很紧密,并且定义了高度结构化的 实体以及实体之间的关系。SQL的查询模型支持用户透明 的数据访问。
3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程 退出。
缺点
是定时快照只是代表一段时间内的内存映像,所以系统重启会丢失上次快照与重启 之间所有的数据。
Page 22
22
基于语句追加方式(aof)
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将 每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。 当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库 的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到 磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通 过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。 有三种方式如下(默认是:每秒fsync一次)
Page 19
19
持久化机制
redis一共支持四种持久化方式,分别是:
1. 定时快照方式(snapshot) ——默认方式 2. 基于语句追加文件的方式(aof) 3. 虚拟内存(vm) ——已放弃 4. Diskstore方式 ——实验中
前两种是基于全部数据都在内存中,即小数据量下提供磁 盘落地功能 后两种方式则是作者在尝试存储数据超过物理内存时,即 大数据量的数据存储,后两种持久化方式仍然是在实验阶 段,并且vm方式基本已经被作者放弃 实际能在生产环境用的只有前两种,换句话说redis目前还 只能作为小数据量存储(全部数据能够加载在内存中), 海量数据存储方面并不是redis所擅长的领域
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save 60 10000
Page 21
21
快照过程
保存过程如下
1.redis调用fork,现在有子进程和父进程。
2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复 制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为 父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据 是fork时刻整个数据库的一个快照。
对于已经有序的zset,仍然可以使用sort命令,通过指定 asc|desc参数对其进行排序。
Page 18
18
hash类型
redis Hash类型对数据域和值提供了映射,这一结构很方便 表示对象 在Hash中可以只保存有限的几个“域”,而不是将所有的 “域”作为key,这可以节省内存
Page 5
5
主要内容
RDBMS发展现状及适用情景
NoSQL的出现,NoSQL基本原理
Redis简介及应用场景 Redis基本数据结构及重要操作 Redis命令总结 实际操作实验:简单博客系统
Page 6
6
NoSQL简介
NoSQL:No!SQL还是Not Only SQL? NoSQL基本分类:列式数据库,键值数据库,文档数据库, 图数据库 NoSQL基于的基本原理:CAP,BASE,最终一致性
Page 8
8
NoSQL基本原理
BASE模型:反ACID模型,完全不同于ACID模型,牺牲高 一致性,获得可用性或可靠性: Basically Available基本可用。 Soft state软状态 状态可以有一段时间不同步,异步。 Eventually consistent最终一致,最终数据是一致的就可以 了,而不是时时高一致
string类型的值也可视为integer,从而可以让“incr”命令族 操作,这种情况下,该integer的值限制在64位有符号数
在list、set和zset中包含的独立的元素类型都是string类型
Page 15
15
list类型
redis的list类型其实就是一个每个子元素都是string类型的 双向链表,所以[lr]push和[lr]pop命令的算法时间复杂度都 是O(1),另外list会记录链表的长度,所以llen操作也是O(1). 可以通过push,pop操作从链表的头部或者尾部添加删除元 素。这使得list既可以用作栈,也可以用作队列
Page 10
10
Redis特点
速度快 Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度 非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写 速度分别达到81000/s和110000/s。 持久化 由于所有数据保持在内存中(2.0版本开始可以只将部分数据的value放 在内存,见“虚拟内存”),所以对数据的更新将异步地保存到磁盘 上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。 数据结构
持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保 存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实 文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了 bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。
Page 20
20
定时快照方式(snapshot)
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文 件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。可以配置 redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置
Page 13
13
数据类型及操作方法
string(字符串) list(双向链表) set(无序集合) zset(有序集合)
hash(hash表)
Page 14
14
string类型
string是redis最基本的类型,而且string类型是二进制安全 的。意思是redis的string可以包含任何数据。比如jpg图片 或者序列化的对象 从内部实现来看其实string可以看作byte数组,最大上限是 1G字节
Page 9
9
Redis简介
2008年开始开发,2009年完成,作者Salvatore Sanfilippo Redis官网是这么描述的: Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. Redis是一个开源的使用ANSIC语言编写、支持网络、可基 于内存亦可持久化的日志型、Key-Value数据库,并提供多 种语言的API。从2010年3月15日起,Redis的开发工作由 VMware主持。
appendonly yes
# appendfsync always appendfsync everysec # appendfsync no
//启用aof持久化方式
//每次收到写命令就立即写盘,最慢,但保证完全的持久化,不推荐使用 //每秒钟强制写入磁盘一次,推荐
//完全依赖os,性能最好,持久化没保证