千万级用户Redis缓存集群搭建以及项目实战

Redis单机版搭建

3.1安装redis
?版本说明
本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。
安装的前提条件:
需要安装 gcc:yum install gcc-c++

1、下载redis的源码包。
2、把源码包上传到linux服务器
3、解压源码包
tar -zxvf redis-3.0.0.tar.gz
打开redis下的目录直接Make
4、Make
5、Make install
[root@bogon redis-3.0.0]# make install PREFIX=/usr/local/redis

3.2启动redis
1、前端启动模式
直接启动不需要任何配置文件
/usr/local/redis/bin/redis-server
默认是前端启动模式,端口是6379
2、后端启动
1)从redis的源码目录中复制redis.conf到redis的安装目录。
2)修改配置文件
千万级用户Redis缓存集群搭建以及项目实战_第1张图片
3)[root@bogon bin]# ./redis-server redis.conf
R**edis常用命令**
set a 放缓存
get a 取key

1,引入Redis jar 如果是Maven需要给他坐标
package com.taotao.rest.jedis;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisTest {

@Test
public void testJedisSingle () {
    //测试单机版
    //创建一个jedis对象
    Jedis jedis = new Jedis("192.168.31.123", 6379);
    //host 是IP地址
    //port是端口号
    //调用Jedis对象方法,方法名和redis命令保持一致
    //key 和value的形式
            //Set赋值
    jedis.set("key1", "jedis test");
    //get取值
    String string = jedis.get("key1");
    System.out.println(string);
    //关闭jedis
    jedis.close();
}

Jedis连接池
@Test
public void testJedisPool () {
//创建一个jedis连接池
JedisPool pool = new JedisPool(“192.168.31.123”, 6379);
//从jedis连接池中获取jedis对象
Jedis jedis = pool.getResource();
String string = jedis.get(“key1”);
System.out.println(string);
//关闭jedis
jedis.close();
//关闭两连接池
pool.close();

}

}
Redis集群的搭建
集群中有三个节点的集群,每个节点有一主一备。需要6台虚拟机。
搭建一个伪分布式的集群,使用6个redis实例来模拟。
搭建集群需要的环境
Ruby(一种面向对象程序设计的脚本语言)编辑Ruby,一种简单快捷的面向对象(面向对象程序 脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp 语言。由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生石pearl(珍珠)相同,因此Ruby以7月诞生石ruby(红宝石)名。具体参考百度

1,搭建集群需要使用到官方提供的ruby脚本。
2,需要安装ruby的环境。
3,安装ruby
yum install ruby
yum install rubygems

4,redis集群管理工具redis-trib.rb

[root@bogon ~]# cd redis-3.0.0
[root@bogon redis-3.0.0]# cd src
[root@bogon src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr 1 07:01 redis-trib.rb
[root@bogon src]#
脚本需要的ruby包:

7,要上传到linux服务。
8,安装ruby的包:
gem install redis-3.0.0.gem
[root@bogon ~]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0…
Installing RDoc documentation for redis-3.0.0…
集群的搭建
第一步:创建6个redis实例,端口号从7001~7006

第二步:修改redis的配置文件
1、修改端口号

·

2、打开cluster-enable前面的注释。

第三步:把创建集群的ruby脚本复制到redis-cluster目录下。

第四步:启动6个redis实例
创建一个脚本来启动 vim startall.sh
cd redis01
./redis-server redis.conf
cd redis02
./redis-server redis.conf
cd redis03
./redis-server redis.conf
cd redis04
./redis-server redis.conf
cd redis05
./redis-server redis.conf
cd redis06
./redis-server redis.conf
以上分别是 6个redis集群
第五步:创建集群。
./redis-trib.rb create –replicas 1 192.168.31.123:7001
192.168.31.123:7002
192.168.31.123:7003
192.168.31.123:7004
192.168.31.123:7005
192.168.31.123:7006
这里的IP是自己linux本机上的地址
[root@MiWiFi-R3-srv redis-cluster]# ./startall.sh
[root@MiWiFi-R3-srv redis-cluster]# ps aux|grep redis
root 2642 0.2 0.1 33936 1992 pts/1 Sl+ 03:16 0:19 ./redis-server *:6379
root 3783 0.2 0.1 33936 1948 ? Ssl 05:17 0:00 ./redis-server *:7001 [cluster]
root 3785 0.2 0.1 33936 1948 ? Ssl 05:17 0:00 ./redis-server *:7002 [cluster]
root 3787 0.2 0.1 33936 1952 ? Ssl 05:17 0:00 ./redis-server *:7003 [cluster]
root 3795 0.2 0.1 33936 1948 ? Ssl 05:17 0:00 ./redis-server *:7004 [cluster]
root 3797 0.2 0.1 33936 1948 ? Ssl 05:17 0:00 ./redis-server *:7005 [cluster]
root 3803 0.2 0.1 33936 1948 ? Ssl 05:17 0:00 ./redis-server *:7006 [cluster]
root 3809 0.0 0.0 4356 724 pts/3 S+ 05:18 0:00 grep redis
看到上面信息表示启动成功
下面此信息集群启动成功

[root@MiWiFi-R3-srv redis-cluster]# ./redis-trib.rb create –replicas 1 192.168.31.123:7001 192.168.31.123:7002 192.168.31.123:7003 192.168.31.123:7004 192.168.31.123:7005 192.168.31.123:7006

Creating cluster
Connecting to node 192.168.31.123:7001: OK
Connecting to node 192.168.31.123:7002: OK
Connecting to node 192.168.31.123:7003: OK
Connecting to node 192.168.31.123:7004: OK
Connecting to node 192.168.31.123:7005: OK
Connecting to node 192.168.31.123:7006: OK
Performing hash slots allocation on 6 nodes…
Using 3 masters:
192.168.31.123:7001
192.168.31.123:7002 这三个是主节点
192.168.31.123:7003
Adding replica 192.168.31.123:7004 to 192.168.31.123:7001
Adding replica 192.168.31.123:7005 to 192.168.31.123:7002 一个主配置一个从
Adding replica 192.168.31.123:7006 to 192.168.31.123:7003
M: f0d92726bbb9d965d251c6b454f0f4270d1a2d7c 192.168.31.123:7001
slots:0-5460 (5461 slots) master 0-5460 是他的槽数
M: 86da4d7c4d51e3d6d9d93aaef26c6b74a6b70595 192.168.31.123:7002
slots:5461-10922 (5462 slots) master 5461-10922 是他的槽数
M: 01d95e8a67f9c582bbd47a256f79fb69e24a2845 192.168.31.123:7003
slots:10923-16383 (5461 slots) master 5461-10922 是他的槽数
S: 7313c2f7e34ff2eeb0977bc07688a95784d3bc1e 192.168.31.123:7004
replicates f0d92726bbb9d965d251c6b454f0f4270d1a2d7c
S: 0b8010f0a2f6da13814e2ea0657eb0c50086435e 192.168.31.123:7005
replicates 86da4d7c4d51e3d6d9d93aaef26c6b74a6b70595
S: b973eb46720b547f0d096ad750766c25261589dd 192.168.31.123:7006
replicates 01d95e8a67f9c582bbd47a256f79fb69e24a2845
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 192.168.31.123:7001)
M: f0d92726bbb9d965d251c6b454f0f4270d1a2d7c 192.168.31.123:7001
slots:0-5460 (5461 slots) master
M: 86da4d7c4d51e3d6d9d93aaef26c6b74a6b70595 192.168.31.123:7002
slots:5461-10922 (5462 slots) master
M: 01d95e8a67f9c582bbd47a256f79fb69e24a2845 192.168.31.123:7003
slots:10923-16383 (5461 slots) master

下面是Redis的备用节点
他没有槽数 因为它上面的数据和主节点上的是一样

M: 7313c2f7e34ff2eeb0977bc07688a95784d3bc1e 192.168.31.123:7004
slots: (0 slots) master
replicates f0d92726bbb9d965d251c6b454f0f4270d1a2d7c
M: 0b8010f0a2f6da13814e2ea0657eb0c50086435e 192.168.31.123:7005
slots: (0 slots) master
replicates 86da4d7c4d51e3d6d9d93aaef26c6b74a6b70595
M: b973eb46720b547f0d096ad750766c25261589dd 192.168.31.123:7006
slots: (0 slots) master
replicates 01d95e8a67f9c582bbd47a256f79fb69e24a2845
[OK] All nodes agree about slots configuration.

Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
[root@MiWiFi-R3-srv redis-cluster]#

Redis的槽数解说
redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

测试集群

不加 -c

[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.31.123 -p 7002 不加 -c
192.168.25.153:7002> set a 100
(error) MOVED 15495 192.168.25.153:7003 会报错 找不到节点 出错 也能连接 但是不好使
192.168.31.123:7002>

加 -c
[root@MiWiFi-R3-srv redis-cluster]# redis01/redis-cli -h 192.168.31.123 -p 7002 -c

drwxr-xr-x. 2 root root 4096 Jan 5 05:25 redis01
drwxr-xr-x. 2 root root 4096 Jan 5 05:25 redis02
drwxr-xr-x. 2 root root 4096 Jan 5 05:25 redis03
drwxr-xr-x. 2 root root 4096 Jan 5 05:25 redis04
drwxr-xr-x. 2 root root 4096 Jan 5 05:25 redis05
drwxr-xr-x. 2 root root 4096 Jan 5 05:25 redis06
-rwxr-xr-x. 1 root root 48141 Jan 5 05:10 redis-trib.rb
-rwxr-xr-x. 1 root root 259 Jan 5 05:16 startall.sh
[root@MiWiFi-R3-srv redis-cluster]# redis01/redis-cli -h 192.168.31.123 -p 7002 -c
192.168.31.123:7002> set a 100 给节点添加值
-> Redirected to slot [15495] located at 192.168.31.123:7003
OK
192.168.31.123:7003>
这种结果表示集群搭建成功 你ping谁谁给你PONG redis节点之间是自动的

Redis集群版测试
使用JedisCluster 不需要创建连接池 它自带连接池
@Test
public void testJedisCluster () {
//创建一个Set集合
HashSet nodes = new HashSet();
//将Redis所有的节点加入到一个集合里面
//使用HostAndPost 创建出 Host port ip地址和端口号
nodes.add(new HostAndPort(“192.168.31.123”, 7001));
nodes.add(new HostAndPort(“192.168.31.123”, 7002));
nodes.add(new HostAndPort(“192.168.31.123”, 7003));
nodes.add(new HostAndPort(“192.168.31.123”, 7004));
nodes.add(new HostAndPort(“192.168.31.123”, 7005));
nodes.add(new HostAndPort(“192.168.31.123”, 7006));
//把我Rdeis里的所以节点告诉Cluster
JedisCluster cluster = new JedisCluster(nodes);
cluster.set(“key1”, “1000”);
String string = cluster.get(“key1”);
System.out.println(string);
cluster.close();
}

你可能感兴趣的:(redis缓存)