1.Jedis简介
Java语言连接redis服务可使用jedis
Java语言连接redis服务
- Jedis
- SpringData Redis
- Lettuce
可视化连接redis客户端
- Redis Desktop Manager
- Redis Client
- Redis Studio
2.Hello(Jedis版)
基于maven导入相关依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
使用java操作redis演示
- 连接
- 操作
- 关闭
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class jedisTest {
@Test
public void testJedis() {
//1.连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.操作redis
//jedis.set("name", "hello");
System.out.println(jedis.get("name"));
//3.关闭连接
jedis.close();
}
}
3.Jedis读写redis数据
案例:服务调用次数控制
不同级别的用户只能获取一定次数的服务
需求分析
- 设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用
- 在业务调用前服务调用控制单元,内部使用redis进行控制,参照之前的方案
- 对调用超限使用异常进行控制,异常处理设定为打印提示信息
- 主程序启动3个线程,分别表示3种不同用户的调用
- 设定业务方法
public void business(String id, long num) {
System.out.println("用户" + id + "发起业务调用,当前第" + num + "次");
}
- 设定多线类,模拟用户调用
class MyThread extends Thread {
Service sc;
public MyThread(String id, int num) {
sc = new Service(id, num);
}
public void run() {
while (true) {
sc.service(id);
//模拟调用间隔,设定为1.x秒
try {
Random r = new Random();
Thread.sleep(1000 + r.nextInt(200));
} catch (InterruptedException e) {
e.printStackTrace();
;
}
}
}
}
- 设计redis控制方案
public void service(String id) {
Jedis jedis = new Jedis("localhost", 6379);
String value = jedis.get("compid:" + id);
//判定该值是否存在
if (value == null) {
//如果不存在就加上该值,给上时间限定和值(使用服务次数,不同级别次数不同)
jedis.setex("compid:" + id, 20, "" + (Long.MAX_VALUE - 10));
} else {
//如果存在就自增并调用业务方法
try {
Long val = jedis.incr("compid:" + id);
business(id, 10 + val - Long.MAX_VALUE);
} catch (JedisDataException e) {
//调用次数溢出,弹出提示
System.out.println("用户:" + id + "使用次数已达到上限,请稍后再试");
return;
} finally {
jedis.close();
}
}
}
- 设计启动主程序
public static void main(String[] args) {
//应完善不同级别用户调用次数
MyThread t1 = new MyThread("初级用户");
t1.start();
}
4.Jedis简易工具类开发
问题:开发中jedis对象是我们手工管理的,实际应由连接池提供对象
//jedis连接池,获得连接的工具类
public class JedisUtils {
public static Jedis getJedis() {
//连接池配置对象
JedisPoolConfig jpc = new JedisPoolConfig();
//设置最大连接数
jpc.setMaxTotal(10);
//设置活动连接数
jpc.setMaxIdle(5);
String host = "127.0.0.1";
int port = 6379;
JedisPool jp = new JedisPool(jpc, host, port);
Jedis jedis = jp.getResource();
return jedis;
}
}
问题:每次获取连接对象都会创建连接池,反而降低效率 将创建对象的过程抽取出来
//jedis连接池,获得连接的工具类
public class jedisUtils {
private static JedisPool jp = null;
static {
//连接池配置对象
JedisPoolConfig jpc = new JedisPoolConfig();
//设置最大连接数
jpc.setMaxTotal(10);
//设置活动连接数
jpc.setMaxIdle(5);
String host = "127.0.0.1";
int port = 6379;
jp = new JedisPool(jpc, host, port);
}
public static Jedis getJedis() {
Jedis jedis = jp.getResource();
return jedis;
}
}
问题:数据与代码耦合,将可变数据提出做成配置文件
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;
//jedis连接池,获得连接的工具类
public class jedisUtils {
private static JedisPool jp = null;
private static String host = null;
private static int port;
private static int maxTotal;
private static int maxIdle;
static {
//加载配置文件
ResourceBundle rb = ResourceBundle.getBundle("redis");
host = rb.getString("redis.host");
port = Integer.parseInt(rb.getString("redis.port"));
maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
//连接池配置对象
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxIdle(maxIdle);
jpc.setMaxTotal(maxTotal);
//创建连接池
jp = new JedisPool(jpc, host, port);
}
public static Jedis getJedis() {
Jedis jedis = jp.getResource();
return jedis;
}
public static void main(String[] args) {
//测试
Jedis jedis = jedisUtils.getJedis();
}
}
redis.properties文件
redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=10
redis.maxIdle=10
5.可视化客户端
Redis Desktop Manager 直接下载安装