redis介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Redis是一个开源的使用ANSI C语言编写、支持网络、可 基于内存亦可持久化的日志型、Key-Value数据库,并提供 多种语言的API。从2010年3月15日起,Redis的开发工作 由VMware主持。
启动流程及处理流程:/html/1413.html
Redis介绍
林超旗 2011.10.16
主要内容
简介与配置 特性 数据类型 持久化机制及问题
主从复制及问题
命令总结 思考
Page 2
2
简介与配置
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.
3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程 退出。
缺点
• 是定时快照只是代表一段时间内的内存映像,所以系统重启会丢失上次快照与重启 之间所有的数据。
Page 18
18
基于语句追加方式(aof)
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将 每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。 当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库 的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到 磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通 过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。 有三种方式如下(默认是:每秒fsync一次)
Page 3
3
启动流程
Page 4
4
命令处理流程
Page 5
5

*daemonize:是否以后台daemon方式运行 *pidfile:pid文件位置 *port:监听的端口号,默认端口号是6379 *timeout:请求超时时间 *loglevel:log信息级别 *logfile:log文件位置 *databases:开启数据库的数量 *save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在 一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。 *rdbcompression:是否使用压缩 *dbfilename:数据快照文件名(只是文件名,不包括目录) *dir:数据快照的保存目录(这个是目录) *appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数 据抗风险能力,但影响效率。 *appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用 fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
对于已经有序的zset,仍然可以使用sort命令,通过指定 asc|desc参数对其进行排序。
Page 14
14
hash类型
redis Hash类型对数据域和值提供了映射,这一结构很方便 表示对象 在Hash中可以只保存有限的几个“域”,而不是将所有的 “域”作为key,这可以节省内存
Page 16
16
定时快照方式(snapshot)
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文 件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。可以配置 redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置
Page 19
19
保存过程如下
1. redis调用fork ,现在有父子两个进程
2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命 令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。 4.当子进程把快照内容以命令方式写入临时文件中后,子进程发信号通知父进程。然后 父进程把缓存的写命令也写入到临时文件。 5.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始 往新的aof文件中追加。
Page 15
15
持久化机制
redis一共支持四种持久化方式,分别是:
1. 定时快照方式(snapshot) ——默认方式 2. 基于语句追加文件的方式(aof) 3. 虚拟内存(vm) ——已放弃 4. Diskstore方式 ——实验中
前两种是基于全部数据都在内存中,即小数据量下提供磁 盘落地功能 后两种方式则是作者在尝试存储数据超过物理内存时,即 大数据量的数据存储,后两种持久化方式仍然是在实验阶 段,并且vm方式基本已经被作者放弃 实际能在生产环境用的只有前两种,换句话说redis目前还 只能作为小数据量存储(全部数据能够加载在内存中), 海量数据存储方面并不是redis所擅长的领域
在list、set和zset中包含的独立的元素类型都是string类型
Page 11
11
list类型
redis的list类型其实就是一个每个子元素都是string类型的 双向链表,所以[lr]push和[lr]pop命令的算法时间复杂度都 是O(1),另外list会记录链表的长度,所以llen操作也是O(1). 可以通过push,pop操作从链表的头部或者尾部添加删除元 素。这使得list既可以用作栈,也可以用作队列
Page 17
17
保存过程如下
1.redis调用fork,现在有子进程和父进程。
2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复 制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为 父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据 是fork时刻整个数据库的一个快照。
list的最大长度是2^32-1个元素
Page 12
12
set类型
set就是redis string的无序集合,不允许有重复元素 set的最大元素数是2^32-1 对set的操作还有交集、并集、差集等
Page 13
13
zset类型
zset是set的一个升级版本,在set的基础上增加了一个顺序 属性,这一属性在添加修改元素时可以指定,每次指定后 zset会自动安装指定值重新调整顺序。可以理解为一张表, 一列存value,一列存顺序。操作中的key理解为zset的名字。 zset的最大元素数是2^32-1。
可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构。
Page 8
8
自动操作 Redis对不同数据类型的操作是自动的,因此设置或增加key值,从一 个集合中增加或删除一个元素都能安全的操作。 支持多种语言 Redis支持多种语言,诸如Ruby, Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure等。 主-从复制 Redis支持简单而快速的主-从复制。官方提供了一个数据,Slave在21 秒即完成了对Amazon网站10G key set的复制。
Page 7
ቤተ መጻሕፍቲ ባይዱ
7
Redis特性
速度快 Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度 非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写 速度分别达到81000/s和110000/s。 持久化 由于所有数据保持在内存中(2.0版本开始可以只将部分数据的value放 在内存,见“虚拟内存”),所以对数据的更新将异步地保存到磁盘 上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。 数据结构
Page 10
10
string类型
string是redis最基本的类型,而且string类型是二进制安全 的。意思是redis的string可以包含任何数据。比如jpg图片 或者序列化的对象 从内部实现来看其实string可以看作byte数组,最大上限是 1G字节
string类型的值也可视为integer,从而可以让“incr”命令 族操作,这种情况下,该integer的值限制在64位有符号数
缺点
• log文件体积过大时系统重启恢复数据非常慢,几十G的数据可能要几小时才能加 载完;每条命令都要写log,读写性能会有所下降
Page 20
20
虚拟内存(vm)
虚拟内存方式是Redis来进行用户空间的数据换入换出的一 个策略,此种方式在实现的效果上比较差,主要问题是代 码复杂,重启慢,复制慢等等,目前已经被作者放弃。
Page 6
6

#Redis的复制配置 # slaveof <masterip> <masterport> # masterauth <master-password> # 连接时所需的密码 #requirepass foobared #最大客户端连接数 # maxclients 128 #最大内存使用率 maxmemory <bytes> 设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期 或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save 60 10000
client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线 程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞 所有client请求,所以不推荐使用;每次快照持久化都是将内存数据完整写入到磁盘一次, 并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量 的磁盘io操作,可能会严重影响性能。 另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢 失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久 化方式
Sharding
很容易将数据分布到多个Redis实例中,但这主要看该语言是否支持。 目前支持Sharding功能的语言只有PHP、Ruby和Scala。
9
Page 9
数据类型及操作方法
string(字符串) list(双向链表) set(无序集合) zset(有序集合)
hash(hash表)
appendonly yes
# appendfsync always appendfsync everysec # appendfsync no
//启用aof持久化方式
//每次收到写命令就立即写盘,最慢,但保证完全的持久化,不推荐使用 //每秒钟强制写入磁盘一次,推荐
//完全依赖os,性能最好,持久化没保证
Page 21
21
diskstore方式
持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保 存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实 文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了 bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。
相关文档
最新文档