一、Windows redis单机安装
1、下载Windows redis版本
官方没有 Windows版本的 Redis,官网介绍:Redis项目不正式支持Windows。但是,微软开发并维护了针对Win64的Windows版本。
Windows版本下载地址:Redis-x64-3.2.100 提取码:jkw2
解压:
解压完成后,安装目录下大概会有以下几个文件:
- 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
启动成功效果:
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.
服务就启动不了,可以服务里加参数处理,如下图所示:
启动参数里加入:
123456 是你的Redis密码。
单机redis安装完成!
5、安装redis可视化工具-测试redis
下载地址:redis-desktop-manager-0.8.8.384.exe 提取码:ksvp
redis-desktop-manager-0.8.8.384.exe 双击安装,傻瓜式安装,点击下一步就行。安装完成,在桌面会生成快捷方式图标,
测试连接成功!
二、Windows搭建Redis Cluster集群
1、下载redis
Windows版本下载地址:Redis-x64-3.2.100 提取码:jkw2
解压,默认端口6379
测试是否安装成功:
D:\Redis-x64-3.2.100>.\redis-server.exe redis.windows.conf
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解释一下为什么要复制六份:集群规划有三个节点的集群,每个节点有一主一备。需要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
安装时3个选项都勾选。
然后对ruby进行配置:
6、构建集群脚本redis-trib.rb
可以打开https://raw.githubusercontent.com/antirez/redis/unstable/src/redis-trib.rb 然后复制里面的内容到本地并保存为redis-trib.rb;
如下图,与redis集群节点保存在同一个文件夹下(比如我所有节点都存放在D:\Redis-Cluster文件夹下)
然后依次启动所有集群节点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
解压-进入redis-win-3.2.100\redis-win-3.2.100\src 找到redis-trib.rb
复制到D:\Redis-Cluster下
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
上图可看出 主节点为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.
最后查看所有集群节点,会看到:
测试集群搭建成功!
8、测试集群
进入任意一个集群节点,cmd执行 redis-cli.exe -c -p 6381
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保存数据:redis根据key查询value数据:
redis查询所有数据: