什么是jedis
jedis就是Java用来连接redis数据库的工具。
怎么使用
- 直接下载jar包,这里提供网易的maven镜像仓库的jar,jedis-2.9.0.jar。
- 通过maven依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
把jar依赖到项目中来之后,就可以使用jedis了,jedis的使用非常简单,只有3步(完整的类见附录):
- 创建jedis对象连接redis数据库
Jedis jedis = new Jedis("127.0.0.1", 6379);
- 操作redis中的数据,jedis涉及到的方法和之前学习的redis的操作相同,只要注意一下返回值类型,很容易上手。
jedis.set("str", "str-value");
jedis.hset("hash0", "field0", "value0");
jedis.rpush("list0", "a", "b", "c");
jedis.sadd("set0", "a", "b", "c");
jedis.zadd("zset0", 0L, "a");
jedis.zadd("zset0", 1L, "b");
jedis.zadd("zset0", 2L, "c");
System.out.println("string: " + jedis.get("str"));
System.out.println("hash " + jedis.hgetAll("hash0"));
System.out.println("list.size(): " + jedis.lrange("list0", 0, -1).size());
System.out.println("set: " + jedis.smembers("set0"));
System.out.println("zset: " + jedis.zrangeWithScores("zset0", 0, -1));
- 关闭连接
jedis.close();
使用redis来做一个小练习
需求:
- 有一个业务功能可以供用户调用。
- 某一时间段内,用户有调用该功能的次数限制。
- 对于不同的用户,允许调用业务功能的次数不相同。
具体的实现放在附录。
做一个jedis工具类
作为jedis的工具类,肯定需要用到连接池,下面我们简单看一下jedis的连接池怎么创建及使用。
//连接池的配置类
JedisPoolConfig jpc = new JedisPoolConfig();
//做一些简单配置
jpc.setMaxTotal(30);
jpc.setMaxIdle(10);
JedisPool jedisPool = new JedisPool(jpc, "127.0.0.1", 6379);
//获取连接
Jedis jedis = jedisPool.getResource();
当然,作为工具类,我们可以把host、port、maxTotal、maxIdle存到配置文件里,这里具体的内容见附录。
附录
jedis基本操作
- JedisTest.java
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
@Test
public void testJedis() {
//1.建立连接
Jedis jedis = new Jedis("127.0.0.1", 6379);
// Jedis jedis = JedisUtils.getJedis();
//2.操作数据
//先清理数据
jedis.flushAll();
jedis.set("str", "str-value");
jedis.hset("hash0", "field0", "value0");
jedis.rpush("list0", "a", "b", "c");
jedis.sadd("set0", "a", "b", "c");
jedis.zadd("zset0", 0L, "a");
jedis.zadd("zset0", 1L, "b");
jedis.zadd("zset0", 2L, "c");
System.out.println("string: " + jedis.get("str"));
System.out.println("hash " + jedis.hgetAll("hash0"));
System.out.println("list.size(): " + jedis.lrange("list0", 0, -1).size());
System.out.println("set: " + jedis.smembers("set0"));
System.out.println("zset: " + jedis.zrangeWithScores("zset0", 0, -1));
//3.关闭连接
jedis.close();
}
}
jedis小练习
- Service.java
package cn.jam;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;
import java.util.Random;
public class Service {
private static final int VALUE_EFFECTIVE_TIME = 5;
private static final String CACHE_USERS = "users";
private static final String CACHE_USER_ID = "user:id:";
private static final String LOCAL_HOST = "127.0.0.1";
private static final int PORT = 6379;
public static void main(String[] args) {
//先缓存用户可以调用的次数
Jedis jedis = new Jedis(LOCAL_HOST, PORT);
jedis.hset(CACHE_USERS, "Jam", "5");
jedis.hset(CACHE_USERS, "Tom", "10");
jedis.hset(CACHE_USERS, "Sam", "6");
jedis.close();
MyThread mt1 = new MyThread("Jam");
MyThread mt2 = new MyThread("Tom");
MyThread mt3 = new MyThread("Tom2");
mt1.start();
mt2.start();
mt3.start();
}
/**
* 提供服务
* @param id 调用服务的用户id
*/
public void doService(String id) {
Jedis jedis = new Jedis(LOCAL_HOST, PORT);
//判段用户是否有调用的权限
Boolean userExists = jedis.hexists(CACHE_USERS, id);
if(!userExists) {
System.out.println("用户【" + id + "】没有调用服务的权限");
return;
}
//获取已执行次数
String cnt = jedis.get(CACHE_USER_ID + id);
//获取用户可执行最大次数
long cntMax = NumberUtils.toLong(jedis.hget(CACHE_USERS, id));
//为空时,预置数据
if(StringUtils.isBlank(cnt)) {
cnt = Long.MAX_VALUE - cntMax + "";
jedis.setex(CACHE_USER_ID + id, VALUE_EFFECTIVE_TIME, cnt);
}
try {
//可执行次数+1
jedis.incr(CACHE_USER_ID + id);
//调用服务
business(id, NumberUtils.toLong(cnt) + cntMax + 1 + - Long.MAX_VALUE);
} catch (JedisDataException e) {
System.out.println("用户【" + id + "】服务次数达到上限");
} finally {
//关闭连接
jedis.close();
}
}
/**
* 提供业务功能
* @param id 用户id
* @param cnt 调用次数
*/
private void business(String id, Long cnt) {
System.out.println("为【" + id + "】提供业务功能-第【" + cnt + "】次");
}
}
class MyThread extends Thread {
private String id;
public MyThread(String id) {
this.id = id;
}
@Override
public void run() {
Service service = new Service();
Random random = new Random();
while(true) {
//调用服务
service.doService(id);
try {
Thread.sleep(random.nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
jedis工具类
- redis.properties
redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=30
redis.maxIdle=10
- JedisUtils.java
package cn.jam.utils;
import org.apache.commons.lang3.math.NumberUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;
public class JedisUtils {
private static JedisPool jedisPool = 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 = NumberUtils.toInt(rb.getString("redis.port"), 6379);
maxTotal = NumberUtils.toInt(rb.getString("redis.maxTotal"), 30);
maxIdle = NumberUtils.toInt(rb.getString("redis.maxIdle"), 10);
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(maxTotal);
jpc.setMaxIdle(maxIdle);
jedisPool = new JedisPool(jpc, host, port);
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}