在工作中,由于各种业务场景,很多开发同学都会用到队列。今天,我们就用redis队列实现一个简单的业务需求。
1.实现队列的操作逻辑
package com.my.frame.app.cached.Queue;
import org.springframework.stereotype.Component;
/**
* 用于实现redis队列逻辑
* key为队列名称
*/
@Component
public interface IRedisQueue {
/**
* 队列尾部添加一个任务
* @param key
* @param value
*/
void add(String key, String value);
// /**
// * 删除头节点的任务 一般情况下不使用这个方法
// * @param key
// * @return
// */
// String remove(String key);
/**
* 得到并移除队列中头节点任务
* @param key
* @return
*/
String get(String key);
/**
* 获取某个队列长度
* @param key
* @return
*/
Long getQueueLength(String key);
/**
* 校验某个saled是否在队列中 (预留key,3D可以做区别)
* @param value
* @return
*/
public boolean exixt(String key,String value);
}
以及队列操作的实现类
package com.my.frame.app.cached.Queue.impl;
import com.my.frame.app.cached.Queue.IRedisQueue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
@Slf4j
@Service
public class RedisQueueImpl implements IRedisQueue {
private Jedis jedis;
private final String redisQueue = "Redis_Queue";
private final HashMap<String,String> cacheMap = new HashMap<>();//这里用于获取队列是否包含某个任务
@Value("${spring.redis.host}")
private static String redisHost;
@Value("${spring.redis.portt}")
private static Integer redisPort;
private RedisQueueImpl() {
jedis = new Jedis(redisHost,redisPort);
jedis.getClient().setPassword(redisSecret);
}
@Override
public void add(String key, String value) {
jedis.rpush(key, value);
cacheMap.put(value,"");
log.info(redisQueue + "添加:队列:{} value:{}",key,value);
}
@Override
public String get(String key) {
String value = jedis.lpop(key);
cacheMap.remove(value);
log.info(redisQueue + "得到:队列:{} 任务:{}",key,value);
return value;
}
@Override
public Long getQueueLength(String key) {
return jedis.llen(key);
}
@Override
public boolean exixt(String key,String value){
return cacheMap.containsKey(value);
}
}
OK,到这里我们就实现一个redis队列的简单操作逻辑,我们可以根据上面的RedisQueueImpl .java这个类执行具体的业务操作。