关于Redis的安装与集群部署,可以参考《Linux下Redis的集群部署》
一、Redis的单机使用
(1) 新建gradle项目,依赖如下:
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
compile ('org.springframework.boot:spring-boot-starter-data-redis'){
exclude(group:'io.lettuce')
}
compile 'redis.clients:jedis'
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
(2) 在application.yml中配置redis信息
spring:
redis:
host: 127.0.0.1
port: 6379
password: ******* #密码
timeout: 10000
(3) 配置redis信息RedisConfig.java
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大空闲数
jedisPoolConfig.setMaxIdle(300);
// 连接池的最大数据库连接数
jedisPoolConfig.setMaxTotal(100);
// 最大建立连接等待时间
jedisPoolConfig.setMaxWaitMillis(10000);
// 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
return jedisPoolConfig;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig){
RedisStandaloneConfiguration redisStandaloneConfiguration =
new RedisStandaloneConfiguration();
//设置redis服务器的host或者ip地址
redisStandaloneConfiguration.setHostName(host);
//设置默认使用的数据库
redisStandaloneConfiguration.setDatabase(0);
//设置密码
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
//设置redis的服务的端口号
redisStandaloneConfiguration.setPort(port);
//获得默认的连接池构造器(怎么设计的,为什么不抽象出单独类,供用户使用呢)
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb =
(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder)JedisClientConfiguration.builder();
//指定jedisPoolConifig来修改默认的连接池构造器(真麻烦,滥用设计模式!)
jpcb.poolConfig(jedisPoolConfig);
//通过构造器来构造jedis客户端配置
JedisClientConfiguration jedisClientConfiguration = jpcb.build();
//单机配置 + 客户端配置 = jedis连接工厂
return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
}
@Bean
public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* 设置数据存入 redis 的序列化方式,并开启事务
*
* @param redisTemplate
* @param factory
*/
private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
//如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// 开启事务
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.setConnectionFactory(factory);
}
/**
* 注入封装RedisTemplate
* @date 2017年12月21日
* @throws
*/
@Bean(name = "redisUtils")
public RedisUtils redisUtil(RedisTemplate<String, Object> redisTemplate) {
RedisUtils redisUtil = new RedisUtils();
redisUtil.setRedisTemplate(redisTemplate);
return redisUtil;
}
(4) redis工具类RedisUtils.java
public class RedisUtils {
private RedisTemplate<String, Object> redisTemplate;
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
//=============================common============================
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
*
* @param key 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
// ..... 其余的见源代码
}
(5) 测试redis功能RedisController.java
@RestController
@RequestMapping("/redis")
public class RedisController {
@Autowired
private RedisUtils redisUtils;
@GetMapping("/set-string")
public ResponseEntity setString(){
boolean result = redisUtils.set("nsk","handsome",1000);
return ResponseEntity.ok(result);
}
}
测试结果:
查看redis信息:
此时,可以看出可以在Spring boot项目中正常使用单机版Redis.
二、Redis集群的使用
(1) 修改上述的application.yml文件
spring:
redis:
cache:
cluster-nodes: 127.0.0.1:6001,127.0.0.1:6002,127.0.0.1:6003
command-timeout: 5000
password: ******* # 密码
host: 127.0.0.1
port: 6379
password: ****** # 密码
timeout: 10000
(2) 获取Redis集群连接属性JedisProperties.java
@Component
@ConfigurationProperties(prefix = "spring.redis.cache")
public class JedisProperties {
private String clusterNodes;
private Integer commandTimeout;
private String password;
// ... 省略getter和setter方法
}
(3) 配置Redis集群JedisClusterConfig.java
@Configuration
@EnableConfigurationProperties(JedisProperties.class)
public class JedisClusterConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(JedisClusterConfig.class);
@Autowired
private JedisProperties jedisProperties;
private int maxTotal = 100;
private int maxIdle = 5;
private int maxWaitMills = 1000;
private int soTimeout = 5000;
private int maxAttempts = 5;
@Bean
public JedisCluster getJedisCluster() {
String[] serverArray = jedisProperties.getClusterNodes().split(",");
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMaxWaitMillis(maxWaitMills);
LOGGER.info("***************" + jedisProperties.getClusterNodes());
Set<HostAndPort> nodes = new HashSet<>();
for (String ipPort : serverArray) {
String[] ipPortPair = ipPort.split(":");
nodes.add(new HostAndPort(ipPortPair[0].trim(), Integer.valueOf(ipPortPair[1].trim())));
}
return new JedisCluster(nodes, jedisProperties.getCommandTimeout(), soTimeout, maxAttempts,
jedisProperties.getPassword(), poolConfig);
}
}
(4) 测试redis集群JedisController.java
@RestController
@RequestMapping("/jedis")
public class JedisController {
@Autowired
private JedisCluster jedisCluster;
@GetMapping("/set-string")
public ResponseEntity setString(){
long result = jedisCluster.setnx("weight","168");
return ResponseEntity.ok(result);
}
@GetMapping("/{key}")
public ResponseEntity getValueByKey(@PathVariable String key){
String name = jedisCluster.get(key);
return ResponseEntity.ok(name);
}
}
结果如下:
查看Redis集群信息:
-> redis-cli -c -h 127.0.0.1 -p 6001 -a ******
127.0.0.1:6001> get weight
-> Redirected to slot [16280] located at 127.0.0.1:6003
"62"
127.0.0.1:6003>
源代码地址:《Redis-demo》