《Redis--高级架构-PPT.ppt》由会员分享,可在线阅读,更多相关《Redis--高级架构-PPT.ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、RedisRedis数据库数据库1学习目标:1:redis特点及安装2:redis键值操作3:redis数据类型string,link,set,order set,hash4:事务5:消息订阅6:持久化7:集群8:PHP-redis客户端9:运维10:仿微博实战21.1 redis特点介绍REmote DIctionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统。Redis提供了一些丰富的数据结构,包括 lists,sets,ordered sets 以及 hashes,还有和Memcached一样的 strings结构.Red
2、is当然还包括了对这些数据结构的丰富操作。1:数据结构丰富2:持久化3:支持简单事务4:主从配置方便31.2 redis安装不必configure1:make2:make PREFIX=/usr/local/redis install3:开启服务./redis-server/path/to/redis.conf41.3 redis连接redis的协议是基础文本的协议,(http,memcached也是)客户端的开发较为简便redis官方提供了C,java,C#,PHP,lua脚本的客户端我们在学习时,用到redis-cli 官方客户端及php-redis客户端在与redis-server同一目
3、录下,redis-cli即是#/path/to/redis-cli 回车5DEL key key.删除多个key返回真正被删除的key数量rename key newkey重命名key-newkey如果newkey存在,值被覆盖renamenx key newkey同rename,只是newkey存在时,不进行操作move key db移动key到另一个db,如果另一db有相同key,不做操作2.1 redis键操作命令6keys pattern支持*,?,匹配randomkey随机返回key,但不删除exists key判断key是否存在,返回1/0type key判断key的类型返回str
4、ing,set,zset,link,hashexpire key 用秒设置生命周期pexpire key 用毫秒设置生命周期persist key 使key变为永久ttl key 查询key的剩余生命周期(返回秒)pttl key 查询key的剩余生命周期(返回毫秒)对于不存在的key或过期key,返回-1redis2.8对于不存在的key返回-22.2 redis键操作命令73.1 字符串类型及期命令 SET SETNXSETEXPSETEXSETRANGEMSETMSETNXAPPENDGETMGETGETRANGEGETSETSTRLENDECRDECRBYINCRINCRBYINCRB
5、YFLOATSETBITGETBITBITOPBITCOUNT8大家有疑问的,可以询问和交流大家有疑问的,可以询问和交流可以互相讨论下,但要小声点可以互相讨论下,但要小声点可以互相讨论下,但要小声点可以互相讨论下,但要小声点93.2.1 字符串-set命令1:SET key value ex 过期秒数 px 过期毫秒数 nx xxEX second:设置键的过期时间为 second 秒。SET key value EX second 效果等同于 SETEX key second value。PX millisecond:设置键的过期时间为 millisecond 毫秒。SET key valu
6、e PX millisecond 效果等同于 PSETEX key millisecond value。NX:只在键不存在时,才对键进行设置操作。SET key value NX 效果等同于 SETNX key value。XX:只在键已经存在时,才对键进行设置操作103.2.2 字符串-setrange命令SETRANGE key offset value用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。不存在的 key 当作空白字符串处理。如果offset过大,则原字符和偏移量之间的空白将用零字节(zerobytes,x00)来填充
7、。最大偏移量是 229-1(536870911),因为 Redis 字符串的大小被限制在 512 兆(megabytes)以内。113.2.3 字符串mset命令mset k1 v1 k2 v21:一次性设置多对键值2:原子性3:覆盖旧值4:不想覆盖旧值用 msetnxmsetnx k1 v1 k2 v2特点:不覆盖旧值123.2.4 字符串命令-append APPEND key value如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在,APPEND 就简单地将给定 key 设为 value,就像执行 SET k
8、ey value 一样。返回值:追加 value 之后,key 中字符串的长度。133.2.5 字符串操作之getGET key返回 key 所关联的字符串值。如果 key 不存在那么返回特殊值 nil。假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。可用版本:=1.0.0时间复杂度:O(1)返回值:当 key 不存在时,返回 nil,否则,返回 key 的值。如果 key 不是字符串类型,那么返回一个错误。143.2.6 字符串之mgetMGET key key.返回所有(一个或多个)给定 key 的值。如果给定的某个 key 不存在,返回特殊值 ni
9、l153.2.7GETRANGE key start end返回字符串的一部分,和PHP中substr一样(redis2.0以前该命令就叫substr)左-右 0,1,2.计数右-左-1,-2,-3.计数163.2.8 getsetGETSET key newvalue设置新值,并返回旧值redis GETSET db mongodb#没有旧值,返回 nil(nil)redis GET dbmongodbredis GETSET db redis#返回旧值 mongodbmongodbredis GET dbredis17STRLEN key返回 key 所储存的字符串值的长度。key不存在是
10、返回0key 存在但不是字符串类型时,返回一个错误。3.2.9 字符串操作之getset183.2.10 字符串操作之getbitGETBIT key offset对 key 所储存的字符串值,获取指定偏移量上的位(bit)。当 offset 比字符串值的长度大,或者 key 不存在时,返回 0(不能判断确实为0,还是offset不对)注意:位从左边,从0记数193.2.11 字符串操作之setbitSETBIT key offset value设置或清除指定偏移量上的位(bit)为0/11:当 key 不存在时,自动生成一个新的字符串值。2:字符串会进行伸展(grown)以确保它可以将 va
11、lue 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。3:offset 参数必须大于或等于 0,小于 232。4:返回值为该bit之前的值用此功能把a-A203.2.12 字符串操作之bitopBITOP operation destkey key1 key2.对key1,key2.keyN作operation,并将结果保存到 destkey 上。operation 可以是 AND、OR、NOT、XOR注:NOT 操作时,key只能有1个213.3.1 link链表-lpushLPUSH key value value.将一个或多个值 value 插入到列表 key 的表头
12、(l指left)如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头:如说,对空列表 mylist 执行命令 LPUSH mylist a b c,列表的值将是 c b a,返回值:操作后的元素数量注:1:key 不存在,自动创建空列表并执行 LPUSH 操作。2:key 存在但不是列表类型时,返回一个错误。3:rpush key value 是把值插入到链表尾部,不再单述4:lpushx 在key不存在时,不自动创建链接,不再单述223.3.2 链表之lpopLPOP key移除并返回列表 key 的头元素。返回值:列表的头元素。当 key 不存在时,返回 ni
13、l注:rpop key 移除并返回列表key的尾元素,不单述233.3.3 链表之blpopBLPOP key key.timeoutBLPOP 是列表的阻塞式(blocking)弹出原语。它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素并结束命令。注:1:timeout为0则不超时2:此功能有什么用?brpop:阻塞弹出队列尾部的元素,不再单述243.3.4 链表之llenLLEN key返回列表 key
14、的长度。注:key 不存在,返回 0key 不是列表类型,返回错误253.3.5 链表之lrangeLRANGE key start stop返回列表指定区间内的元素,区间以偏移量 start 和 stop 指定。左数从0开始,右数-1开始注:1:start大于length,或start位于stop右边,则LRANGE 返回一个空列表2:如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 263.3.5 链表之lremLREM key count value根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:
15、count 0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count。count 0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count。count stop的元素ZSCORE key member返回成员 member 的 score 值。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil。zrevrange key start stop withscores倒序排列后,返回start-stop的元素41ZRANGEBYSCORE key min max WITHSCORES LIMIT offset count按分
16、数(升续)排序,取min,max之间的值,并偏移offset取count个zrevrangebyscore 不解释ZRANK key member返回member的排名,升序比较,从第0名开始zrevrank key member 不解释ZREMRANGEBYRANK key start stop按排名删除 start-stop名的元素zremrangebyscore key start,stop按分数删除start,stop之间的元素ZINTERSTORE destination numkeys key key.WEIGHTS weight weight.AGGREGATE SUM|MIN|
17、MAX求交集 ZUNIONSTORE destination numkeys key key.WEIGHTS weight weight.AGGREGATE SUM|MIN|MAX求并集 3.5.2 有序集合42HSET key field value将哈希表 key 中的域 field 的值设为 valuekey 不存在,则创建field 已存在,则覆盖。HSETNX key field value设置key 中的域 field 的值设置为 value,field 不存在时才有效HMSET key field1 value1 field2 value2.设置多个域field/valueHGE
18、T key field返回key 中给定域 field 的值HMGET key field field.返回多个field的值 3.6.1 哈希(hash)操作43HGETALL key返回哈希表所有的域和值。HDEL key field field.删除指定域,返回成功删除的元素个数HLEN key返回hash表中的元素个数HEXISTS key field判断指定域是否存在HINCRBY key field incrementfield 的值加上增量 increment。HINCRBYFLOAT key field increment不解释hkeys 返回哈希表中所有键hvalues 返回
19、哈希表中所有值 3.6.2 哈希(hash)操作44watch key1 key2 unwtach key1 key2multicommandcommand.discard/exec注意:如果命令格式有误,exec会报错如果命令格式不错,只是逻辑错,exec不执行正确的命令-需要程序员去负责 4.1 事务操作45 5.1 发布与订阅subscribe-频道-publishsubscribe news-订阅新闻频道publish news 内容-发布新闻内容适宜做在线聊天,消息推送46 5.2 发布与订阅SUBSCRIBE channel channel.订阅给定的一个或多个频道的信息。UNSU
20、BSCRIBE channel channel.指示客户端退订给定的频道。如果没有频道被指定,也即是,一个无参数的 UNSUBSCRIBE 调用被执行,那么客户端使用 SUBSCRIBE 命令订阅的所有频道都会被退订PUNSUBSCRIBE pattern pattern.指示客户端退订所有给定模式。47持久化:即把数据存储于断电后不会丢失的设备中,通常是硬盘.常见的持久化方式:主从:通过从服务器保存和持久化,如mongoDB的replication sets配置日志:操作生成相关日志,并通过日志来恢复数据couchDB对于数据内容,不修改,只追加,则文件本身就是日志,不会丢失数据.6.1 持
21、久化的方式486.2 redis-之rdb快照持久化rdb的工作原理:每隔N分钟或N次写操作后,从内存dump数据形成rdb文件,压缩放在备份目录注:红色部分可通过参数来配置49save 900 1#刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后至少1个关键字发生变化。save 300 10#必须是300秒之后至少10个关键字发生变化。save 60 10000#必须是60秒之后至少10000个关键字发生变化。stop-writes-on-bgsave-error yes#后台存储错误停止写。rdbcompression yes#使用LZF压缩rdb文件。rdbchecksum y
22、es#存储和加载rdb文件时校验。dbfilename dump.rdb#设置rdb文件名。dir./#设置工作目录,rdb文件会写入该目录。6.3 rdb快照相关参数506.4 rdb的缺陷断电在2个保存点之间,断电,将会丢失1-N分钟的数据出于对持久化的更精细要求,redis增添了aof方式 append only file516.5 aof的原理redis主进程后台日志进程aof文件setappend.写操作1:每个命令重写一次aof?2:某key操作100次,产生100行记录,aof文件会很大,怎么解决?52appendonly no#是否仅要日志appendfsync no#系统缓冲
23、,统一写,速度快appendfsync always#系统不缓冲,直接写,慢,丢失数据少appendfsync everysec#折衷,每秒写1次no-appendfsync-on-rewrite no#重写aof时同步最新数据auto-AOF-rewrite-percentage 100 当前aof文件是上次重写是大N%时重写auto-AOF-rewrite-min-size 64mb aof重写至少要达到的大小 6.6 aof日志持久化53 7.1 集群的作用1:主从备份 防止主机宕机2:读写分离,分担master的任务3:任务分离,如从服分别分担备份工作与计算工作54 7.2 redis
24、集群masterslave1slave2masterslave1slave2第2种方式的好处:master宕机后,可以直接切换到slave1557.3 主从通信过程masterslavesync自动dump出rdb缓冲的aofreplicationFeedSlaves56 7.4 redis集群配置Master配置:1:关闭rdb快照(备份工作交给slave)2:可以开启aofslave配置:1:声明slave-of2:配置密码如果master有密码3:某1个slave打开 rdb快照功能4:配置是否只读slave-read-only57 7.5 redis主从复制的缺陷缺陷:每次salave
25、断开后,(无论是主动断开,还是网络故障)再连接master都要master全部dump出来rdb,再aof,即同步的过程都要重新执行1遍.所以要记住-多台slave不要一下都启动起来,否则master可能IO剧增58 8.1 PHP-redis客户端http:/ install引入:vim php.iniextension=/php/extension/path/redis.so59 9.1 运维常用的server端命令TIME 查看时间戳与微秒数DBSIZE 查看当前库中的key数量BGREWRITEAOF 后台进程重写AOFBGSAVE 后台保存rdb快照SAVE 保存rdb快照LASTS
26、AVE 上次保存时间SLAVEOF 设为slave服务器FLUSHALL 清空所有dbFLUSHDB 清空当前dbSHUTDOWN|save|nosave 断开连接,关闭服务器SLOWLOG 显示慢查询INFO 显示服务器信息CONFIG GET 获取配置信息CONFIG SET 设置配置信息MONITOR 打开控制台SYNC 主从同步CLIENT LIST 客户端列表CLIENT KILL 关闭某个客户端CLIENT SETNAME 为客户端设置名字CLIENT GETNAME 获取客户端名字60 9.2 运维时的观察参数1:内存#Memoryused_memory:859192 数据结构的
27、空间used_memory_rss:7634944 实占空间mem_fragmentation_ratio:8.89 前2者的比例,1.N为佳2:主从复制#Replicationrole:slavemaster_host:192.168.1.128master_port:6379master_link_status:up3:持久化#Persistencerdb_changes_since_last_save:0rdb_last_save_time:13752240634:fork耗时#Statuslatest_fork_usec:936 上次持久化花费微秒5:慢日志config get/set
28、 slowlog-log-slower-thanCONFIG get/SET slowlog-max-len slow log get 获取慢日志619.3 sentinel监控主从服务器sentinelmasterslave2slave1通信slave1变成master通信失败629.4 sentinel监控配置sentinel monitor def_master 127.0.0.1 6379 2 sentinel auth-pass def_master 012_345678-90#master被当前sentinel实例认定为“失效”的间隔时间#如果当前sentinel与master直接
29、的通讯中,在指定时间内没有响应或者响应错误代码,那么#当前sentinel就认为master失效(SDOWN,“主观”失效)#默认为30秒 sentinel down-after-milliseconds def_master 30000#当前sentinel实例是否允许实施“failover”(故障转移)#no表示当前sentinel为“观察者”(只参与投票.不参与实施failover),#全局中至少有一个为yes sentinel can-failover def_master yes#sentinel notification-script mymaster/var/redis/notify.sh 63