17、第十七阶段redis1天redis笔记_第1页
17、第十七阶段redis1天redis笔记_第2页
17、第十七阶段redis1天redis笔记_第3页
17、第十七阶段redis1天redis笔记_第4页
17、第十七阶段redis1天redis笔记_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、RedisNoSql 数据库1 课程计划1、 redis 介绍a)NoSqlNoSql 的分类redis Redis 应用场景b)c)d)2、 redis 安装(重点)3、 redis 客户端redis 自带客户端图形界面的客户端(了解)Java 客户端 jedis(重点)4、 Redis 数据类型(重点)String 类型 Map 类型 List 类型 Set 类型 SortedSeta)b)c)d)e)5、 Keys 命令(了解)6、 Redis 的持久化方案Rbd 方式Aof 方式7、 Redis 的主从8、 Redis 的集群(重点)9、 Jedis 连接 redis 集群2 Redi

2、s 介绍NoSql为了解决高并发、就是 NoSql。用、扩展,大数据等一系列问题而产生的数据库解决方案,NoSql,叫非关系型数据库,它的全名 Not only sql。它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。NoSql 的分类键值(Key-Value)数据库相关产品:典型应用:数据模型:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB内容缓存,主要用于处理大量数据的高一系列键值对负载。优势:劣势:快速查询的数据缺少结构化列数据库相关产品:Cassandra, HBase, Riak典型应用:分布式的文件系统数据模型:以列簇式

3、,将同一列数据存在一起优势:查找速度快,可扩展性强,更容易进行分布式扩展劣势:功能相对局限文档型数据库相关产品:CouchDB、MongoDB典型应用:Web 应用(与 Key-Value 类似,Value 是结构化的)数据模型: 一系列键值对优势:数据结构要求不严格劣势: 查询性能不高,而且缺乏的查询语法图形(Graph)数据库相关数据库:Neo4J、InfoGrid、Infinite Graph典型应用:社交网络数据模型:图结构优势:利用图结构相关算法。劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。redisRedis 是使用 c 语言开发的一个高性能键值数据库。Redi

4、s 可以通过一些键值类型来据。键值类型: String 字符类型 map 散列类型 list 列表类型 set 集合类型sortedset 有序集合类型数redis 历史发展2008 年,意大利的一家Merzia 推出了一款基于的实时统计系统的性能感到失望,LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo 便 对于是他决定亲自为 LLOOGG 量身定做一个数据库,并于 2009 年开发完成,这个数据库就是 Redis。 不过 Salvatore Sanfilippo 并不满足只将 Redis 用于 LLOOGG 这一款产品,而是希望更多的人使用它,于是在同一年

5、 Salvatore Sanfilippo 将 Redis 开源发布,并开始和 Redis 的另一名主要的代码贡献者Pieter Noordhuis 一起继续着 Redis 的开发,直到今天。Salvatore Sanfilippo 自己也没有想到,短短的几年时间,Redis 就拥有了庞大的用户群体。Hacker News 在 2012 年发布了一份数据库的使用情况,结果显示有近 12%的公司在使、Stack Overflow、Flickr 等都是用 Redis。国内如 Redis 的用户。、街旁网、知乎网,国外如VMware 公司从 2010 年开始赞助 Redis 的开发, Salvato

6、re Sanfilippo 和 Pieter Noordhuis也分别在 3 月和 5 月加入 VMware,全职开发 Redis。redis 的应用场景缓存(数据查询、短连接、分布式集群架构中的 ses内容、商品内容等等)。(最多使用)分离。聊天室的好友列表。任务队列。(秒杀、抢购、12306 等等)应用榜。统计。数据过期处理(可以精确到毫秒)3 redis 安装redis官网地址:地址:redis 的安装redis 的安装环境会安装到 linux 系统中。第一步:安装 VMware,并且在 VMware 中安装 centos 系统(参考 linux第二步:将redis 的压缩包,上传到 l

7、inux 系统第三步:对redis 的压缩包进行解压缩Redis 解压缩之后的文件是用 c 语言写的源码文件rootitheima # tar -zxf redis-3.0.0.tar.gz)。第四步:安装 c 语言环境(安装 centos 之后,自带c 语言环境)rootitheima # yum install gcc-c+第五步:编译 redis 源码rootitheima # cd redis-3.0.0 rootitheima redis-3.0.0# make第六步:安装 redisrootitheima redis-3.0.0# make install PREFIX=/usr/

8、local/redis19第七步:查看是否安装成功redis 启动前端启动前端启动令:rootitheima bin# ./redis-server前端启动的关闭: 强制关闭:Ctrl+c正常关闭:rootitheima bin# ./redis-cli shutdown启动界面:前端启动:一旦客户端关闭,则redis 服务也停掉。后端启动第一步:需要将 redis 解压之后的源码包中的 redis.conf 文件拷贝到 bin 目录下rootitheima bin# cp /root/redis-3.0.0/redis.conf ./第二步:修改 redis.conf 文件,将 daemon

9、ize 改为 yes先要使用 vim redis.conf第三步:使用命令后端启动 redisrootitheima bin# ./redis-server redis.conf第四步:查看是否启动成功关闭后端启动的方式:强制关闭:rootitheima bin# kill -9 5071正常关闭:rootitheima bin# ./redis-cli shutdown在项目中,建议使用正常关闭。因为 redis 作为缓存来使用的话,将数据据持久化到本地之后,再关闭。到内存中,如果使用正常关闭,则会将内存数如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。4 Redis 客户端

10、Redis 自带的客户端启动启动客户端命令:rootitheima bin# ./redis-cli -h -p 6379-h:指定-p:指定的redis 服务器的 ip 地址的redis 服务器的 port 端口还可以写成:rootitheima bin# ./redis-cli使用默认配置:默认的 ip【】,默认的 port【6379】关闭Ctrl+c :6379 quit图形界面客户端安装文件位置:安装之后,打开如下:设置:rootitheima redis-3.0.0# vim /etc/sysconfig/iptables# Firewall configuration writte

11、n by system-config-firewall# Manual customization of this file is notmended.*filter:INPUT ACCEPT 0:0:FORWARD ACCEPT 0:0:OUTPUT ACCEPT 0:0-A INPUT -m se -se ESTABLISHED,RELATED -j ACCEPT-A INPUT -p icmp -j ACCEPT-A INPUT -i lo -j ACCEPT-A INPUT -m se -se NEW -m tcp -p tcp -dport 22 -j ACCEPT-A INPUT

12、-m se -se NEW -m tcp -p tcp -dport 3306 -j ACCEPT-A INPUT -m se -se NEW -m tcp -p tcp -dport 8080 -j ACCEPT-A INPUT -m se -se NEW -m tcp -p tcp -dport 6379 -j ACCEPT-A INPUT -j REJECT -reject-with icmp-host-prohibited-A FORWARD -j REJECT -reject-with icmp-host-prohibited COMMIT/etc/sysconfig/iptable

13、s 16L, 677C 已写入rootitheima redis-3.0.0# service iptables restartiptables:清除规则:确定iptables:将链设置为政策 ACCEPT:filter确定iptables:正在卸载模块:确定iptables:应用规则:确定rootitheima redis-3.0.0#Redis.conf 中的数据库数量的设置:选择数据库的方式:使用 select 加上数据库的下标 就可以选择指定的数据库来使用,下标从 0 开始:6379 select 15 OK:637915Jedis 客户端jedis 介绍Redis 不仅是使用命令来操

14、作,现在基本上主流的语言都有客户端支持,比如 java、C、C#、C+、在、Node.js、Go 等。一些 Java 的客户端,有 Jedis、Redisson、Jredis、JDBC-Redis、等其中官方使用Jedis 和Redisson。在企业中用的最多的就是 Jedis,下面就重点学习下Jedis。Jedis 同样也是托管在上,地址:/xetorthio/jedis工程搭建添加 jar 包单实例连接 redis使用 jedis 连接池连接 redis 服务器Spring 整合 jedisPool()添加 spring 的jar 包配置 spring 配置文件 applicationCo

15、ntext.xml测试代码Testpublic void testJedisPool() JedisPool pool = (JedisPool) applicationContext.getBean(jedisPool); Jedis jedis = null;try jedis = pool.getResource();jedis.set(name, lisi); String name = jedis.get(name); System.out.prln(name);该值 且 空闲连接最大空闲连接数 时直接-5 Redis 数据类型String命令 赋值语法:SET key value

16、取值语法:GET key 取值并赋值语法:GETSET key value:6379 getset s2 222111:6379 get s2:6379 get test123“:6379 set test 123 OK catch (Exception ex) ex.prStackTrace(); finally if (jedis != null) / 关闭连接jedis.close(); 设置/获取多个键值语法:MSET key value key value MGET key key 删除语法:DEL key 数值增减递增数字当的字符串是整数时,Redis 提供了一个实用令 INCR,

17、其作用是让当前键值递增,并返回递增后的值。语法:INCR key增加指定的整数:6379 incr num(eger) 1:6379 incr num(eger) 2:6379 incr num(eger) 3:6379 del test(eger) 1:6379 mset k1 v1 k2 v2 k3 v3 OK:6379 get k1 v1:6379 mget k1 k31) v12) v3222语法:INCRBY key increment递减数值语法:DECR key减少指定的整数语法:DECRBY key decrement 其它命令().1向尾部追加值APPEND 的作用是向键值的

18、末尾追加 value。如果键不存在则将该键的值设置为 value,即相当于 SET key value。返回值是追加后字符串的总长度。语法:APPEND key value:6379 set stro OK:6379 append str world! (eger) 12:6379 get stro world!:6379 decr num(eger) 6:6379 decr num(eger) 5:6379 decrby num 3(eger) 2:6379 decrby num 3(eger) -1:6379 decr num(eger) 9:6379 decr num(eger) 8:6

19、379 incrby num 2(eger) 5:6379 incrby num 2(eger) 7:6379 incrby num 2(eger) 9.2获取字符串长度STRLEN 命令返回键值的长度,如果键不存在则返回 0。语法:STRLEN key应用 自增主键商品、订单号采用 string 的递增数字特性生成。定义商品key:items:id:7003 INCR items:id(eger) 2:7003 INCR items:id(eger) 3Hash散列类型使用 string假设有 User 对象以 JSON 序列化的形式到 Redis 中,User 对象有 id,usernam

20、e、password、age、name 等属性,保存、更新:的过程如下::6379 strlen str(eger) 0:6379 set stro OK:6379 strlen str(eger) 5User 对象 json(string) redis如果在业务上只是更新 age 属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传输、处理时会造成资源浪费,下边讲的 hash 可以很好的解决这个问题。redis hash 介绍hash 叫散列类型,它提供了字段和字列类型、集合类型等其它类型。如下:的。字只能是字符串类型,不支持散命令 赋值HSET 命令不区分作时返回 0。和

21、更新操作,当执行操作时 HSET 命令返回 1,当执行更新操一次只能设置一个字语法:HSET key field value一次可以设置多个字语法:HMSET key field value field value .当字段不存在时赋值,类似 HSET,区别在于如果字段存在,该命令不执行任何操作:6379 hmset user age 20 username lisi OK:6379 hset user username zhangsan (eger) 1语法:HSETNX key field value 取值一次只能获取一个字语法:HGET key field一次可以获取多个字语法:HMGE

22、T key field field .获取所有字语法:HGETALL key 删除字段可以删除一个或多个字段,返回值是被删除的字段个数语法:HDEL key field field .:6379 hdel user age (eger) 1:6379 hdel user age name (eger) 0:6379 hdel user age username (eger) 1:6379 hgetall user1) age 2) 20usernamelisi:6379 hmget user age username 1) 202) lisi:6379 hget user username z

23、hangsan“:6379 hsetnx user age 30如果 user 中没有 age 字段则设置 age 值为 30,否则不做任何操作(eger) 0 增加数字语法:HINCRBY key field increment 其它命令().1判断字段是否存在语法:HEXISTS key field.2只获取字段名或字语法:HKEYS key HVALS key:6379 hmset user age 20 name lisi OK:6379 hkeys useragename :6379 hvals user 1) 202) lisi:6379 hexists user age查看 us

24、er 中是否有 age 字段(eger) 1:6379 hexists user name查看 user 中是否有 name 字段(eger) 0:6379 hincrby user age 2将用户的加 2(eger) 22:6379 hget user age获取用户的22“.3获取字段数量语法:HLEN key应用商品信息商品字段【商品 id、商品名称、商品描述、商品库存、商品好评】定义商品信息的 key商品 1001 的信息在Redis 中的 key 为:items:1001商品信息获取商品信息ListArraylist 和 linkedlist 的区别Arraylist 是使用数组来

25、数据,特点:查询快、增删慢Linkedlist 是使向链表数据,特点:增删快、查询慢,但是查询链表两端的数据也很:7003 HGET items:1001 id 3:7003 HGETALL items:10011) id 2) 3nameappleprice 6) 999.9:7003 HMSET items:1001 id 3 name apple price 999.9 OK:6379 hlen user(eger) 2快。Redis 的 list 是采用来链表来端数据来操作的。的,所以对于 redis 的 list 数据类型的操作,是操作 list 的两命令 向列表两端增加元素语向列表

26、左边增加元素PUSH key value value .向列表右边增加元素语法:RPUSH key value value . 查看列表LRANGE 命令是列表类型最常用令之一,获取列表中的某一片段,将返回 start、stop 之间的所有元素(包含两端的元素),索引从 0 开始。索引可以是负数,如:“-1”代表最后边的一个元素。语RANGE key start stop 从列表两端弹出元素LPOP 命令从列表左边弹出一个元素,会分两步完成:第一步是将列表左边的元素从列表中移除:6379 lrange list:1 0 21) 22) 13) 4:6379 lrange list1 0 -1:

27、6379 rpush list:1 4 5 6(eger) 3:6379 lpush list:1 1 2 3(eger) 3第二步是返回被移除的元素值。语法:LPOP key RPOP key 获取列表中元素的个数语LEN key 其它命令().1删除列表中指定的值LREM 命令会删除列表中前count 个值为value 的元素,返回实际删除的元素个数。根据 count值的不同,该命令的执行方式会有所不同:当 count0 时,当 count lset l:list 2 2:6379 lindex l:list 21:6379 llen list:1(eger) 2:6379 lpop li

28、st:13“:6379 rpop list:16“.3只保留列表指定片段指定范围和 LRANGE 一致语TRIM key start stop.4向列表中元素该命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 BEFORE 还是 AFTER 来决定将 value到该元素的前面还是后面。语INSERT key BEFORE|AFTivot value:6379 lrange list 0 -11) 32) 23) 1:6379 linsert list after 3 4(eger) 4:6379 lrange list 0 -11) 3:6379 lrange l:

29、list 0 -11) 62) 53) 04) 2:6379 ltrim l:list 0 2 OK:6379 lrange l:list 0 -11) 62) 53) 0OK:6379 lrange l:list 0 -11) 62) 53) 24) 2.5将元素从一个列表转移到另一个列表中语法:RPOPLPUSH source destination应用 商品评论列表思路:在 Redis 中创建商品评论列表用户发布商品评论,将评论信息转成json到 list 中。用户在页面查询评论列表,从redis 中取出 json 数据展示到页面。定义商品评论列表 key:商品为 1001 的商品评论

30、key【items: comment:1001】Set集合类型集合类型:无序、不可重复列表类型:有序、可重复:7001 LPUSHment:1001 id:1,name: 商品不错,很好 !,date:1430295077289:6379 rpoplpush list newlist 1:6379 lrange newlist 0 -11) 1:6379 lrange list 0 -11) 32) 43) 22) 43) 24) 1命令 增加/删除元素语法:SADD key member member .语法:SREM key member member . 获得集合中的所有元素语法:SME

31、MBERS key 判断元素是否在集合中语法:SISMEMBER key member运算命令 集合的差集运算 A-B属于 A 并且不属于 B 的元素的集合。:6379 sismember set a (eger) 1:6379 sismember set h (eger) 0:6379 smembers set1) b2) a”:6379 srem set c d (eger) 1:6379 sadd set a b c (eger) 3:6379 sadd set a (eger) 0语法:SDIFF key key . 集合的交集运算 A B属于 A 且属于 B 的元素的集合。语法:SE

32、R key key . 集合的并集运算 A B属于 A 或者属于B 的元素的集合:6379 ser setA setB 1) 22) 3:6379 sadd setA 1 2 3(eger) 3:6379 sadd setB 2 3 4(eger) 3:6379 sdiff setA setB 1) 1:6379 sdiff setB setA 1) 4语法:SUNION key key .其它命令() 获得集合中元素的个数语法:SCARD key 从集合出一个元素注意:由于集合是无序的,所有 SPOP 命令会从集合中随机选择一个元素弹出语法:SPOP key:6379 spop setA1“

33、:6379 smembers setA1) 12) 23) 3:6379 scard setA(eger) 3:6379 sunion setA setB 1) 12) 23) 34) 4SortedsetSortedset 又叫 zsetSortedset 是有序集合,可排序的,但是唯一。Sortedset 和 set 的不同之处,是会给 set 中的元素添加一个分数,然后通过这个分数进行排序。命令 增加元素向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。语法:ZADD key score m

34、ember score member . 获取元素的分数语法:ZSCORE key member 删除元素移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。语法:ZREM key member member .:6379 zrem scorlisi (eger) 1:6379 zscore scorlisi 97:6379 zadd scor80 zhangsan 89 lisi 94 wangwu(eger) 3:6379 zadd scor97 lisi(eger) 0 获得在某个范围的元素列表获得在某个范围的元素列表按照元素分

35、数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)语法:ZRANGE key start stop WITHSCORES按照元素分数从大到小的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)语法:ZREVRANGE key start stop WITHSCORES如果需要获得元素的分数的可以在命令尾部加上 WITHSCORES 参数 获取元素的从小到大语法:ZRkey member从大到小语法:ZREVRkey member:6379 ZREVRscorzhangsan (eger) 1:6379 ZRscorlisi (eger

36、) 0:6379 zrange scor0 1 WITHSCORES1) zhangsan 2) 803) wangwu 4) 94:6379 zrevrange scor0 2 lisi wangwu zhangsan “:6379 zrange scor0 2zhangsanwangwulisi“ 其它命令().1获得指定分数范围的元素语法:ZRANGEBYSCORE key max WITHSCORES LIMIT offset count.2增加某个元素的分数返回值是更改后的分数语法:ZINCRBYkey increment member.3获得集合中元素的数量语法:ZCARD key

37、.4获得指定分数范围内的元素个数语法:ZCOUNT key max:6379 ZCOUNT scor80 90(eger) 1:6379 ZCARD scor(eger) 3:6379 ZINCRBY scor4 lisi101“:6379 ZRANGEBYSCORE scor90 97 WITHSCORES1) wangwu 2) 943) lisi 4) 97:6379 ZRANGEBYSCORE scor70 100 limit 1 2wangwulisi.5按照范围删除元素语法:ZREMRANGEBYRkey start stop.6按照分数范围删除元素语法:ZREMRANGEBYSC

38、ORE key max应用 商品销售榜需求:根据商品销售量对商品进行显示思路:定义商品销售榜(sorted set 集合),Key 为 itemlsort,分数为商品销售量。写入商品销售量:商品1001 的销量是 9,商品1002 的销量是 10商品1001 的销量加 1商品销量前 10 名::7001 ZRANGE itemlsort 0 9 withscores:7001 ZINCRBY itemlsort 1 1001:7007 ZADD itemlsort 9 1001 10 1002:6379 zadd scor84 zhangsan(eger) 1:6379 ZREMRANGEBY

39、SCORE scor80 100(eger) 1:6379 ZREMRANGEBYRscor0 1(eger) 2:6379 ZRANGE scor0 -11) lisi6 Keys 命令常用命令keys返回满足给定 pattern的所有 keyexists确认一个 key 是否存在示例:从结果来看,数据库中不存在 HongWan这个 key,但是 age 这个 key 是存在的del删除一个 keyredis :6379 del age (eger) 1redis :6379 exists age (eger) 0redis :6379 exists HongWan (eger) 0redi

40、s :6379 exists age (eger) 1redis :6379redis :6379 keys mylist*mylistmylist5mylist6mylist7mylist8rename重命名 key示例:age 成功的被改名为 age_new 了type返回值的类型示例:这个方法可以非常简单的判断出值的类型设置 key 的生存时间Redis 在实际使用过程中即:到期后数据销毁。的用作缓存,然而缓存的数据一般都是需要设置生存时间的,例子::7002 set test 1设置 test 的值为 1 OK:7002 get test获取 test 的值EXPIRE key sec

41、onds设置 key 的生存时间(:秒)key 在多少秒后会自动删除TTL key查看 key 生于的生存时间PERSIST key清除生存时间PEXPIRE key milliseconds生存时间设置为:毫秒redis :6379 type addr stringredis :6379 type myzset2 zsetredis :6379 type mylist listredis :6379redis :63791 keys *1) ageredis :63791 rename age age_new OKredis :63791 keys *1) age_newredis :637

42、917 Redis 持久化方案Rdb 方式Redis 默认的方式,redis 通过快照来将数据持久化到磁盘中。设置持久化快照的条件在 redis.conf 中修改持久化快照的条件,如下:持久化文件的目录在 redis.conf 中可以指定持久化文件的目录1:7002 EXPIRE test 5设置 test 的生存时间为 5 秒(eger) 1:7002 TTL test查看 test 的生于生成时间还有 1 秒删除(eger) 1:7002 TTL test(eger) -2:7002 get test获取 test 的值,已经删除(nil)Rdb 问题一旦 redis关闭,那么会丢失最后一

43、次持久化之后的数据。如果数据不重要,则不必要关心。如果数据不能允许丢失,那么要使用 aof 方式。Aof 方式Redis 默认是不使用该方式持久化的。Aof 方式的持久化,是操作一次 redis 数据库,则将操作的到 aof 持久化文件中。第一步:开启 aof 方式的持久化方案将 redis.conf 中的 appendonly 改为 yes,即开启 aof 方式的持久化方案。Aof 文件的目录和 rdb 方式的一样。Aof 文件的名称结论在使用 aof 和 rdb 方式时,如果 redis 重启,则数据从 aof 文件加载。8 Redis 的主从主从持久化保证了即使 redis 服务重启也不

44、会丢失数据,因为 redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 redis 服务器的硬盘损坏了可能会导致数据丢失,如果通过 redis 的主从机制就可以避免这种单点故障,如下图:主 Redis(master)从 Redis2(slave)从 Redis1(slave)说明:主 redis 中的数据有两个副本(replication)即从 redis1 和从 redis2,即使一台 redis 服务器宕机其它两台 redis 服务也可以继续提供服务。主 redis 中的数据和从 redis 上的数据保持实时同步,当主 redis 写入数据时通过主从复制机制会到两个从 redi

45、s 服务上。只有一个主redis,可以有多个从 redis。主从不会阻塞 master,在同步数据时,master 可以继续处理 c nt 请求一个 redis 可以即是主又是从,如下图:主 Redis(master)从 Redis2(slave)从 Redis1(slave)从 Redis4(slave)从 Redis3(slave)主从设置主机配置无需配置从机配置第一步:出一个从机rootitheima redis19# cp bin/ bin2 r第二步:修改从机的redis.conf语法:Slaveof masterip mastslaveof 37 6379ort第三步:修改从机的

46、port 地址为 6380在 redis.conf 中修改第四步:清除从机中的持久化文件rootitheima bin2# rm -rf appendonly.aof dump.rdb第五步:启动从机rootitheima bin2# ./redis-server redis.conf第六步:启动 6380 的客户端rootitheima bin2# ./redis-cli -p 6380注意:主机一旦发生增删改操作,那么从机会将数据同步到从机中从机不能执行写操作:6380 set s2 222(error) READONLY You cant write against a read onl

47、y slave.9 Redis 集群redis-cluster 架构图示例如下:Server3 10001-13000Server1 0-5000Server2 5001-100007000架构细节:所有的redis 节点彼此互联(-PONG 机制),二进制协议优化传输速度和带宽.节点的 fail 是通过集群中超过半数的节点检测失效时才生效.客户端与 redis 节点直连,不需要中间proxy 层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可redis-cluster 把所有的物理节点到0-16383slot 上,cluster 负责nodeslotvalueRedis 集群中

48、内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽到不同的节点redis-cluster 投票:容错安装 ruby集群管理工具(redis-trib.rb)是使用 ruby语言编写的。第一步:安装 rubyrootitheima bin2# yum install ruby rootitheima bin2# yum install rubygems第二

49、步:将以下文件上传到 linux 系统集群中所有 master 参与投票,如果半数以上 master 节点与其中一个 master 节点通信超过(cluster-node-timeout),认为该 master 节点挂掉.:什么时候整个集群不可用(cluster_se:fail)?如果集群任意 master 挂掉,且当前master 没有 slave,则集群进入 fail 状态。也可以理解成集群的0-16383slot不完全时进入 fail 状态。如果集群超过半数以上 master 挂掉,无论是否有 slave,集群进入 fail 状态。第三步:安装 ruby 和redis 接口rootith

50、eima # gem install redis-3.0.0.gem第四步:将redis-3.0.0 包下 src 目录中的以下文件拷贝到 redis19/redis-cluster/rootitheima src# cd /usr/local/redis19/rootitheima redis19# mkdir redis-cluster rootitheima redis19# cd /root/redis-3.0.0/src/rootitheima src# cp redis-trib.rb/usr/local/redis19/redis-cluster第五步:查看是否拷贝成功搭建集群搭

51、建集群最少也得需要 3 台主机,如果每台主机再配置一台从机的话,则最少需要 6 台机器。端口设计如下:7001-7006第一步:出一个 7001 机器rootitheima redis19# cp bin ./redis-cluster/7001 r第二步:如果存在持久化文件,则删除rootitheima 7001# rm -rf appendonly.aof dump.rdb第三步:设置集群参数第四步:修改端口第五步:出 7002-7006 机器rootitheima redis-cluster# cp 7001/ 7002 -rrootitheima redis-cluster# cp 7

52、001/ 7003 -r rootitheima redis-cluster# cp 7001/ 7004 -r rootitheima redis-cluster# cp 7001/ 7005 -rrootitheima redis-cluster# cp 7001/ 7006 r第六步:修改 7002-7006 机器的端口第七步:启动 7001-7006 这六台机器第八步:修改 start-all.sh 文件的权限rootitheima redis-cluster#od u+x start-all.shrootitheima redis-cluster# ./start-all.sh第九步

53、:创建集群rootitheima redis-cluster# ./redis-trib.rb create -replicas 1 37:7001 37:7002 37:7003 37:7004 37:700537:7006 Creating clusterConnecting to node 37:7001: OK Connecting to node 37:7002: OK Connecting to node 37:7003: OK Connecting to node 37:7004: OK Connecting to node 37:7005: OK Connecting to n

54、ode 37:7006: OK Performing hash slots allocation on 6 nodes. Using 3 masters:37:700137:700237:7003Adding replica 37:7004 to 37:7001Adding replica 37:7005 to 37:7002Adding replica 37:7006 to 37:7003M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 37:7001 slots:0-5460 (5461 slots) masterM: 4f52a974f64343fd

55、9f1ee0388490b3c0647a4db7 37:7002slots:5461-10922 (5462 slots) masterM: cb7c5def8f61df2016b38972396a8d1f349208c2 37:7003slots:10923-16383 (5461 slots) masterS: 66adf006fed43b3b5e499ce2ff1949a756504a16 37:7004replicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24S: cbb0c9bc4b27dd85511a7ef2d01bec90e692793

56、b 37:7005replicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7S: a908736eadd1cd06e86fdff8b2749a6f46b38c00 37:7006replicates cb7c5def8f61df2016b38972396a8d1f349208c2 Can I set the above configuration? (type yes to accept): yes Nodes configuration updated Assign a different config epoch to each node Sen

57、ding CLUSTER MEET messages to johe cluster Waiting for the cluster to join. Performing Cluster Check (using node 37:7001)M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 37:7001 slots:0-5460 (5461 slots) masterM: 4f52a974f64343fd9f1ee0388490b3c0647a4db7 37:7002slots:5461-10922 (5462 slots) master连接集群root

58、itheima 7001# ./redis-cli -h 37 -p 7001 c-c:指定是集群连接查看集群信息查看集群信息37:7002 cluster infocluster_se:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0M: cb7c5def8f61df2016b38972396a8d1f349208c2 37:7003slots:10923-16383 (5461 slots) masterM: 66adf006fed43b3b5e499ce2ff1949a756504a16 3

59、7:7004slots: (0 slots) masterreplicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24M: cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 37:7005slots: (0 slots) masterreplicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7M: a908736eadd1cd06e86fdff8b2749a6f46b38c00 37:7006slots: (0 slots) masterreplicates cb7c5def8f

60、61df2016b38972396a8d1f349208c2 OK All nodes agree about slots configuration. Check for open slots. Check slots coverage. OK All 16384 slots covered. rootitheima redis-cluster#查看集群节点10jedis 连接集群设置rootitheima redis-cluster# vim /etc/sysconfig/iptables-A INPUT -m se -se NEW -m tcp -p tcp -dport 6379 -j

温馨提示

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

评论

0/150

提交评论