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

下载本文档

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

文档简介

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

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

3、表结构(schema)变更对简单查询需要快速返回结果的处理(实时要求高)字段不固定时应用(数据结构为半结构化数据)Page 66主要内容主要内容RDBMS发展现状及适用情景NoSQL的出现,NoSQL基本原理Redis简介及应用场景Redis基本数据结构及重要操作Redis命令总结实际操作实验:简单博客系统Page 77NoSQL简介简介NoSQL:No!SQL还是Not Only SQL?NoSQL基本分类:列式数据库,键值数据库,文档数据库,图数据库NoSQL基于的基本原理:CAP,BASE,最终一致性Page 88NoSQL基本原理基本原理CAP理论:Consistency(一致性),

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

5、可靠性:Basically Available基本可用。Soft state软状态 状态可以有一段时间不同步,异步。Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时高一致Page 1010Redis简介简介2008年开始开发,2009年完成,作者Salvatore SanfilippoRedis官网是这么描述的:Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contai

6、n strings, hashes, lists, sets and sorted sets.Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。Page 1111Redis特点特点 速度快Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和110000/s。 持久化由于所有数据保持在内存中(2.0版本开始可以只将部分数据的value

7、放在内存,见“虚拟内存”),所以对数据的更新将异步地保存到磁盘上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。 数据结构可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构Page 1212Redis特点特点 原子操作Redis对不同数据类型的操作是原子的,因此设置或增加key值,从一个集合中增加或删除一个元素都能安全的操作。 支持多种语言Redis支持多种语言,诸如Ruby, Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure等。 主-从复制Redis支持简单而

8、快速的主-从复制。官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。 Sharding很容易将数据分布到多个Redis实例中,但这主要看该语言是否支持。目前支持Sharding功能的语言只有PHP、Ruby和Scala。Page 1313Redis适用场景适用场景数据结构不固定的半结构化数据读写请求数量大且实时性要求高后台RDB数据库压力大,需要缓存的情况数据结构复杂,需要与应用程序内数据结构相对应的情况Page 1414数据类型及操作方法数据类型及操作方法string(字符串)list(双向链表)set(无序集合)zset(有序集合)hash(ha

9、sh表)Page 1515string类型类型string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象从内部实现来看其实string可以看作byte数组,最大上限是1G字节string类型的值也可视为integer,从而可以让“incr”命令族操作,这种情况下,该integer的值限制在64位有符号数在list、set和zset中包含的独立的元素类型都是string类型Page 1616list类型类型redis的list类型其实就是一个每个子元素都是string类型的双向链表,所以lrpush和l

10、rpop命令的算法时间复杂度都是O(1),另外list会记录链表的长度,所以llen操作也是O(1).可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列list的最大长度是232-1个元素Page 1717set类型类型set就是redis string的无序集合,不允许有重复元素set的最大元素数是232-1对set的操作还有交集、并集、差集等Page 1818zset类型类型zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张

11、表,一列存value,一列存顺序。操作中的key理解为zset的名字。zset的最大元素数是232-1。对于已经有序的zset,仍然可以使用sort命令,通过指定asc|desc参数对其进行排序。Page 1919hash类型类型redis Hash类型对数据域和值提供了映射,这一结构很方便表示对象在Hash中可以只保存有限的几个“域”,而不是将所有的“域”作为key,这可以节省内存Page 2020持久化机制持久化机制redis一共支持四种持久化方式,分别是: 定时快照方式(snapshot) 默认方式 基于语句追加文件的方式(aof) 虚拟内存(vm) 已放弃 Diskstore方式 实验

12、中前两种是基于全部数据都在内存中,即小数据量下提供磁盘落地功能后两种方式则是作者在尝试存储数据超过物理内存时,即大数据量的数据存储,后两种持久化方式仍然是在实验阶段,并且vm方式基本已经被作者放弃1.实际能在生产环境用的只有前两种,换句话说redis目前还只能作为小数据量存储(全部数据能够加载在内存中),海量数据存储方面并不是redis所擅长的领域Page 2121定时快照方式定时快照方式(snapshot)n 快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。可以配置redis在n秒内如果

13、超过m个key被修改就自动做快照,下面是默认的快照保存配置 save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save 60 10000Page 2222快照过程快照过程 保存过程如下保存过程如下1.redis调用fork,现在有子进程和父进程。2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址

14、空间内的数 据是fork时刻整个数据库的一个快照。3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。 缺点缺点 是定时快照只是代表一段时间内的内存映像,所以系统重启会丢失上次快照与重启之间所有的数据。Page 2323基于语句追加方式基于语句追加方式(aof) aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,

15、所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。 有三种方式如下(默认是:每秒fsync一次)appendonly yes /启用aof持久化方式# appendfsync always /每次收到写命令就立即写盘,最慢,但保证完全的持久化,不推荐使用appendfsync everysec /每秒钟强制写入磁盘一次,推荐# appendfsync no /完全依赖os,性能最好,持久化没保证 持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须

16、保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。Page 2424AOF过程过程 保存过程如下保存过程如下1. redis调用fork ,现在有父子两个进程2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果

17、子进程重写失败的话并不会出问题。4.当子进程把快照内容以命令方式写入临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。5.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。 缺点 log文件体积过大时系统重启恢复数据非常慢,几十G的数据可能要几小时才能加载完;每条命令都要写log,读写性能会有所下降Page 2525虚拟内存虚拟内存(vm)虚拟内存方式是Redis来进行用户空间的数据换入换出的一个策略,此种方式在实现的效果上比较差,主要问题是代码复杂,重启慢,复制慢等等,目前已经被作者放弃。Page 2626di

18、skstore方式方式diskstore方式是作者放弃了虚拟内存方式后选择的一种新的实现方式,也就是传统的B-tree的方式,目前仍在实验阶段,后续是否可用我们可以拭目以待。Page 2727主从复制主从复制 Redis的复制功能是完全建立在基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你的系统内存容量规划物理内存使用量不要超过3/5 配置slave服务器很简单,只需要在配置文件中加入如下配置slaveof 192.168.1.1 6379 #指定master的ip和端口 下面是关于redis主从

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

20、save配置,然后只在slave上配置数据持久化。Page 2828主从复制过程主从复制过程 主从复制的过程 当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。 无论是第一次同步建立的连接还是连接断开后的重新连 接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。 后台进程完成写文件后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。 接着master就会把缓存的命 令转发给slave。而且后续master收到的写命令都会通过开始

21、建立的连接发送给slave。1.从master到slave的同步数据的命令和从 client发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自动重新建立连接。如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。Page 2929主从复制过程主从复制过程Redis复制流程在Slave和Master端各自是一套状态机流转,涉及的状态信息是:Slave 端:REDIS_REPL_NONEREDIS_REPL_CONNECTREDIS_REPL_CONNECTED Master端:REDIS_REP

22、L_WAIT_BGSAVE_STARTREDIS_REPL_WAIT_BGSAVE_ENDREDIS_REPL_SEND_BULKREDIS_REPL_ONLINEPage 3030主从复制过程主从复制过程整个状态机流程过程如下:Slave端在配置文件中添加了slave of指令,于是Slave启动时读取配置文件,初始状态为REDIS_REPL_CONNECT。 Slave端在定时任务serverCron(Redis内部的定时器触发事件)中连接Master,发送sync命令,然后等待master发送回其内存快照文件。 Master端收到sync命令简单判断是否有正在进行的内存快照子进程,没有则

23、立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。 Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构,并最终状态置位为 REDIS_REPL_CONNECTED状态,Slave状态机流转完成。 1.Master端在发送快照文件过程中,接收的任何会改变数据集的命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后收到的命令相同处理,并将状态置位为 REDIS_REPL_ONLINE。 Page 3131主从复制过

24、程主从复制过程Page 3232Redis复制机制的缺陷复制机制的缺陷Slave从库在连接Master主库时,Master会进行内存快照,然后把整个快照文件发给Slave,也就是没有象MySQL那样有复制位置的概念,即无增量复制,这会给整个集群搭建带来非常多的问题比如一台线上正在运行的Master主库配置了一台从库进行简单读写分离,这时Slave由于网络或者其它原因与Master断开了连接,那么当Slave进行重新连接时,需要重新获取整个Master的内存快照,Slave所有数据跟着全部清除,然后重新建立整个内存表,一方面Slave恢复的时间会非常慢,另一方面也会给主库带来压力Page 333

25、3Redis复制机制缺陷的一种改进复制机制缺陷的一种改进首先写Redis的AOF文件,并对这个AOF文件按文件大小进行自动分割滚动,同时关闭Redis的Rewrite命令,然后会在业务低峰时间进行内存快照存储,并把当前的AOF文件位置一起写入到快照文件中,这样我们可以使快照文件与AOF文件的位置保持一致性,这样我们得到了系统某一时刻的内存快照,并且同时也能知道这一时刻对应的AOF文件的位置;当从库发送同步命令时,我们首先会把快照文件发送给从库,然后从库会取出该快照文件中存储的AOF文件位置,并将该位置发给主库,主库会随后发送该位置之后的所有命令,以后的复制就都是这个位置之后的增量信息了。Pag

26、e 3434Redis命令总结命令总结对value操作的命令对String操作的命令对List操作的命令对Set操作的命令对zset(sorted set)操作的命令对Hash操作的命令Page 3535对对value操作的命令操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key type(key):返回值的类型 keys(pattern):返回满足给定pattern的所有key randomkey:随机返回key空间的一个key rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除

27、newname表示的key dbsize:返回当前数据库中key的数目 expire:设定一个key的活动时间(s) ttl:获得一个key的活动时间 select(index):按索引查询 move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库 flushdb:删除当前选择数据库中的所有key flushall:删除所有数据库中的所有keyPage 3636对对String操作的命令操作的命令 set(key, value):给数据库中名称为key的string赋予值value get(key):返回数据库中名称为key的string的value ge

28、tset(key, value):给名称为key的string赋予上一次的value mget(key1, key2, key N):返回库中多个string(它们的名称为key1,key2)的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赋值,名称为ke

29、y i的string赋值value i msetnx(key1, value1, key2, value2,key N, value N):如果所有名称为key i的string都不存在,则向库中添加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的strin

30、g的值附加value substr(key, start, end):返回名称为key的string的value的子串Page 3737对对List操作的命令操作的命令 rpush(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

31、的list,保留start至end之间的元素 lindex(key, index):返回名称为key的list中index位置的元素 lset(key, index, value):给名称为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(key

32、1, key2, key N, timeout):rpop的block版本。参考上一命令。 rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部Page 3838对对Set操作的命令操作的命令 sadd(key, member):向名称为key的set中添加元素member srem(key, member) :删除名称为key的set中的元素member spop(key) :随机返回并删除名称为key的set中一个元素 smove(srckey, dstkey, member) :将membe

33、r元素从名称为srckey的集合移到名称为dstkey的集合 scard(key) :返回名称为key的set的基数 sismember(key, member) :测试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, ke

34、y2,key N) :求差集 sdiffstore(dstkey, key1, key2,key N) :求差集并将差集保存到dstkey的集合 smembers(key) :返回名称为key的set的所有元素 srandmember(key) :随机返回名称为key的set的一个元素Page 3939对对zset(sorted set)操作的命令)操作的命令 zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。 zrem(key, member) :删除名称为key的zse

35、t中的元素member zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的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从start到end的所有元素 zrangebyscore(key, min, max):返回名称为key的zset中score

温馨提示

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

评论

0/150

提交评论