redis简要介绍_第1页
redis简要介绍_第2页
redis简要介绍_第3页
redis简要介绍_第4页
redis简要介绍_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Redis简要介绍简要介绍 朱自升 2016.06.25 Page 2 2 主要内容主要内容 RDBMS发展现状及适用情景 NoSQL的出现,NoSQL基本原理 Redis简介及应用场景 Redis基本数据结构及重要操作 Redis命令总结 Jedis:Java-Redis 操作实践:简单博客系统 Page 3 3 RDBMS现状及适用情景现状及适用情景 从1969年,埃德加发表关系数据模型论文开始,以 MySQL,Oracle,Sybase,PostgreSQL 为代表的传统关 系数据库在过去的 20 多年里得到了广泛应用。 SQL是一种用于数据查询的描述型语言。SQL允许用户透 明的执行查

2、询,不需要考虑数据在哪块儿磁盘上,使用何 种算法来处理数据。大多数RDBMS都有一个重要的架构组 件:查询优化器。 关系数据库遵循关系数据模型,关系模型中不同现实世界 的实体被存储到不同的表格中。 关系模型和SQL的结合很紧密,并且定义了高度结构化的 实体以及实体之间的关系。SQL的查询模型支持用户透明 的数据访问。 Page 4 4 RDBMS适用情景适用情景 数据定义高度结构化的情景(关系结构严谨,字段固定) 数据一致性要求高的情景(事物要求) 数据实时性要求不高(无数据大量写入,查询返回结果实 时性要求不高) 无需进行过多索引更改(添加或删除)的表 Page 5 5 RDBMS所不擅长的

3、情景所不擅长的情景 大量数据的写入处理(磁盘I/O) 为有数据更新的表做索引或表结构(schema)变更 对简单查询需要快速返回结果的处理(实时要求高) 字段不固定时应用(数据结构为半结构化数据) Page 6 6 主要内容主要内容 RDBMS发展现状及适用情景 NoSQL的出现,NoSQL基本原理 Redis简介及应用场景 Redis基本数据结构及重要操作 Redis命令总结 实际操作实验:简单博客系统 Page 7 7 NoSQL简介简介 NoSQL:No!SQL还是Not Only SQL? NoSQL基本分类:列式数据库,键值数据库,文档数据库, 图数据库 NoSQL基于的基本原理:C

4、AP,BASE,最终一致性 Page 8 8 NoSQL基本原理基本原理 CAP理论: Consistency(一致性), 数据一致更新,数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容错性) 可靠性 关系数据库的ACID模型拥有高一致性 + 可用性 很难进行分 区: Atomicity原子性:一个事务中所有操作都必须全部完成, 要么全部不完成。 Consistency一致性. 在事务开始或结束时,数据库应该在 一致状态。 Isolation隔离层. 事务将假定只有它自己在操作数据库,彼 此不知晓。 Durability.

5、一旦事务完成,就不能返回。 Page 9 9 NoSQL基本原理基本原理 BASE模型:反ACID模型,完全不同于ACID模型,牺牲高 一致性,获得可用性或可靠性: Basically Available基本可用。 Soft state软状态 状态可以有一段时间不同步,异步。 Eventually consistent最终一致,最终数据是一致的就可以 了,而不是时时高一致 Page 10 10 Redis简介简介 2008年开始开发,2009年完成,作者Salvatore Sanfilippo Redis官网是这么描述的: Redis is an open source, advanced k

6、ey-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主持。 Page 11 11 Redis特点特点 速度快 Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度

7、非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写 速度分别达到81000/s和110000/s。 持久化 由于所有数据保持在内存中(2.0版本开始可以只将部分数据的value放 在内存,见“虚拟内存”),所以对数据的更新将异步地保存到磁盘 上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。 数据结构 可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构 Page 12 12 Redis特点特点 原子操作 Redis对不同数据类型的操作是原子的,因此设置或增加key值,从一 个集合中增加或删除一个元素都能安全的操作。 支持多种语言 Red

8、is支持多种语言,诸如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。 Page 13 13 Redis适用场景适用场景 数据结构不固定的半结构化数据 读写请求数量大且实时性要求高

9、后台RDB数据库压力大,需要缓存的情况 数据结构复杂,需要与应用程序内数据结构相对应的情况 Page 14 14 数据类型及操作方法数据类型及操作方法 string(字符串) list(双向链表) set(无序集合) zset(有序集合) hash(hash表) Page 15 15 string类型类型 string是redis最基本的类型,而且string类型是二进制安全 的。意思是redis的string可以包含任何数据。比如jpg图片 或者序列化的对象 从内部实现来看其实string可以看作byte数组,最大上限是 1G字节 string类型的值也可视为integer,从而可以让“in

10、cr”命令族 操作,这种情况下,该integer的值限制在64位有符号数 在list、set和zset中包含的独立的元素类型都是string类型 Page 16 16 list类型类型 redis的list类型其实就是一个每个子元素都是string类型的 双向链表,所以lrpush和lrpop命令的算法时间复杂度都 是O(1),另外list会记录链表的长度,所以llen操作也是O(1). 可以通过push,pop操作从链表的头部或者尾部添加删除元 素。这使得list既可以用作栈,也可以用作队列 list的最大长度是232-1个元素 Page 17 17 set类型类型 set就是redis s

11、tring的无序集合,不允许有重复元素 set的最大元素数是232-1 对set的操作还有交集、并集、差集等 Page 18 18 zset类型类型 zset是set的一个升级版本,在set的基础上增加了一个顺序 属性,这一属性在添加修改元素时可以指定,每次指定后 zset会自动安装指定值重新调整顺序。可以理解为一张表, 一列存value,一列存顺序。操作中的key理解为zset的名字。 zset的最大元素数是232-1。 对于已经有序的zset,仍然可以使用sort命令,通过指定 asc|desc参数对其进行排序。 Page 19 19 hash类型类型 redis Hash类型对数据域和值

12、提供了映射,这一结构很方便 表示对象 在Hash中可以只保存有限的几个“域”,而不是将所有的 “域”作为key,这可以节省内存 Page 20 20 持久化机制持久化机制 redis一共支持四种持久化方式,分别是: 定时快照方式(snapshot) 默认方式 基于语句追加文件的方式(aof) 虚拟内存(vm) 已放弃 Diskstore方式 实验中 前两种是基于全部数据都在内存中,即小数据量下提供磁 盘落地功能 后两种方式则是作者在尝试存储数据超过物理内存时,即 大数据量的数据存储,后两种持久化方式仍然是在实验阶 段,并且vm方式基本已经被作者放弃 1.实际能在生产环境用的只有前两种,换句话说

13、redis目前还 只能作为小数据量存储(全部数据能够加载在内存中), 海量数据存储方面并不是redis所擅长的领域 Page 21 21 定时快照方式定时快照方式(snapshot) n 快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文 件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。可以配置 redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置 save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save

14、 60 10000 Page 22 22 快照过程快照过程 保存过程如下保存过程如下 1.redis调用fork,现在有子进程和父进程。 2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复 制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为 父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据 是fork时刻整个数据库的一个快照。 3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程 退出。 缺点缺点 是定时快照只是代表一段时间内的内存映像,所以系统重启会丢失

15、上次快照与重启 之间所有的数据。 Page 23 23 基于语句追加方式基于语句追加方式(aof) aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将 每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。 当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库 的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到 磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通 过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。 有三种方式如下

16、(默认是:每秒fsync一次) appendonly yes /启用aof持久化方式 # appendfsync always /每次收到写命令就立即写盘,最慢,但保证完全的持久化,不推荐使用 appendfsync everysec /每秒钟强制写入磁盘一次,推荐 # appendfsync no /完全依赖os,性能最好,持久化没保证 持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保 存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实 文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了 bgre

17、writeaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。 Page 24 24 AOF过程过程 保存过程如下保存过程如下 1. redis调用fork ,现在有父子两个进程 2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令 3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命 令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。 4.当子进程把快照内容以命令方式写入临时文件中后,子进程发信号通知父进程。然后 父进程把缓存的写命令也写入到临时文件。 5.

18、现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始 往新的aof文件中追加。 缺点 log文件体积过大时系统重启恢复数据非常慢,几十G的数据可能要几小时才能加 载完;每条命令都要写log,读写性能会有所下降 Page 25 25 虚拟内存虚拟内存(vm) 虚拟内存方式是Redis来进行用户空间的数据换入换出的一 个策略,此种方式在实现的效果上比较差,主要问题是代 码复杂,重启慢,复制慢等等,目前已经被作者放弃。 Page 26 26 diskstore方式方式 diskstore方式是作者放弃了虚拟内存方式后选择的一种新 的实现方式,也就是传统的B-tree的方式,

19、目前仍在实验阶 段,后续是否可用我们可以拭目以待。 Page 27 27 主从复制主从复制 R e d i s 的 复 制 功 能 是 完 全 建 立 在 基 于 内 存 快 照 的 持 久 化 策 略 基 础 上 的, 也 就 是 说 无 论 你 的 持 久 化 策 略 选 择 的 是 什 么, 只 要 用 到 了 R e d i s 的 复 制 功 能, 就 一 定 会 有 内 存 快 照 发 生, 那 么 首 先 要 注 意 你 的 系 统 内 存 容 量 规 划 物 理 内 存 使 用 量 不 要 超 过 3 / 5 配 置 s l a v e 服 务 器 很 简 单, 只 需 要 在

20、 配 置 文 件 中 加 入 如 下 配 置 s l a v e o f 1 9 2. 1 6 8. 1. 1 6 3 7 9 # 指 定 m a s t e r 的 i p 和 端 口 下 面 是 关 于 r e d i s 主 从 复 制 的 一 些 特 点 1. m a s t e r 可 以 有 多 个 s l a v e 2. 除 了 多 个 s l a v e 连 到 相 同 的 m a s t e r 外, s l a v e 也 可 以 连 接 其 他 s l a v e 形 成 图 状 结 构 3. 主 从 复 制 不 会 阻 塞 m a s t e r。 也 就 是 说 当

21、 一 个 或 多 个 s l a v e 与 m a s t e r 进 行 初 次 同 步 数 据 时, m a s t e r 可 以 继 续 处 理 c l i e n t 发 来 的 请 求。 相 反 s l a v e 在 初 次 同 步 数 据 时 则 会 阻 塞 不 能 处 理 c l i e n t 的 请 求。 4. 主 从 复 制 可 以 用 来 提 高 系 统 的 可 伸 缩 性, 我 们 可 以 用 多 个 s l a v e 专 门 用 于 c l i e n t 的 读 请 求, 比 如 s o r t 操 作 可 以 使 用 s l a v e 来 处 理。 也

22、可 以 用 来 做 简 单 的 数 据 冗 余 5. 可 以 在 m a s t e r 禁 用 数 据 持 久 化, 只 需 要 注 释 掉 m a s t e r 配 置 文 件 中 的 所 有 s a v e 配 置, 然 后 只 在 s l a v e 上 配 置 数 据 持 久 化。 Page 28 28 主从复制过程主从复制过程 主从复制的过程 当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。 无论是第一次同步建立的连接还是连接断开后的重新连 接,master都会启 动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收 集

23、新的写命令并缓存起来。 后台进程完成写文件后,master就发送文件给slave,slave将文件保存到磁 盘上,然后加载到内存恢复数据库快照到slave上。 接着master就会把缓存的命 令转发给slave。而且后续master收到的写命令 都会通过开始建立的连接发送给slave。 1.从master到slave的同步数据的命令和从 client发送的命令使用相同的 协议格式。当master和slave的连接断开时slave可以自动重新建立连接。 如果master同时收到多个 slave发来的同步连接命令,只会使用启动一 个进程来写数据库镜像,然后发送给所有slave。 Page 29 2

24、9 主从复制过程主从复制过程 Redis复制流程在Slave和Master端各自是一套状态机流转, 涉及的状态信息是: Slave 端: REDIS_REPL_NONE REDIS_REPL_CONNECT REDIS_REPL_CONNECTED Master端: REDIS_REPL_WAIT_BGSAVE_START REDIS_REPL_WAIT_BGSAVE_END REDIS_REPL_SEND_BULK REDIS_REPL_ONLINE Page 30 30 主从复制过程主从复制过程 整个状态机流程过程如下: Slave端在配置文件中添加了slave of指令,于是Slave启

25、动时读取配置 文件,初始状态为REDIS_REPL_CONNECT。 Slave端在定时任务serverCron(Redis内部的定时器触发事件)中连接 Master,发送sync命令,然后等待master发送回其内存快照文件。 Master端收到sync命令简单判断是否有正在进行的内存快照子进程, 没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文 件发送给Slave端。 Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后, 清空内存表,重新读取Master发来的内存快照文件,重建整个内存表 数据结构,并最终状态置位为 REDIS_REPL_CONNECTED

26、状态, Slave状态机流转完成。 1.Master端在发送快照文件过程中,接收的任何会改变数据集的命令都 会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待 快照完成后,依次发给Slave,之后收到的命令相同处理,并将状态置位 为 REDIS_REPL_ONLINE。 Page 31 31 主从复制过程主从复制过程 Page 32 32 Redis复制机制的缺陷复制机制的缺陷 Slave从库在连接Master主库时,Master会进行内存快照, 然后把整个快照文件发给Slave,也就是没有象MySQL那 样有复制位置的概念,即无增量复制,这会给整个集群搭 建带来非常多的

27、问题 比如一台线上正在运行的Master主库配置了一台从库进行 简单读写分离,这时Slave由于网络或者其它原因与Master 断开了连接,那么当Slave进行重新连接时,需要重新获取 整个Master的内存快照,Slave所有数据跟着全部清除,然 后重新建立整个内存表,一方面Slave恢复的时间会非常慢, 另一方面也会给主库带来压力 Page 33 33 Redis复制机制缺陷的一种改进复制机制缺陷的一种改进 首先写Redis的AOF文件,并对这个AOF文件按文件大小进 行自动分割滚动,同时关闭Redis的Rewrite命令,然后会 在业务低峰时间进行内存快照存储,并把当前的AOF文件 位置

28、一起写入到快照文件中,这样我们可以使快照文件与 AOF文件的位置保持一致性,这样我们得到了系统某一时 刻的内存快照,并且同时也能知道这一时刻对应的AOF文 件的位置; 当从库发送同步命令时,我们首先会把快照文件发送给从 库,然后从库会取出该快照文件中存储的AOF文件位置, 并将该位置发给主库,主库会随后发送该位置之后的所有 命令,以后的复制就都是这个位置之后的增量信息了。 Page 34 34 Redis命令总结命令总结 对value操作的命令 对String操作的命令 对List操作的命令 对Set操作的命令 对zset(sorted set)操作的命令 对Hash操作的命令 Page 35

29、 35 对对value操作的命令操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key type(key):返回值的类型 keys(pattern):返回满足给定pattern的所有key randomkey:随机返回key空间的一个key rename(oldname, newname):将key由oldname重命名为newname,若 newname存在则删除newname表示的key dbsize:返回当前数据库中key的数目 expire:设定一个key的活动时间(s) ttl:获得一个key的活动时间 select(index):按索引查询 m

30、ove(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库 flushdb:删除当前选择数据库中的所有key flushall:删除所有数据库中的所有key Page 36 36 对对String操作的命令操作的命令 set(key, value):给数据库中名称为key的string赋予值value get(key):返回数据库中名称为key的string的value getset(key, value):给名称为key的string赋予上一次的value mget(key1, key2, key N):返回库中多个string(它们的名称为key1,key

31、2)的 value setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值 为value setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时 间time mset(key1, value1, key2, value2,key N, value N):同时给多个string赋值,名称为key i的string赋值value i msetnx(key1, value1, key2, value2,key N, value N):如果所有名称为key i的string都

32、不存在,则向库中添加string,名称key i赋值为value i incr(key):名称为key的string增1操作 incrby(key, integer):名称为key的string增加integer decr(key):名称为key的string减1操作 decrby(key, integer):名称为key的string减少integer append(key, value):名称为key的string的值附加value substr(key, start, end):返回名称为key的string的value的子串 Page 37 37 对对List操作的命令操作的命令 rp

33、ush(key, value):在名称为key的list尾添加一个值为value的元素 lpush(key, value):在名称为key的list头添加一个值为value的 元素 llen(key):返回名称为key的list的长度 lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下 同) ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素 lindex(key, index):返回名称为key的list中index位置的元素 lset(key, index, va

34、lue):给名称为key的list中index位置的元素赋值为value lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删 除所有值为value的元素,count0从头至尾删除count个值为value的元素,count0,则遇到上述情况 时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。 brpop(key1, key2, key N, timeout):rpop的block版本。参考上一命令。 rpoplpush(srckey, dstkey):返回并删除名称为srck

35、ey的list的尾元素,并将该元素添加到 名称为dstkey的list的头部 Page 38 38 对对Set操作的命令操作的命令 sadd(key, member):向名称为key的set中添加元素member srem(key, member) :删除名称为key的set中的元素member spop(key) :随机返回并删除名称为key的set中一个元素 smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为 dstkey的集合 scard(key) :返回名称为key的set的基数 sismember(key, membe

36、r) :测试member是否是名称为key的set的元素 sinter(key1, key2,key N) :求交集 sinterstore(dstkey, key1, key2,key N) :求交集并将交集保存到dstkey的集合 sunion(key1, key2,key N) :求并集 sunionstore(dstkey, key1, key2,key N) :求并集并将并集保存到dstkey的集合 sdiff(key1, key2,key N) :求差集 sdiffstore(dstkey, key1, key2,key N) :求差集并将差集保存到dstkey的集合 smembe

37、rs(key) :返回名称为key的set的所有元素 srandmember(key) :随机返回名称为key的set的一个元素 Page 39 39 对对zset(sorted set)操作的命令)操作的命令 zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。 如果该元素已经存在,则根据score更新该元素的顺序。 zrem(key, member) :删除名称为key的zset中的元素member zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member, 则

38、该元素的score增加increment;否则向集合中添加该元素,其score的值为increment zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member 元素的rank(即index,从0开始),若没有member元素,返回“nil” zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中 member元素的rank(即index,从0开始),若没有member元素,返回“nil” zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的 index从start到end的所有元素 zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的 index

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论