Redis学习_4_jedis(Java连接redis数据库)

什么是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步(完整的类见附录):

  1. 创建jedis对象连接redis数据库
Jedis jedis = new Jedis("127.0.0.1", 6379);
  1. 操作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));
  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();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值