Windows 安装 Reids单机和集群 完整版

Windows 安装 Reids单机和集群 完整版_第1张图片
redis目录

一、Windows redis单机安装

1、下载Windows redis版本

官方没有 Windows版本的 Redis,官网介绍:Redis项目不正式支持Windows。但是,微软开发并维护了针对Win64的Windows版本。
Windows版本下载地址:Redis-x64-3.2.100 提取码:jkw2
解压:

Windows 安装 Reids单机和集群 完整版_第2张图片
redis解压.png

解压完成后,安装目录下大概会有以下几个文件:

  • redis-server.exe:服务端程序,提供redis服务
  • redis-cli.exe: 客户端程序,通过它连接redis服务并进行操作
  • redis-check-dump.exe:本地数据库检查
  • redis-check-aof.exe:更新日志检查
  • redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).
  • redis.windows.conf: 配置文件,将redis作为普通软件使用的配置,命令行关闭则redis关闭
  • redis.windows-service.conf:配置文件,将redis作为系统服务的配置,用以区别开两种不同的使用方式

redis配置文件含义:redis.windows.conf和redis.windows-service.conf一样,两者只是启动方式不同。

# 是否作为守护进程运行
daemonize no
# Redis 默认监听端口
port 6379
# 客户端闲置多少秒后,断开连接
timeout 300
# 日志显示级别
loglevel verbose
# 指定日志输出的文件名,也可指定到标准输出端口
logfile redis.log
# 设置数据库的数量,默认最大是16,默认连接的数据库是0,可以通过select N 来连接不同的数据库
databases 32

# ####### Dump持久化策略 ########
# 当有一条Keys 数据被改变是,900 秒刷新到disk 一次
# save 900 1
# 当有10 条Keys 数据被改变时,300 秒刷新到disk 一次
save 300 100
# 当有1w 条keys 数据被改变时,60 秒刷新到disk 一次
save 6000 10000
# 当dump .rdb 数据库的时候是否压缩数据对象
rdbcompression yes
# dump 持久化数据保存的文件名
dbfilename dump.rdb

###### ##### Replication
# Redis的主从配置,配置slaveof则实例作为从服务器
# slaveof 192.168.0.105 6379
# 主服务器连接密码
# masterauth 

###### ######## 安全性
# 设置连接密码
# requirepass 

###### ######### LIMITS
# 最大客户端连接数
# maxclients 128

# 最大内存使用率
# maxmemory 

###### #### APPEND ONLY MODE
# 是否开启日志功能
appendonly no

# #####AOF持久化策略#####
# appendfsync always
# appendfsync everysec
# appendfsync no
###### ########## VIRTUAL MEMORY
# ###是否开启VM 功能####
# vm-enabled no
# vm-enabled yes
# vm-swap-file logs/redis.swap
# vm-max-memory 0
# vm-page-size 32
# vm-pages 134217728
# vm-max-threads 4

# 使用默认配置文件启动redis会报错的,需要修改maxmemory这一项,注意单位时字节(209715200是200MB)
maxmemory 209715200

# 如果需要设置连接密码,就修改requirepass,设为自己的密码。
requirepass mypassword

redis详细配置参考说明地址:
https://blog.csdn.net/ljl890705/article/details/51540427

2、打开cmd命令进入redis目录-运行redis

D:\Redis-x64-3.2.100>.\redis-server.exe redis.windows.conf

启动成功效果:
Windows 安装 Reids单机和集群 完整版_第3张图片
redis启动成功.png

3、查看redis信息

启动后窗口不要关,新开一个cmd窗口,执行

D:\Redis-x64-3.2.100> .\redis-cli
127.0.0.1:6379>

默认连接本机127.0.0.1 端口号 6379,连接成功
修改配置文件redis.windows-service.conf

将 port 6379 端口号 改成 port 6380

4、将Redis 加入 Windows 服务,执行

redis-server --service-install redis.windows.conf --service-name Redis-x64-6380 --port 6380

提示:Redis successfully installed as a service.
表示加入服务成功!
如果 Redis 设置了密码,加入服务时会提示

D:\Redis-x64-3.2.100>redis-server --service-install redis.windows.conf
[7540] 01 Feb 11:02:40.287 # Granting read/write access to 'NT AUTHORITY\NetworkService' on: "D:\Redis-x64-3.2.100\" "D:\Redis-x64-3.2.100\"
[7540] 01 Feb 11:02:40.288 # Redis successfully installed as a service.

服务就启动不了,可以服务里加参数处理,如下图所示:
Windows 安装 Reids单机和集群 完整版_第4张图片
服务启动加参数密码.png

启动参数里加入:
123456 是你的Redis密码。
单机redis安装完成!

5、安装redis可视化工具-测试redis

下载地址:redis-desktop-manager-0.8.8.384.exe 提取码:ksvp
redis-desktop-manager-0.8.8.384.exe 双击安装,傻瓜式安装,点击下一步就行。安装完成,在桌面会生成快捷方式图标,

Windows 安装 Reids单机和集群 完整版_第5张图片

测试连接成功!

二、Windows搭建Redis Cluster集群

1、下载redis

Windows版本下载地址:Redis-x64-3.2.100 提取码:jkw2
解压,默认端口6379

Windows 安装 Reids单机和集群 完整版_第6张图片
redis解压.png

测试是否安装成功:

D:\Redis-x64-3.2.100>.\redis-server.exe redis.windows.conf

Windows 安装 Reids单机和集群 完整版_第7张图片
redis启动成功.png

2、在D盘创建文件夹D:\Redis-Cluster

首先我们构建集群节点目录:集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。主节点崩溃,从节点的Redis就会提升为主节点,代替原来的主节点工作,崩溃的主Redis回复工作后,会成为从节点.

拷贝开始下载的redis解压后的目录Redis-x64-3.2.100到D:\Redis-Cluster下,并修改文件名 Redis-x64-3.2.100-6381 6382、6383、6384、6385、6386
Windows 安装 Reids单机和集群 完整版_第8张图片
复制六份redis.png

解释一下为什么要复制六份:集群规划有三个节点的集群,每个节点有一主一备。需要6台虚拟机.配置 三主三从集群.

由于 redis 默认端口号为 6379,那么其它5份的端口可以为6381,6382,6383,6384,6385,6386 我们不适用默认的端口号,且不与6379冲突,保证6379可以。

3、分别修改这六份的redis配置

例如,打开Redis-x64-3.2.100-6381 下有一个文件 redis.windows.conf 修改里面的端口号,以及集群支持配置

port 6381 // 这里把6379改成6381,相应的其他5个修改端口号为 6382、6383、6384、6385、6386
// 修改其他配置支持集群
cluster-enabled yes // 开启集群模式
cluster-config-file nodes-6381.conf // 保存节点配置,自动创建,自动更新(建议命名时加上端口号)
cluster-node-timeout 15000 // 集群超时时间,节点超过这个时间没反应就断定是宕机
appendonly yes // 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。 yes表示:存储方式,aof,将写操作记录保存到日志中

如果cluster-enabled 不为yes, 那么在使用JedisCluster集群代码获取的时候,会报错。
cluster-node-timeout 调整为 15000,那么在创建集群的时候,不会超时。
cluster-config-file nodes-6381.conf 是为该节点的配置信息,这里使用 nodes-端口.conf命名方法。服务启动后会在目录生成该文件

4、编写一个 bat 来启动 redis

每个Redis-x64-3.2.100-*节点目录下建立 start.bat,内容如下:
比如:D:\Redis-Cluster\Redis-x64-3.2.100-6381\start.bat

title redis-6381
redis-server.exe redis.windows.conf

将端口分别修改成功6381、6382、6383、6384、6385、6386

5、系统需要有 Ruby环境

redis的集群使用 ruby脚本编写,所以系统需要有 Ruby 环境 ,下载地址:
http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.3.3-x64.exe

Windows 安装 Reids单机和集群 完整版_第9张图片
安装Ruby.png

安装时3个选项都勾选。
然后对ruby进行配置:

Windows 安装 Reids单机和集群 完整版_第10张图片
配置ruby.png

6、构建集群脚本redis-trib.rb

可以打开https://raw.githubusercontent.com/antirez/redis/unstable/src/redis-trib.rb 然后复制里面的内容到本地并保存为redis-trib.rb;
如下图,与redis集群节点保存在同一个文件夹下(比如我所有节点都存放在D:\Redis-Cluster文件夹下)

Windows 安装 Reids单机和集群 完整版_第11张图片
集群节点目录.png

然后依次启动所有集群节点start.bat
然后cmd进入redis集群节点D:\Redis-Cluster目录后,执行:集群启动命令(–replicas 1 表示为集群中的每个主节点创建一个从节点)

D:\Redis-Cluster>.\redis-trib.rb create --replicas 1 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386

如果报错,前面加ruby

D:\Redis-Cluster>ruby redis-trib.rb create --replicas 1 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386

如果再报-内容如下:

PS D:\Redis-Cluster> .\redis-trib.rb create --replicas 1 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127
.0.0.1:6385 127.0.0.1:6386
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.

All commands and features belonging to redis-trib.rb have been moved
to redis-cli.
In order to use them you should call redis-cli with the --cluster
option followed by the subcommand name, arguments and options.

Use the following syntax:
redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]

Example:
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1

To get help about all subcommands, type:
redis-cli --cluster help

redis-trib.rb is not longer available!,可以看出这不是报错,是redis-trib.rb版本和你的redis版本不一致,这个redis-trib.rb可以从对应版本的redis-XX.tar.gz中的src目录下获取:
我的版本是windows的Redis-x64-3.2.100
下载地址:https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100

Windows 安装 Reids单机和集群 完整版_第12张图片
下载Source code.png

解压-进入redis-win-3.2.100\redis-win-3.2.100\src 找到redis-trib.rb


Windows 安装 Reids单机和集群 完整版_第13张图片
3.2.100 redis-trib.rb.png

复制到D:\Redis-Cluster下
Windows 安装 Reids单机和集群 完整版_第14张图片
集群节点目录.png

7、再执行启动集群命令:

在D:\Redis-Cluster下 空白处 Shift+右击 选择--在此处打开 PowerShell 窗口(S)

D:\Redis-Cluster>ruby redis-trib.rb create --replicas 1 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386

Windows 安装 Reids单机和集群 完整版_第15张图片
成功启动集群命令成功效果.png

上图可看出 主节点为6381,6382,6383端口的三个地址,6384,6385,6386为三个从节点:

Adding replica 127.0.0.1:6384 to 127.0.0.1:6381
Adding replica 127.0.0.1:6385 to 127.0.0.1:6382
Adding replica 127.0.0.1:6386 to 127.0.0.1:6383

中途会询问是否打印更多详细信息,输入yes即可,然后redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯:

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 127.0.0.1:6381)
M: b7881780481d4ebffff5a2e140cb0b9778dd3b86 127.0.0.1:6381
   slots:0-5460 (5461 slots) master
M: 8cf2636d55e5f54a31fea21dbf12adf3515e5aef 127.0.0.1:6382
   slots:5461-10922 (5462 slots) master
M: 4b312b45a43484ac6f9a1a9a63f34345ec0c163f 127.0.0.1:6383
   slots:10923-16383 (5461 slots) master
M: 98ab54d6f8dac11a8911762be3cdc2f211562bcd 127.0.0.1:6384
   slots: (0 slots) master
   replicates b7881780481d4ebffff5a2e140cb0b9778dd3b86
M: 20697b746d07108220e7476a172fdb1b8e429069 127.0.0.1:6385
   slots: (0 slots) master
   replicates 8cf2636d55e5f54a31fea21dbf12adf3515e5aef
M: 081a9f17a774ab5e279ef6d193a5a2cc4393c91b 127.0.0.1:6386
   slots: (0 slots) master
   replicates 4b312b45a43484ac6f9a1a9a63f34345ec0c163f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Redis集群数据分配策略:
采用一种叫做哈希槽 (hash slot)的方式来分配数据,redis cluster 默认分配了 16384 个slot,三个节点分别承担的slot 区间是:(如上面3个M:节点的slots描述)

节点6380覆盖0-5460;
节点6381覆盖5461-10922;
节点6382覆盖10923-16383.

最后查看所有集群节点,会看到:

Windows 安装 Reids单机和集群 完整版_第16张图片

测试集群搭建成功!

8、测试集群

进入任意一个集群节点,cmd执行 redis-cli.exe -c -p 6381

写入任意一个value,查询
Windows 安装 Reids单机和集群 完整版_第17张图片
再写一个hash测试: hset redis:test:hash Hash1 12345
PS D:\Redis-Cluster\Redis-x64-3.2.100-6381> .\redis-cli.exe  -c -p 6381
127.0.0.1:6381> set name redis-test
-> Redirected to slot [5798] located at 127.0.0.1:6382
OK
127.0.0.1:6382> get name
"redis-test"
127.0.0.1:6382> set name redis-test2
OK
127.0.0.1:6382> get name
"redis-test2"
127.0.0.1:6382> hset redis:hash Hash1 123456
-> Redirected to slot [5427] located at 127.0.0.1:6381
(integer) 1
127.0.0.1:6381>

可以看到集群会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上CRC16(key) % 16384

所以,可以看到我们set的key计算之后被分配到了slot-5427 上, 而slot-5427处在节点6381上,因此redis自动redirect到了6381节点上.

9、附上所有工具及搭建的redis集群下载地址:

下载集群测试 提取码:ef4a
随便放到一个磁盘里,安装Ruby之后,就可以启动集群命令-测试集群!

三、springboot redis单机和集群配置

1、springboot redis单机代码实例

springboot+redis项目实战完整篇

2、springboot redis集群代码实例

1、配置集群

在 springboot+redis项目实战完整篇 的基础上,修改yml中的redis配置:

spring:
  redis:
    #host: localhost  # redis单机配置
    #port: 6379
    max-wait: 30000    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    max-active: 100   # 连接池最大连接数(使用负值表示没有限制)
    max-idle: 20     # 连接池中的最大空闲连接
    min-idle: 0     # 连接池中的最小空闲连接
    timeout: 5000   # 连接超时
    #password: 123456 # 密码
    cluster:       #  redis集群配置
      nodes: 127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384,127.0.0.1:6385,127.0.0.1:6386
      max-redirects: 2  # 最大重定向次数
2、测试集群配置

可以不用Postman测试接口,也可以用下面的方式测试:用swagger方式测试接口很方便。
pom.xml


        
            io.swagger
            swagger-models
            compile
        
        
            io.swagger
            swagger-annotations
            compile
        
        
            io.springfox
            springfox-swagger-ui
        
        
            io.springfox
            springfox-swagger2
            
                
                    io.swagger
                    swagger-models
                
                
                    io.swagger
                    swagger-annotations
                
            
        

config文件夹下添加swagger配置类:

package com.dist.config;

import com.google.common.base.Predicate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author yangmin
 * @date 2018/8/15
 * @desc
 */
@Configuration
@EnableSwagger2
public class Swaggwe2Config {
    @Bean
    public Docket adminApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("Admin API")
                .forCodeGeneration(true)
                .pathMapping("/")
                .select()
                .paths(paths())
                .build()
                .apiInfo(apiInfo())
                .useDefaultResponseMessages(false);
    }

    private Predicate paths(){
        return PathSelectors.regex("^/(?!error).*$");
    }

    private ApiInfo apiInfo(){
        Contact contact = new Contact("BaiDu", "controller://baidu.com", " [email protected]");
        return new ApiInfoBuilder()
                .title("个人SpringBoot测试系统")
                .description("开发API文档")
                .contact(contact)
                .version("1.0")
                .build();
    }
}

Controller测试接口

package com.dist.controller;

import com.dist.utils.RedisUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @author [email protected]
 * @data 2019/6/17 17:28
 */
@RestController
@RequestMapping(value = "rest/redis")
@Api(tags = {"RedisUtilController"}, description = "redisUtil测试")
public class RedisUtil2Controller {

    @Resource
    private RedisUtil redisUtil;

    @RequestMapping(value = "v1/redisSave",method = {RequestMethod.GET})
    @ApiOperation(value = "保存到redis,并返回结果",notes = "保存到redis")
    public Object redisSave(@ApiParam(value = "传入key值") @RequestParam String key,
                        @ApiParam(value = "传入value值") @RequestParam String value){
        redisUtil.set(key,value);
        return redisUtil.get(key);
    }

    @RequestMapping(value = "v1/redisGetAllKeyValue",method = {RequestMethod.GET})
    @ApiOperation(value = "获取redis种所有key和value值",notes = "获取redis种所有key和value值")
    public Object redisGetAllKeyValue(){
        Set keys = redisUtil.keys("*");
        Iterator iterator = keys.iterator();
        Map map = new HashMap<>();
        while (iterator.hasNext()){
            String key = iterator.next();
            Object o = redisUtil.get(key);
            map.put(key,o);
        }
        return map;
    }


    @RequestMapping(value = "v1/deleteRedisAll",method = {RequestMethod.DELETE})
    @ApiOperation(value = "清除redis所有缓存",notes = "清除redis所有缓存")
    public Object deleteRedisAll(){
        Set keys = redisUtil.keys("*");
        Iterator iterator = keys.iterator();
        while (iterator.hasNext()){
            redisUtil.del(iterator.next());
        }
        return "删除redis所有数据成功";
    }

    @RequestMapping(value = "v1/getRedisValue",method = {RequestMethod.GET})
    @ApiOperation(value = "根据key获取value值",notes = "根据key获取value值")
    public Object getRedisValue(@ApiParam(value = "传入key值") @RequestParam String key){
        return redisUtil.get(key);
    }

}

在resources/static下创建index.html




    
    springboot-test-redis


首页面

springboot-test-redis

进入swagger页面测试

上面的http://localhost:8080/springboot-test-redis修改成自己的项目访问路径

3、测试效果

redis保存数据:
Windows 安装 Reids单机和集群 完整版_第18张图片
redis保存数据-效果.png

redis根据key查询value数据:


Windows 安装 Reids单机和集群 完整版_第19张图片
redis查询数据-效果.png

Windows 安装 Reids单机和集群 完整版_第20张图片
redis查询数据-效果2.png

redis查询所有数据:
Windows 安装 Reids单机和集群 完整版_第21张图片
redis查询所有数据-效果.png

你可能感兴趣的:(Windows 安装 Reids单机和集群 完整版)