一、安装
第一步:下载redis
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
第二步:解压压缩包
tar -zxvf redis-5.0.5.tar.gz
第三步:编译安装
make MALLOC=libc
将/usr/local/redis-5.0.5/src目录下的文件添加到/usr/local/bin目录
cd src && make install
二、本机测试
2.1 启动
到安装目录下,使用此命令:./redis-server …/redis.conf
2.2 本地连接
./redis-cli
[root@izuf6gyz9kds1ehq1clau4z src]# ./redis-cli
127.0.0.1:6379>
2.3 新建值
127.0.0.1:6379> set "hutaoqizi" 胡桃七子
OK
三、新建Springboot项目
3.1主要引入的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
3.2创建redis配置类
public class RedisConfig {
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName("139.224.34.233");
redisStandaloneConfiguration.setPort(6379);
redisStandaloneConfiguration.setPassword("123456");
redisStandaloneConfiguration.setDatabase(0);
JedisConnectionFactory factory = new JedisConnectionFactory(redisStandaloneConfiguration);
return factory;
}
@Bean
public StringRedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
return redisTemplate;
}
}
3.3创建测试类
public class RedisTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RedisConfig.class);
RedisTemplate redisTemplate = annotationConfigApplicationContext.getBean(StringRedisTemplate.class);
System.out.println(redisTemplate.opsForValue().get("hutaoqizi"));
}
}
输出结果为:胡桃七子
3.集群搭建
3.1修改配置文件
修改安装目录下的redis.conf文件
daemonize 后台模式,修改为yes
port 端口
bind 绑定的ip(指定ip访问,注释掉)
dir 指定数据存储文件夹
cluster-enabled 是否开启集群模式
cluster-config-file 集群配置文件夹(默认dir文件夹)
cluster-node-timeout 超时时间设置
appendonly 是否持久化
protected-mode 保护模式(开启需配置bind ip或者设置访问密码)
requirepass 密码
masterauth 集群通信密码
修改这些属性,单节点集群属性配置便完成了
3.2多节点配置
集群规格:redis集群最少6节点,3主3从。所有我用了2台虚拟机,每台3节点的搭建结构。当然你也可以1台虚拟机搭建6节点。
复制redis.conf文件,复制2份,如果你台虚拟机搭建6台,就直接复制6份。
修改每一份配置文件的端口,直接替换
vim redis.conf
:%s/6379/6380/g
3.3启动每一个节点
与前面启动方式,指定每一个配置文件启动./redis-server …/redis.conf。启动日志如下:
8432:C 11 Jan 2020 01:12:05.141 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8432:C 11 Jan 2020 01:12:05.141 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=8432, just started
8432:C 11 Jan 2020 01:12:05.141 # Configuration loaded
3.4集群创建
使用如下命令:
redis-cli -a 123456 --cluster create --cluster-replicas 1
139.224.34.233:6001 120.55.101.185:6002 139.224.34.233:6003
120.55.101.185:6004 139.224.34.233:6005 120.55.101.185:6006
replicas表示需要有几个slave,我这边是配置3主3从,所以设置为1
启动日志:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 120.55.101.185:6006 to 139.224.34.233:6001
Adding replica 139.224.34.233:6005 to 120.55.101.185:6002
Adding replica 120.55.101.185:6004 to 139.224.34.233:6003
M: efa2273be9e6e9a1aa35b4f4be1190c756d711fa 139.224.34.233:6001
slots:[0-5460] (5461 slots) master
M: b438c55aaafebda8c2221d9528675bc604801d4c 120.55.101.185:6002
slots:[5461-10922] (5462 slots) master
M: a916a0b6aedcd2262d7e43dac239cade68fda6da 139.224.34.233:6003
slots:[10923-16383] (5461 slots) master
S: 4233d6a1ef57366505824489ffc63a6a2c7d5bb9 120.55.101.185:6004
replicates a916a0b6aedcd2262d7e43dac239cade68fda6da
S: 1547aad124a719abaa6d249624beabb462369c9b 139.224.34.233:6005
replicates b438c55aaafebda8c2221d9528675bc604801d4c
S: 5065a1565195402cbfc6f4ab2a579e959c2b1e72 120.55.101.185:6006
replicates efa2273be9e6e9a1aa35b4f4be1190c756d711fa
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.....
>>> Performing Cluster Check (using node 139.224.34.233:6001)
M: efa2273be9e6e9a1aa35b4f4be1190c756d711fa 139.224.34.233:6001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 4233d6a1ef57366505824489ffc63a6a2c7d5bb9 120.55.101.185:6004
slots: (0 slots) slave
replicates a916a0b6aedcd2262d7e43dac239cade68fda6da
S: 1547aad124a719abaa6d249624beabb462369c9b 139.224.34.233:6005
slots: (0 slots) slave
replicates b438c55aaafebda8c2221d9528675bc604801d4c
S: 5065a1565195402cbfc6f4ab2a579e959c2b1e72 120.55.101.185:6006
slots: (0 slots) slave
replicates efa2273be9e6e9a1aa35b4f4be1190c756d711fa
M: b438c55aaafebda8c2221d9528675bc604801d4c 120.55.101.185:6002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: a916a0b6aedcd2262d7e43dac239cade68fda6da 139.224.34.233:6003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
slots:[0-5460] 为槽点区间,通过算法算出key的槽点,根据槽点找到对应节点
集群操作常用命令如下:
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点(node),以及这些节点的相关信息。节点
cluster meet <ip> <port> :将 ip 和 port所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot的导入(import)或者迁移(migrate)。
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
4.java集群测试代码
修改redis配置文件
public class RedisConfig {
@Bean
public RedisClusterConfiguration redisClusterConfiguration() {
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
RedisNode redisNode1 = new RedisNode("139.224.34.233", 6001);
RedisNode redisNode2 = new RedisNode("139.224.34.233", 6003);
RedisNode redisNode3 = new RedisNode("139.224.34.233", 6005);
RedisNode redisNode4 = new RedisNode("120.55.101.185", 6002);
RedisNode redisNode5 = new RedisNode("120.55.101.185", 6004);
RedisNode redisNode6 = new RedisNode("120.55.101.185", 6006);
List<RedisNode> redisNodes = new ArrayList<>();
redisNodes.add(redisNode1);
redisNodes.add(redisNode2);
redisNodes.add(redisNode3);
redisNodes.add(redisNode4);
redisNodes.add(redisNode5);
redisNodes.add(redisNode6);
redisClusterConfiguration.setClusterNodes(redisNodes);
redisClusterConfiguration.setPassword("123456");
redisClusterConfiguration.setMaxRedirects(3);
return redisClusterConfiguration;
}
@Bean
public JedisPoolConfig jedisPoolConfig(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(100);
jedisPoolConfig.setMaxTotal(600);
return jedisPoolConfig;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory(RedisClusterConfiguration redisClusterConfiguration,JedisPoolConfig jedisPoolConfig) {
JedisConnectionFactory factory = new JedisConnectionFactory(redisClusterConfiguration,jedisPoolConfig);
return factory;
}
@Bean
public StringRedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
return redisTemplate;
}
}
测试,set键值
public class RedisTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RedisConfig.class);
RedisTemplate redisTemplate = annotationConfigApplicationContext.getBean(StringRedisTemplate.class);
redisTemplate.opsForValue().set("hutaoqizi","123456");
}
}
我这边写入到了6002的节点中
欢迎扫描下面图片关注我的个人公众号,回复“资源”可以获取java核心知识整理和经典书籍