redis使用及运维_第1页
redis使用及运维_第2页
redis使用及运维_第3页
redis使用及运维_第4页
redis使用及运维_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、RedisRedis使用及运维使用及运维By 薛长俊2013-8介绍介绍数据类型数据类型持久化持久化RedisRedis使用使用主从复制主从复制Redis介绍 简介Redis 是一个开源、支持网络、基于内存、键值对存储数据库,使用 ANSI C 编写。其开发由 VMware 主持。目前Redis已是最流行的键值对存储数据库之一。 与memcached比较Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;Redis支持数据的主从复制,即master-slave模式的数据备份;Redis支持数据的持久化,可以将内存中的数据保存到磁盘中,重启的时候可以

2、再次加载原有数据;Redis单个value的最大限制是1GB, memcached只能保存1MB的数据。Redis特性 速度快Redis使用C编写,而且将所有数据加载到内存中,所以速度非常快。 数据结构可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构。 持久化支持数据持久化存储。 主-从复制Redis支持简单而快速的主-从复制。 支持过期时间支持缓存过期自动失效。 支持事务操作允许让一组命令进入队列一次性执行,在执行的过程中不穿插其它命令。 PUB/SUB支持发布订阅。Redis特性 Redis不足支持事务,将多个命令打包执行,但是任一命令有语法错误或key-value

3、数据类型错误照常运行;数据结构不支持嵌套其他数据结构,比如类型为list的value不能再嵌套一个list。单线程模型处理所客户请求的命令。对高并发支持不是很好主从做冗余备份时,主机迭机后,不能从多个从机中自动选举出主机当Dump.rdb文件中没有日志文件appendonly.aof最新数据时,不能从日志文件的最新命令的当前位置处增量更新dump.rdb数据文件。Redis特性 string字符串。 list字符串列表。 set无序不重复的字符串集合。 zset有序不重复的字符串集合。 hashs键、值都为字符串的哈希表。Redis数据类型 主键(key)可以用任何二进制序列作为key值,从形

4、如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。 关于key的几条规则可以用任何二进制序列作为key值。不用太长的键值。不仅消耗内存,而且在数据查找中计算成本很高。 太短的键值通常也不是好主意。如果你要用“u:1000:pwd”来代替“user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。最好坚持一种模式。例如:“object-type:id:field”就是个不错的注意,像这样“user:1000:password”。Redis数据类型 key 相关命令

5、exits key,测试指定key是否存在,返回1表示存在,0不存在;del key1 key2 .keyN,删除给定key,返回删除key的数目,0表示给定key都不存在;type key,返回给定key的value值类型。返回 none 表示不存在key,string字符串类型,list链表类型,set无序集合类型 ;keys pattern,返回匹配指定模式的所有key;random key,返回从当前数据库中随机选择的一个key,如果数据库是空的,返回空串 ;rename oldkey newkey,原子的重命名一个key,如果newkey存在,将会被覆盖,返回1表示成功,0失败。可能

6、是oldkey不存在或者和newkey相同;dbsize,返回当前数据库的key数量;expire key seconds,为key指定过期时间,单位是秒。返回1成功,0表示key已经设置过过期时间或者不存在;Redis数据类型 key 相关命令select db-index,通过索引选择数据库,默认连接的数据库所有是0,默认数据库数是16个。返回1表示成功,0失败;move key db-index,将key从当前数据库移动到指定数据库。返回1成功。0 如果key不存在,或者已经在指定数据库中;flushdb,删除当前数据库中所有key,此方法不会失败。慎用。flushall,删除所有数据库

7、中的所有key,此方法不会失败。慎用。Redis数据类型 string类型-特点string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象;从内部实现来看其实string可以看作byte数组,最大上限是1G字节;string类型的值也可视为integer,从而可以让“incr”命令族操作;在list、set和zset中包含的独立的元素类型都是string类型。 string类型-应用场景string是最常用的一种数据类型,普通的key/value存储。如果你只用这种类型,Redis就像一个可以持久化的

8、memcached服务器。当然redis对string类型的操作比memcached要多。Redis数据类型 string常见命令set key value,设置key对应的值为string类型的value,返回1表示成功,0失败setnx key value,同上,如果key已经存在,返回0 。nx 是not exist的意思get key,获取key对应的string值,如果key不存在返回nilgetset key value,原子的设置key的值,并返回key的旧值。如果key不存在返回nilmget key1 key2 . keyN,一次获取多个key的值,如果对应key不存在,则对

9、应返回nilmset key1 value1 . keyN valueN,一次设置多个key的值,成功返回1表示所有的值都设置了,失败返回0表示没有任何值被设置msetnx key1 value1 . keyN valueN,同上,但是不会覆盖已经存在的keyRedis数据类型 string常见命令incr key,对key的值做加加操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1decr key,同上,但是做的是减操作,decr一个不存在key,则设置key为-1incrby key integer,同incr,加指定值 ,k

10、ey不存在时候会设置key,并认为原来的value是 0decrby key integer,同decr,减指定值。decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样效果,反之一样append key value,给指定key的字符串值追加value,返回新字符串值的长度Redis数据类型 list类型-特点Redis的list类型其实就是一个每个子元素都是string类型的双向链表。这意味着即使在一个list中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的;可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以

11、用作栈,也可以用作队列;list的最大长度是232-1个元素。 list类型-应用场景Redis list应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表等都可以用Redis的list结构来实现;博客实现中,可为每篇日志设置一个list,在该list中推入进博客评论;也可以使用redis list实现消息队列。Redis数据类型 list常见命令lpush key string,在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型;rpush key string,同上,在尾部添加;llen key,返回key对应list

12、的长度,key不存在返回0,如果key对应类型不是list返回错误;lrange key start end,返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素 ,key不存在返回空列表;ltrim key start end ,截取list,保留指定区间内元素,成功返回1,key不存在返回错误;lset key index value,设置list中指定下标的元素值,成功返回1,key或者下标不存在返回错误;lrem key count value,从key对应list中删除count个和value相同的元素。count为0时候删除全部;Redis数据类型 lis

13、t常见命令lpop key,从list的头部删除元素,并返回删除元素。如果key对应list不存在或者是空返回nil,如果key对应值不是list返回错误;rpop,同上,但是从尾部删除;blpop key1.keyN timeout,从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对key1.keyN中

14、的任意key进行push操作,则第一在这个key上被阻塞的client会立即返回。如果超时发生,则返回nil。有点像unix的select或者poll;brpop,同blpop,一个是从头部删除一个是从尾部删除;rpoplpush srckey destkey,从srckey对应list的尾部移除元素并添加到destkey对应list的头部,最后返回被移除的元素值,整个操作是原子的.如果srckey是空或者不存在返回nil。Redis数据类型 set类型-特点set就是redis string的无序集合,不允许有重复元素;set的最大元素数是232-1;对set的操作还有交集、并集、差集等。

15、set类型-应用场景set对外提供的功能与list类似,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的接口,这个也是list所不能提供的。可以用Redis set结构实现SNS中的好友推荐和blog的tag功能。Redis数据类型 set常见命令sadd key member,添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误;srem key member,从key对应set中移除给定元素,成功返回1,如果member在集合中不存在或者

16、key不存在返回0,如果key对应的不是set类型的值返回错误;spop key,删除并返回key对应set中随机的一个元素, set是空或者key不存在返回nil;srandmember key,同spop,随机取set中的一个元素,但是不删除元素;smove srckey dstkey member,从srckey对应set中移除member并添加到dstkey对应set中,整个操作是原子的;scard key,返回set的元素个数,如果set是空或者key不存在返回0;Redis数据类型 set常见命令sismember key member,判断member是否在set中,存在返回1;

17、sinter key1 key2.keyN,返回所有给定key的交集;sinterstore dstkey key1.keyN,同sinter,但是会同时将交集存到dstkey下;sunion key1 key2.keyN,返回所有给定key的并集;sunionstore dstkey key1.keyN,同sunion,并同时保存并集到dstkey下;sdiff key1 key2.keyN,返回key1与所有key的不同元素;sdiffstore dstkey key1.keyN,同sdiff,并同时保存差集到dstkey下;smembers key,返回key对应set的所有元素,结果是

18、无序的。Redis数据类型 sorted set类型-特点sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score。有序集合是通过一个dual-ported 数据结构实现的,它包含一个精简的有序列表和一个hash table,因此添加一个元素的时间复杂度是O(log(N);sorted set的最大元素数是232-1;对于已经有序的zset,仍然可以使用sort命令,通过指定asc|desc参数对其进行排序(但这次服务器要耗费CPU了); sorted set类型-应用场景当你需要一个有序的并且不重复的集合列表,那么可以选择sorted se

19、t数据结构;使用sorted set甚至可以构建有优先级的队列系统;排行榜应用,取TOP N操作。Redis数据类型 sorted set常见命令zadd key score member,添加元素到集合,元素在集合中存在则更新对应score;zrem key member,删除指定元素,1表示成功,如果元素不存在返回0;zincrby key incr member,增加对应member的score值,然后移动元素并保持skip list保持有序。返回更新后的score值;zrank key member,返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的;zrevr

20、ank key member,同上,但是集合中元素是按score从大到小排序;zrange key start end,从集合中去指定区间的元素。返回的是有序结果;zrevrange key start end,同上,返回结果是按score逆序的;Redis数据类型 sorted set常见命令zrangebyscore key min max,返回集合中score在给定区间的元素;zcount key min max,返回集合中score在给定区间的数量;zcard key,返回集合中元素个数;zscore key element,返回给定元素对应的score;zremrangebyrank

21、 key min max,删除集合中排名在给定区间的元素;zremrangebyscore key min max,删除集合中score在给定区间的元素;Redis数据类型 hash类型-特点Redis hash是一个string类型的field和value的映射表。它的添加,删除操作都是O(1) 。hash特别适合用于存储对象;将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象;在Hash中可以只保存有限的几个“域”,而不是将所有的“域”作为key,这可以节省内存。 hash类型-应用场景比如,我们存储供应商酒店价格的时候可以采取此结构,用酒店编码作为Key,Rat

22、ePlan+RoomType作为Filed,价格信息作为Value。Redis数据类型 hash常见命令hset key field value,设置hash field为指定值,如果key不存在,则先创建;hget key field ,获取指定的hash field;hmget key filed1.fieldN,获取全部指定的hash filed;hmset key filed1 value1 . filedN valueN,同时设置hash的多个field;hincrby key field integer,将指定的hash filed 加上给定值;hexists key field,

23、测试指定field是否存在;hdel key field,删除指定的hash field;hlen key,返回指定hash的field数量;hkeys key,返回hash的所有field;hvals key,返回hash的所有value;hgetall,返回hash的所有filed和value。Redis数据类型 排序Redis支持对list,set和sorted set元素的排序。排序命令是sort。命令格式如下:SORT key BY pattern LIMIT start count GET pattern ASC|DESC ALPHA STORE dstkey 例如:Redis数据

24、类型 持久化Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。Redis持久化持久化 快照(SnapShot)当前数据的快照存成一个数据文件的持久化机制。 频率控制( redis.conf ) 过程Redis通过fork产生子进程;父进程继续处理client请求,子进程负责将快照写入临时文件;子进程写完后,用临时文件替换原来的快照文件,然后子进程退出。Redis持久化持久化save 900 1 #

25、900秒超过1个key被修改 save 300 10 #300秒超过10个key被修改 save 60 10000 #60 秒超过一万条被修改 优点整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的;对于灾难恢复,可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上;性能最大化;相比于AOF机制,如果数据集很大,RDB的启动效率会更高。 缺点每次快照持久化都是将内存数据完整写入到磁盘一次,并不 是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能;另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外dow

26、n掉的话,就会丢失最后一次快照后的所有修改;如果应用不能丢失任何修改的话,可以采用aof持久化方式。Redis持久化持久化 AOF(append only file)记录每次的读写操作的文件。 频率控制( redis.conf ) 过程Redis 通过fork一个子进程,遍历数据,写入新临时文件;父进程继续处理client请求,子进程继续写临时文件;父进程把新写入的AOF写在缓冲区;子进程写完退出,父进程接收退出消息,将缓冲区AOF写入临时文件;临时文件重命名成appendonly.aof,原来文件被覆盖,整个过程完成。Redis持久化持久化save 900 1 #900秒超过1个key被修改

27、 save 300 10 #300秒超过10个key被修改 save 60 10000 #60 秒超过一万条被修改 日志文件在Redis配置文件中有一个叫appendonly的选项,可以写yes或no.这个选项就是负责是否开启AOF日志的开关;日志文件通病,如果只增不减的话,那文件将会无限长大;执行bgrewriterof命令,先给当前的所有数据做一个快照,然后再在这个快照的基础上写接下来的日志,删除旧的日志。 写入磁盘时命令 appendonly yes,启用aof持久化方式;appendfsync always,每次收到写命令就立即强制 写入磁盘,最慢的,但是保证完全的持久化,不推荐使用;

28、appendfsync everysec,每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐;appendfsync no,完全依赖os,性能最好,持久化没保证。Redis持久化持久化 对比分析快照易丢失数据,AOF模式较为安全,但日志重写时磁盘io开销大,容易导致服务器性能严重下降,并且需要足够的物理内存,这个比较危险,所以在高性能服务器上一般是用主从复制来进行持久化。Redis持久化持久化 特点master可以有多个slave。除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构。主从复制不会阻塞master。也就是说当一个或多个slave

29、与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余。可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。Redis主从复制主从复制 配置slaveof 8359,指定master的ip和端口。 问题slave从库在连接Master主库时,Mas

30、ter会进行内存快照,然后把整个快照文件发给Slave,也就是没有象MySQL那样有复制位置的概念,即无增量复制,这会给整个集群搭建带来较多问题。Redis主从复制主从复制clientclientclientmastermastermasterslaveslaveslaveCONSISTENT HASH / 定容 readwrite同步数据slave 主从架构示例Redis主从复制主从复制 主从复制过程Slave端在配置文件中添加了slave of指令,于是Slave启动时读取配置文件,初始状态为REDIS_REPL_CONNECT。Slave端在定时任务serverCron(Redis内部的

31、定时器触发事件)中连接Master,发送sync命令,然后阻塞等待master发送回其内存快照文件(最新版的Redis已经不需要让Slave阻塞)。Master端收到sync命令简单判断是否有正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构,并最终状态置位为 REDIS_REPL_CONNECTED状态,Slave状态机流转完成。Master端在发送快照文件过程中,接收的任何会改变数据集的

32、命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后收到的命令相同处理,并将状态置位为 REDIS_REPL_ONLINE。Redis主从复制主从复制 主从复制过程Redis主从复制主从复制部署部署客户端客户端RedisRedis运维运维架构示例架构示例 下载安装mkdir -p /root/install ; cd /root/install;wget -c http:/ zxvf redis-2.4.16.tar.gzcd /root/install/redis-2.4.16makemkdir -p /opt/soft/redi

33、s2.4.16 rm -f /opt/soft/redis ; ln -s /opt/soft/redis2.4.16 /opt/soft/rediscp /root/install/redis-2.4.16/src/redis-benchmark /opt/soft/redis2.4.16/cp /root/install/redis-2.4.16/src/redis-server /opt/soft/redis2.4.16/cp /root/install/redis-2.4.16/src/redis-cli /opt/soft/redis2.4.16/cp /root/install/redis-2.4.16/src/redis-check-dump /opt/soft/redis2.4.16/cp /root/install/redis-2.4.16/src/redis-check-aof /opt/soft/redis2.4.16/Redis部署部署 配置daemonize yespidfile /dev/shm/redis.pidport 8359unix

温馨提示

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

评论

0/150

提交评论