经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
Springboot 2.0.x 集成基于Centos7的Redis集群安装及配置
来源:cnblogs  作者:xu_shuyi  时间:2019/3/4 9:17:58  对本文有异议

Redis简介

Redis是一个基于C语言开发的开源(BSD许可),开源高性能的高级内存数据结构存储,用作数据库、缓存和消息代理。它支持数据结构,如 字符串、散列、列表、集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的地理空间索引。Redis具有内置复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区。

可以对这些数据类型进行原子性操作,例如 附加到字符串;递增哈希值;将元素推送到列表中;计算集合交集,并集和差异;或则在排序中获得排名最高的成员。为了实现其出色的性能,Redis使用内存数据集。根据您的配置情况,可以通过 每隔一段时间将数据集转存储到磁盘或通过每个命令附加到日志文件来保存它。如果您只需要功能丰富的网络内存缓存,则可以选择禁用持久性。

Redis还支持简单到设置的主从异步复制,具有非常快速的非阻塞第一次同步,自动重新连接以及在网络分割上的部分重新同步。

核心对象

RedisObject,图片来源:一文读懂redis

Redis五种数据结构对应的编码,图片来源:对象处理机制

五种数据结构类型,图片来源:初识Redis

1. Redis中的字符串

 Redis的STRING和其他编程语言或则其他键值存储提供的字符串非常的相似。本文在使用图片表示键值的时候,通常会将键名(key name)和值的类型放在方框的顶部,将值放在方框的里面。

STRING拥有一些和其他键值存储相似的命令,比如GET(获得值)、SET(设置值)和DEL(删除值)。

2. Redis中的列表

Redis对链表(linked-list)结构的支持使得它在键值存储的世界中独树一帜。一个列表结构可以有序的存储多个字符串,和表示字符串时使用的方法一样。

list-key是一个包含三个元素的列表键,注意列表中的元素时可以重复的。

Redis列表可执行的操作和很多编程语言李米娜的列表操作非常的相似:LPUSH命令和RPUSH命令分别用户将元素推送至列表的左端(left end)和右端(right end);LPOP命令和RPOP命令分别用于从列表的左端和右端弹出元素;LINDEX命令用于获取列表在给定位置上的一个元素;LRANGE命令用于获取列表在给定范围上的所有元素。

3. Redis中的集合

Redis的集合和列表都可以存储多个字符串,它们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符都是各个相同的(这些散列表只有键,但没有与键相关联的值)。

因为Redis的集合使用无序(unordered)方式存储元素,所以用户不能像使用列表那样,将元素推入到集合的某一端,或者从结合的某一端弹出元素。不过用户可以使用SADD命令将元素添加到集合,或者使用SREM命令从集合里面移除元素。另外,还使用SISMEMBER命令快速地检查一个元素是否已经存在于集合中,或者使用SMEMBERS命令获取集合包含的所有元素(如果集合包含的元素非常多,那么SMEMBERS命令的执行速度可能会很慢,所以请谨慎地使用这个命令)。

4. Redis中的散列

Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以时字符串又可以时数字值,并且用户同样可以对散列存储的数字值执行自增操作或自减操作。

hash-key是一个包含两个键值对的散列键。

散列在很多方面就像是一个微缩版的Redis,好几个字符串命令都有相应的散列版本。其操作命令:HSET 在散列里面关联起给定的键值对;HGET 获取指定散列键的值;HGETALL 获取散列包含的所有键值对;HDEL 如果给定键存在于散列里面,那么移除这个键。

5. Redis中的有序集合

Redis有序集合和散列一样,都用于存储键值对,其中有序集合的每个键称为成员(member),都是独一无二的,而有序集合的每个值称为分值(score),都必须是浮点数。有序集合是Redis里面唯一既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。

zset-key是一个包含两个元素的有序集合键。

和Redis的其他结构一样,用户可以对有序集合执行添加、移除和获取等操作。

Redis集群安装及配置

服务器及节点:

192.168.56.101 7000、1001、7002;

192.168.56.102 7003、7004、7005

1. 安装GCC编译工具,不然可能会编译的过程中出现编译失败情况

  1. yum install gcc g++ gcc-c++ make

2. 下载并安装Redis 官网下载

 

  1. cd /opt
  2. 如果未找到wget命令:yum -y install wget
  3. wget http://download.redis.io/releases/redis-4.0.10.tar.gztar xzf redis-4.0.10.tar.gz
  4. cd redis-4.0.10make

 

3. 如果因为编译失败,又残留的文件

  1. make distclean

4. 创建节点

步骤 1:

首先在 192.168.56.101机器上 /opt/redis-4.0.10目录下建 redis-cluster 目录

  1. mkdir /opt/redis-4.0.10/redis-cluster

步骤 2:

 redis-cluster 目录下,创建名为7000、7001、7002的目录

 

  1. mkdir 7000 7001 7002

 

步骤 3:

分别修改这三个配置文件,把如下redis.conf 配置内容粘贴进去

  1. vi 7000/redis.conf 
  2. vi 7001/redis.conf
  3. vi 7002/redis.conf

redis.conf 示例:

  1. port 7000bind 192.168.56.101daemonize yes
  2. pidfile /var/run/redis_7000.pid
  3. logfile /var/log/redis/redis_7000.log
  4. cluster-enabled yes
  5. cluster-config-file nodes_7000.conf
  6. cluster-node-timeout 10100dbfilename dump_7000.rdb
  7. appendonly yes
  8. appendfilename "appendonly_7000.aof"

说明:

  1. #端口7000,7001,7002port 7000#默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
  2. bind 192.168.56.101#redis后台运行
  3. daemonize yes
  4. #pidfile文件对应7000,7001,7002pidfile /var/run/redis_7000.pid
  5. #开启集群,把注释#去掉
  6. cluster-enabled yes
  7. #集群的配置,配置文件首次启动自动生成 7000,7001,7002          cluster-config-file nodes_7000.conf
  8. #请求超时,默认15秒,可自行设置 
  9. cluster-node-timeout 10100    #aof日志开启,有需要就开启,它会每次写操作都记录一条日志
  10. appendonly yes

步骤 4:

接着在另外一台机器上(192.168.56.102)重复以上三步,只是把目录改为7003、7004、7005对应的配置文件也按照这个规则修改即可

 5. 启动节点

  1. # 第一台机器上执行 3个节点for((i=0;i<=2;i++)); do /opt/redis-4.0.10/src/redis-server  /opt/redis-4.0.10/redis-cluster/700$i/redis.conf; done
  2. # 第二台机器上执行 3个节点for((i=3;i<=5;i++)); do /opt/redis-4.0.10/src/redis-server  /opt/redis-4.0.10/redis-cluster/700$i/redis.conf; done
  3. # 启动单个节点示例/opt/redis-4.0.10/src/redis-server /opt/redis-4.0.10/redis-cluster/7000/redis.conf

6. 检查服务

检查各 Redis 各个节点启动情况

  1. ps -ef | grep redis           //redis是否启动成功netstat -tnlp | grep redis    //监听redis端口

安装 netstat :https://www.cnblogs.com/cocoajin/p/4064547.html

7. 安装Ruby

  1. yum -y install ruby ruby-devel rubygems rpm-build
  2. gem install redis

安装过程中可能会出现异常情况发生,比如:

解决办法:https://blog.csdn.net/FengYe_YuLu/article/details/77628094

8. 创建集群

注意:

在任意一台上运行 不要在每台机器上都运行,一台就够了

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中

  1. /opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 192.168.56.101:7000 192.168.56.101:7001 192.168.56.101:7002 192.168.56.102:7003 192.168.56.102:7004 192.168.56.102:7005

出现以下内容,则表示集群创建成功了:

  1. [root@master1 /]# /opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 192.168.56.101:7000 192.168.56.101:7001 192.168.56.101:7002 192.168.56.102:7003 192.168.56.102:7004 192.168.56.102:7005
  2. >>> Creating cluster>>> Performing hash slots allocation on 6 nodes...
  3. Using 3 masters:192.168.56.101:7000
  4. 192.168.56.102:7003
  5. 192.168.56.101:7001Adding replica 192.168.56.102:7005 to 192.168.56.101:7000Adding replica 192.168.56.101:7002 to 192.168.56.102:7003Adding replica 192.168.56.102:7004 to 192.168.56.101:7001M: 6af67c2741b3001e6d328621ac8a2e539b65d683 192.168.56.101:7000
  6.    slots:0-5460 (5461 slots) master
  7. M: e2f298953141f46b255b0f35372af917afc16205 192.168.56.101:7001
  8.    slots:10923-16383 (5461 slots) master
  9. S: 3516ed59324a7421878b2c17aba44d91ec7e9439 192.168.56.101:7002
  10.    replicates ab5b4535f3382c13d7afb91d005e8a87d830eb46
  11. M: ab5b4535f3382c13d7afb91d005e8a87d830eb46 192.168.56.102:7003
  12.    slots:5461-10922 (5462 slots) master
  13. S: 16822c6d58461f9edaf965aa53efdac59d1adce5 192.168.56.102:7004
  14.    replicates e2f298953141f46b255b0f35372af917afc16205
  15. S: c00dea4a44e01e1f17b29f7b3b95e0c57b06a653 192.168.56.102:7005
  16.    replicates 6af67c2741b3001e6d328621ac8a2e539b65d683
  17. Can I set the above configuration? (type 'yes' to accept): yes

输入 yes

  1. >>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the cluster
  2. Waiting for the cluster to join....>>> Performing Cluster Check (using node 192.168.56.101:7000)
  3. M: 6af67c2741b3001e6d328621ac8a2e539b65d683 192.168.56.101:7000
  4.    slots:0-5460 (5461 slots) master   1 additional replica(s)
  5. S: c00dea4a44e01e1f17b29f7b3b95e0c57b06a653 192.168.56.102:7005
  6.    slots: (0 slots) slave
  7.    replicates 6af67c2741b3001e6d328621ac8a2e539b65d683
  8. S: 3516ed59324a7421878b2c17aba44d91ec7e9439 192.168.56.101:7002
  9.    slots: (0 slots) slave
  10.    replicates ab5b4535f3382c13d7afb91d005e8a87d830eb46
  11. M: ab5b4535f3382c13d7afb91d005e8a87d830eb46 192.168.56.102:7003
  12.    slots:5461-10922 (5462 slots) master   1 additional replica(s)
  13. S: 16822c6d58461f9edaf965aa53efdac59d1adce5 192.168.56.102:7004
  14.    slots: (0 slots) slave
  15.    replicates e2f298953141f46b255b0f35372af917afc16205
  16. M: e2f298953141f46b255b0f35372af917afc16205 192.168.56.101:7001
  17.    slots:10923-16383 (5461 slots) master   1 additional replica(s)
  18. [OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...
  19. [OK] All 16384 slots covered.

重启集群过程中,可能出现问题:

[ERR] Node 192.168.56.101:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

解决:

需要将redis-cluster数据文件清空,执行脚本如下:

 

  1. rm -rf /opt/redis-4.0.10/redis-cluster/dump.rdb /opt/redis-4.0.10/redis-cluster/nodes_*.conf /opt/redis-4.0.10/redis-cluster/appendonly.aof

 

9. 关闭集群

 

 推荐:

  1. pkill redis

也可以通过循环节点方式,逐个关闭:

  1. for((i=0;i<=2;i++)); do /opt/redis-4.0.10/src/redis-cli --192.168.56.101 -700$i shutdown; donefor((i=3;i<=5;i++)); do /opt/redis-4.0.10/src/redis-cli --192.168.56.102 -700$i shutdown; done

关闭单个节点:

  1. /opt/redis-4.0.10/src/redis-cli --192.168.56.101 -7000 shutdown

10. 集群验证

步骤1 . 连接集群测试

参数 -C 可连接到集群,因为 redis.conf bind 改为了ip地址,所以 -h 参数不可以省略,-p 参数为端口号

我们在192.168.256.101机器redis 7000 的节点set 一个key

 

  1. /opt/redis-4.0.10/src/redis-cli -192.168.56.101 --7000执行如下:
  2. set name xushuyi
  3. get name

 

我们在192.168.56.102机器redis 7000 的节点get一个key

 

  1. /opt/redis-4.0.10/src/redis-cli -192.168.56.102 --7000执行如下:
  2. get name

 

步骤2 . 检查集群状态

  1. /opt/redis-4.0.10/src/redis-trib.rb check 192.168.56.101:7000

步骤3 . 列出集群节点

  1. /opt/redis-4.0.10/src/redis-cli -192.168.56.101 --7000

更详细的,请参考:https://segmentfault.com/a/1190000010682551

11. spring boot 2.0.x 服务集成Redis集群

1. 引入依赖

  1. <!-- redis -->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!-- redis 依赖 commons-pool -->
  7. <dependency>
  8.     <groupId>org.apache.commons</groupId>    
  9.     <artifactId>commons-pool2</artifactId>
  10. </dependency>

2. 配置文件

  1. # redis 集群配置
  2. spring:
  3.   redis:
  4.     cluster:
  5.       nodes: 192.168.56.101:7000,192.168.56.101:7001,192.168.56.101:7002,192.168.56.102:7003,192.168.56.102:7004,192.168.56.102:7005timeout: 6000ms # 连接池超时时间(毫秒)
  6.     # 密码没有可以不填
  7.     password:
  8.     database: 0 # 数据库索引
  9.     lettuce:
  10.       pool:
  11.         max-active: 8 # 连接池最大活跃连接数(使用负值表示没有限制)
  12.         max-idle: 8 # 连接池最大空闲连接数
  13.         max-wait: -1ms # 连接池最大阻塞等待时间 毫秒(使用负值表示没有限制)
  14.         min-idle: 0 # 最小空闲连接数

3. 创建RedisConfig配置文件

  1. package com.sinosoft.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.boot.autoconfigure.AutoConfigureAfter;import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;/**
  2.  * @ClassName: RedisConfig
  3.  * @Description: Redis配置
  4.  * @author: Created by xushuyi <a href="xu_xxx1002@163.com">Contact author</a>
  5.  * @date: 2019/2/28 16:01
  6.  * @Version: V1.0 */@Configuration
  7. @AutoConfigureAfter(RedisAutoConfiguration.class)public class RedisConfig {/** * 注入自定义的RedisTemplate
  8.      *
  9.      * @param redisConnectFactory LettuceConnectionFactory
  10.      * @return RedisTemplate     */@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectFactory) {
  11.         RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  12.         redisTemplate.setConnectionFactory(redisConnectFactory);// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  13.         ObjectMapper objectMapper = new ObjectMapper();
  14.         objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  15.         objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  16.         jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
  17.         redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// 使用StringRedisSerializer来序列化和反序列化redis的key值redisTemplate.setKeySerializer(new StringRedisSerializer());
  18.         redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  19.         redisTemplate.setHashValueSerializer(new StringRedisSerializer());
  20.         redisTemplate.afterPropertiesSet();return redisTemplate;
  21.     }
  22.  
  23. }

4. 启动入口增加  @EnableCaching

5. 单元测试

  1. package com.sinosoft.redis;import com.sinosoft.AccountApplication;import lombok.extern.slf4j.Slf4j;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.cache.annotation.Cacheable;import org.springframework.context.annotation.Import;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.test.context.ActiveProfiles;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;/**
  2.  * @ClassName: RedisTest
  3.  * @Description: Redis测试
  4.  * @author: Created by xushuyi <a href="xu_shuyi1002@163.com">Contact author</a>
  5.  * @date: 2019/2/28 16:18
  6.  * @Version: V1.0 */@Slf4j
  7. @RunWith(SpringJUnit4ClassRunner.class) // SpringJUnit支持,由此引入Spring-Test框架支持!@SpringBootTest
  8. @Import(AccountApplication.class) // 指定我们SpringBoot工程的Application启动类@ActiveProfiles(profiles = "dev") // 指定Application启动需要引用的配置文件@WebAppConfiguration // 由于是Web项目,Junit需要模拟ServletContext,因此我们需要给我们的测试类加上@WebAppConfigurationpublic class RedisTest {/** * 获取RedisTemplate     */@Autowiredprivate RedisTemplate redisTemplate;/** * 测试前     */@Beforepublic void before() {
  9.         log.info("测试前...");
  10.     }/** * 开始测试     */@Testpublic void redisTest() {// 测试通过RedisTemplate操作redisTemplate.opsForValue().set("name", "huachunjie");
  11.         Object name = redisTemplate.opsForValue().get("name");
  12.         log.info("获取Redis集群中key为name对应的值:{}", name);
  13.     }
  14.  
  15.     @Afterpublic void after() {
  16.         log.info("测试后...");
  17.     }
  18. }

6. 基于注解的方式实现

  1.     /** * 测试Redis缓存
  2.      *
  3.      * @param requestInfo 入参
  4.      * @return */@Override
  5.     @Cacheable(value = "cacheInfo", key = "#requestInfo.token", condition = "#requestInfo != null")public ResponseInfo testRedis(RequestInfo<String> requestInfo) {
  6.         log.info("如果没有进来,则说明启用了Redis缓存...");return new ResponseInfo<>(true, "success", 200, null);
  7.     }

 

原文链接:http://www.cnblogs.com/xushuyi/p/10455308.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号