0%

SpringBoot2.x(九)整合Redis实战

  1. Redis安装和配置
  2. SpringBoot2.x整合redis
  3. Redis工具类封装

Redis安装和配置

下载

1
2
3
4
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar xzf redis-4.0.9.tar.gz
cd redis-4.0.9
make

启动

  • 启动服务端:src/redis-server
  • 启动客户端:src/redis-cli

redis.conf配置

客户端IP限制

redis服务端默认只能被本地客户端连接。如果你想通过外网连接,需要在 redis.conf中修改如下配置

1
bind 127.0.0.1 47.98.121.1  #多个IP以空格分隔

这样公网IP为 47.98.121.1的主机也可访问本机的redis服务了。

你也可以多配置几个 bind

1
2
bind 127.0.0.1
bind 47.98.121.1

取消客户端IP限制

如果你想任意主机都能连接本机redis服务,那么你需要做如下两步配置:

  1. 注释以 bind开头的行
1
2
#bind 127.0.0.1
#bind 47.98.121.1
  1. redis3.2以后的版本还需要关闭保护模式(仍然是修改 redis.conf):
1
protected-mode no

设置连接密码

如果你觉得任意主机都能连接本机redis不太安全,又不想把主机白名单写死(bind),那么你可以设置一个连接密码,在 redis.conf中通过 /requirepass搜索:

1
requirepass 123456	#在这里设置连接密码

SpringBoot2.x整合Redis

引入依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

添加整合配置

  • application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#=========redis基础配置=========
spring.redis.database=0
#默认通过172.0.0.1:6379连接redis
spring.redis.host=172.0.0.1
spring.redis.port=6379
spring.redis.password=xxx //如果在服务端redis.conf中设置了requirepass则需要配置此项
# 连接超时时间 单位 ms(毫秒)
spring.redis.timeout=3000

#=========redis线程池设置=========
# 连接池中的最大空闲连接,默认值也是8。
spring.redis.pool.max-idle=200

#连接池中的最小空闲连接,默认值也是0。
spring.redis.pool.min-idle=200

# 如果赋值为-1,则表示不限制;pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
spring.redis.pool.max-active=2000

# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时
spring.redis.pool.max-wait=1000

opsForXXX

Operations for xxx(redis中的数据类型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisApplicationTests {

@Autowired
private StringRedisTemplate redisTemplate;

@Test
public void testSetVal() {
redisTemplate.opsForValue().set("name", "anwen");
}

@Test
public void testGetVal() {
String name = redisTemplate.opsForValue().get("name");
System.out.println(name); //anwen
}
}
  • 注入 StringRedisTemplate
  • 调用 opsForXxxboundXxxOps

Redis工具类封装

json转换工具类

通过 starter-web引入 jackson依赖,编写json转换工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package top.zhenganwen.springbootmybatis.util;

import java.io.IOException;

import org.springframework.util.StringUtils;

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtils {

private static ObjectMapper objectMapper = new ObjectMapper();

//对象转字符串
public static <T> String obj2String(T obj){
if (obj == null){
return null;
}
try {
return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

//字符串转对象
public static <T> T string2Obj(String str,Class<T> clazz){
if (StringUtils.isEmpty(str) || clazz == null){
return null;
}
try {
return clazz.equals(String.class)? (T) str :objectMapper.readValue(str,clazz);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}

封装redisTemplate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package top.zhenganwen.springbootmybatis.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.concurrent.TimeUnit;

@Repository
public class RedisClient {

@Autowired
private StringRedisTemplate redisTemplate;

public boolean set(String key, String val) {
try {
redisTemplate.opsForValue().set(key, val);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

public Object getStr(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}

//TODO lIST、MAP结构的set和get

/**
* 功能描述:设置某个key过期时间
*
* @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
* @return
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}


/**
* 递增
*
* @param key 键
* @return
*/
public long incr(String key, long delta) {
return redisTemplate.opsForValue().increment(key, delta);
}


/**
* 递减
*
* @param key 键
* @param delta 要减少几
* @return
*/
public long decr(String key, long delta) {
return redisTemplate.opsForValue().increment(key, -delta);
}
}

测试

1
2
3
4
@Test
public void testGetVal() {
System.out.println(redisClient.getStr("name")); //anwen
}

Redis常用图形用户界面

Redis Desktop Manager下载地址

鼓励一下~