1.配置redis-config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- Jedis 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}"></property>
<property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"></property>
<property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"></property>
<property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"></property>
</bean>
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="jdkRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
<bean id="jedisConnectionZero" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
<property name="poolConfig" ref="jedisPoolConfig"></property>
<property name="hostName" value="${redisst.hostName}"></property>
<property name="port" value="${redisst.port}"></property>
<property name="timeout" value="${redisst.timeout}"></property>
<property name="usePool" value="${redisst.usePool}"></property>
<property name="password" value="${redisst.password}" ></property>
<property name="database" value="${redisst.db0}"></property>
</bean>
<bean id="redisTemplateZero" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionZero" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="hashKeySerializer" ref="jdkRedisSerializer" />
<property name="valueSerializer" ref="jdkRedisSerializer"/>
</bean>

2.定义枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public enum CommonRedisEnums {
O_DB_0("redisTemplateZero","ODB0");
// 对应redis-config中的bean名称
private String name;
// 别名
private String asName;

CommonRedisEnums(String name, String asName) {
this.name = name;
this.asName = asName;
}

public String getName() {
return name;
}

public String getAsName() {
return asName;
}
}

3.使用SpringAppContextHolder获取bean

1
2
3
4
5
6
7
8
9
10
11
private static Map<String,RedisTemplate> redisTemplateMap = new HashMap<>();

public static void getRedis(CommonRedisEnums enums){
if(!redisTemplateMap.containsKey(enums.getName())){
RedisTemplate redisBean = (RedisTemplate) SpringAppContextHolder
.getBean(enums.getName());
if(redisBean != null){
redisTemplateMap.put(enums.getName(),redisBean);
}
}
}

4.使用工具类进行调用

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
/**
* 搜索
*/
public static Map<String, Object> searchKeys(List<String> keys,CommonRedisEnums enums){
getRedis(enums);
return batchQueryByKeys(keys, false,redisTemplateMap.get(enums.getName()));
}

public static Map<String, Object> batchQueryByKeys(final List<String> keys, Boolean useParallel, final RedisTemplate redisTemplate) {
if (null == keys || keys.size() == 0) {
return null;
}
if (null == useParallel) {
useParallel = true;
}
Object object = redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
for (String key : keys) {
byte[] bkey = redisTemplate.getStringSerializer().serialize(key);
redisTemplate.getStringSerializer().serialize(JSON.toJSONString(connection.get(bkey)));
}

return connection.closePipeline();
}
});
List<Object> results = null;
if (null == object) {
return null;
} else {
results = (List) object;
}
Map<String, Object> resultMap = null;
if (useParallel) {
Map<String, Object> resultMapOne = Collections.synchronizedMap(new HashMap<String, Object>());
for (String t : keys) {
resultMapOne.put(t, results.get(keys.indexOf(t)));
}
resultMap = resultMapOne;
} else {
Map<String, Object> resultMapTwo = new HashMap<>();
for (String t : keys) {
Object o = results.get(keys.indexOf(t));
if (null != o) {
String val = (String) redisTemplate.getStringSerializer().deserialize((byte[]) o);
resultMapTwo.put(t, val);
}
}
resultMap = resultMapTwo;
}
return resultMap;
}

小结

使用@Autowired的时候,对于static标识的变量或者方法一般是获取到的null值常规的方法已经使用不了

1
2
@Autowired
private NewRedisZeroService redisZeroService;

需要使用注入方法的形式来使用

1
2
3
4
5
6
7
8
private static ZXSearchNewService_new zxSearchNewService_new;
private static QueueProducerService messageService;

@Autowired
public zxSearch(QueueProducerService queueProducerService,ZXSearchNewService_new zxSearchNewService_new) {
zxSearch.zxSearchNewService_new = zxSearchNewService_new;
zxSearch.messageService = queueProducerService;
}

这样就可以在工具类中使用了,不需要通过传参的形式去获取