1. 实现方式
队列模式
发布订阅模式
2. 原理
原理很简单,用的redis的List类型,list是按照插入的顺序排序的字符串链表。和数据结构中的普通链表类似,可以在链表的头部和尾部插入新的元素。这样有个好处就是,假设链表存在了数百万条记录,仍然可以很高效的往链表的尾部或者头部插入数据。
3. 命令
LPUSH/RPOP 或LPUSH/BRPOP 可以粗糙的理解为左边进,右边出,是不是满足队列的特性。
4. 非阻塞模式-LPUSH/RPOP
注意:红色箭头表示进入队列和出队列,一目了然。
5. 阻塞模式-LPUSH/BRPOP
注意:达到的效果如上,唯一不同的是,BRPOP会一直等待队列,直到返回,类似做了监听,这也是RPOP和BRPOP的一个最大的区别。其中 0表示:一直等待
6. 上菜-java口味的
6.2 springboot项目
6.3 引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
6.4 配置文件
server.port=8080
# Redis服务器地址
redis.host=127.0.0.1
# Redis服务器连接端口
redis.port=6379
# Redis服务器连接密码(默认为空)
redis.password=123
redis.timeout=30000
# 连接池最大连接数(使用负值表示没有限制)
redis.maxTotal=30
# 连接池中的最大空闲连接
redis.maxIdle=10
redis.numTestsPerEvictionRun=1024
redis.timeBetweenEvictionRunsMillis=30000
redis.minEvictableIdleTimeMillis=1800000
redis.softMinEvictableIdleTimeMillis=10000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
redis.maxWaitMillis=1500
redis.testOnBorrow=true
redis.testWhileIdle=true
redis.blockWhenExhausted=false
6.5 注入jedis
package com.yarm.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private int port;
@Value("${redis.timeout}")
private int timeout;
@Value("${redis.maxIdle}")
private int maxIdle;
@Value("${redis.maxWaitMillis}")
private int maxWaitMillis;
@Value("${redis.blockWhenExhausted}")
private Boolean blockWhenExhausted;
@Bean
public JedisPool jedisPoolFactory() {
System.out.println("JedisPool注入开始...");
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 连接耗尽时是否阻塞, false报异常,true阻塞直到超时, 默认true
jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);
System.out.println("JedisPool注入成功...");
return jedisPool;
}
}
6.6 redis工具类
package com.yarm.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.List;
@Component
public class RedisUtil {
@Autowired
private JedisPool jedisPool;
/**
* 向Redis中存值,永久有效
*/
public String set(String key, String value) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.set(key, value);
} catch (Exception e) {
return "0";
} finally {
returnResource(jedisPool, jedis);
}
}
/**
* 根据传入Key获取指定Value
*/
public String get(String key) {
Jedis jedis = null;
String value;
try {
jedis = jedisPool.getResource();
value = jedis.get(key);
} catch (Exception e) {
return "0";
} finally {
returnResource(jedisPool, jedis);
}
return value;
}
/**
* 校验Key值是否存在
*/
public Boolean exists(String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.exists(key);
} catch (Exception e) {
return false;
} finally {
returnResource(jedisPool, jedis);
}
}
/**
* 删除指定Key-Value
*/
public Long delete(String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.del(key);
} catch (Exception e) {
return 0L;
} finally {
returnResource(jedisPool, jedis);
}
}
/**
* lpush
*/
public void lpush(String listKey, String... listValue){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.lpush(listKey,listValue);
} catch (Exception e) {
} finally {
returnResource(jedisPool, jedis);
}
}
/**
* rpop
*/
public String rpop(String key){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.rpop(key);
} catch (Exception e) {
return null;
} finally {
returnResource(jedisPool, jedis);
}
}
/**
* rpop
*/
public List<String> brpop(String key){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.brpop(10, key);
} catch (Exception e) {
return null;
} finally {
returnResource(jedisPool, jedis);
}
}
// 以上为常用方法,更多方法自行百度
/**
* 释放连接
*/
private static void returnResource(JedisPool jedisPool, Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
7. 买单
GitHub地址