jedis连接池的使用和一个小案例

jedis连接池的使用和一个小案例

jedis的使用

使用的maven项目,先导入依赖

		<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

jedis调用的方法名与操作redis的命令名是完全一致的,见代码

import redis.clients.jedis.Jedis;

public class JedisTest {
    
    
    public static void testJesdis(){
    
    
        //1.连接redis
        Jedis jedis=new Jedis("127.0.0.1",6379);
        //2.操作redis,jedis对应的方法名与redis对应的完全一致
        System.out.println(jedis.get("name"));
        jedis.set("name","if");
        System.out.println(jedis.get("name"));
        jedis.append("name"," is me");
        System.out.println(jedis.get("name"));
        jedis.del("name");
        System.out.println(jedis.get("name"));
        //3.关闭连接
        jedis.close();
    }

    public static void main(String[] args) {
    
    
        testJesdis();
    }
}

输出结果

null
if
if is me
null

jedis连接池工具类

其中调用了properties文件,所以可以在resource文件夹中创建一个redis.properties文件(文件名可以随意取,调用的时候改一下就好了)

//redis.properties文件
redis.port=6379
redis.host=127.0.0.1
redis.maxTotal=30
redis.maxIdle=10

JedisUtiles工具类来创建连接池并返回jedis对象

public class JedisUtils{
    
    
    /**
     * jp        jedis连接池
     * port      端口号
     * host      主机地址
     * maxTotal  最大连接数
     * maxIdle   最大活动数
     */
    private static JedisPool jp;
    private static int port;
    private static String host;
    private static int maxTotal;
    private static int maxIdle;
    static {
    
    
        //根据文件名拿到对象,取出来的值都是String类型的
        ResourceBundle rb=ResourceBundle.getBundle("redis");
        port=Integer.parseInt(rb.getString("redis.port"));
        host=rb.getString("redis.host");
        maxIdle=Integer.parseInt(rb.getString("redis.maxIdle"));
        maxTotal=Integer.parseInt(rb.getString("redis.maxTotal"));
        JedisPoolConfig jpc=new JedisPoolConfig();
        //活动连接数
        jpc.setMaxIdle(maxIdle);
        //最大连接数
        jpc.setMaxTotal(maxTotal);
//        String host ="127.0.0.1";
//        int port =6379;
        jp=new JedisPool(jpc,host,port);
    }
    public static Jedis getJedis(){
    
    
        //返回jedis对象
        return jp.getResource();
    }
}

来一个小案例

需求如下

现有一个文件允许用户访问,但是普通用户一定时间只能访问10次,会员用户一定时间可以访问30次

为了方便测试,这里采用普通用户一分钟内只能访问10次,会员用户一分钟内可以访问30次
完整代码如下(为了方便查看代码,将所有的class写在同一个java文件里了)

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ResourceBundle;

/**
 * @Author if
 * @Description: jedis+多线程练习
 * 需求:现有一个文件允许用户访问,但是普通用户一定时间只能访问10次,会员用户一定时间可以访问30次
 * @Date 2021-01-28 下午 02:55
 */
public class Service {
    
    
    private int num;
    private String id;

    public Service(int num, String id) {
    
    
        this.num = num;
        this.id = id;
    }
    public void service() throws InterruptedException {
    
    
//        Jedis jedis=new Jedis("127.0.0.1",6379);
        //使用jedis连接池来获取jedis对象
        Jedis jedis=JedisUtils.getJedis();
        String value=jedis.get("id:"+id);
        try{
    
    
            if(value==null){
    
    
                System.out.println(id+"访问成功,在一分钟内您共有"+num+"次访问机会");
                jedis.setex("id:"+id,60,Long.MAX_VALUE-num+"");
            }else{
    
    
                Long val=jedis.incr("id:"+id);
                out(id,num-(Long.MAX_VALUE-val));
            }
        }catch(Exception e){
    
    
            System.out.println(this.id+"用户已经用尽了所有访问次数,请10秒以后再来试试把,可以升级成为会员!");
            Thread.sleep(10000);
            return;
        }finally {
    
    
            jedis.close();
        }
    }
    public void out(String name,Long num){
    
    
        System.out.println(name+",这是您第"+num+"次访问\n在一分钟内您还有"+(this.num-num)+"次访问机会");
    }
}

class MyThread extends Thread{
    
    
    Service service;
    public MyThread(String id,int num) {
    
    
        this.service =new Service(num, id);
    }
    @Override
    public void run() {
    
    
        while (true){
    
    
            try{
    
    
                service.service();
                Thread.sleep(1000);
            }catch(Exception e){
    
    
                e.printStackTrace();
            }

        }
    }
}
class JedisUtils{
    
    
    /**
     * jp        jedis连接池
     * port      端口号
     * host      主机地址
     * maxTotal  最大连接数
     * maxIdle   最大活动数
     */
    private static JedisPool jp;
    private static int port;
    private static String host;
    private static int maxTotal;
    private static int maxIdle;
    static {
    
    
        //根据文件名拿到对象,取出来的值都是String类型的
        ResourceBundle rb=ResourceBundle.getBundle("redis");
        port=Integer.parseInt(rb.getString("redis.port"));
        host=rb.getString("redis.host");
        maxIdle=Integer.parseInt(rb.getString("redis.maxIdle"));
        maxTotal=Integer.parseInt(rb.getString("redis.maxTotal"));
        JedisPoolConfig jpc=new JedisPoolConfig();
        //活动连接数
        jpc.setMaxIdle(maxIdle);
        //最大连接数
        jpc.setMaxTotal(maxTotal);
//        String host ="127.0.0.1";
//        int port =6379;
        jp=new JedisPool(jpc,host,port);
    }
    public static Jedis getJedis(){
    
    
        //返回jedis对象
        return jp.getResource();
    }
}
class Main{
    
    
    public static void main(String[] args) {
    
    
        MyThread m1=new MyThread("普通用户小明",10);
        MyThread m2=new MyThread("普通用户小红",10);
        MyThread m3=new MyThread("会员用户if",30);
        m1.start();
        m2.start();
        m3.start();
    }
}

部分输出结果如下

普通用户小明访问成功,在一分钟内您共有10次访问机会
会员用户if访问成功,在一分钟内您共有30次访问机会
普通用户小红访问成功,在一分钟内您共有10次访问机会
会员用户if,这是您第1次访问
在一分钟内您还有29次访问机会
普通用户小明,这是您第1次访问
在一分钟内您还有9次访问机会
普通用户小红,这是您第1次访问
在一分钟内您还有9次访问机会
。。。。。。。。。。。。。省略很多字
会员用户if,这是您第9次访问
在一分钟内您还有21次访问机会
普通用户小明,这是您第9次访问
在一分钟内您还有1次访问机会
普通用户小红,这是您第9次访问
在一分钟内您还有1次访问机会
会员用户if,这是您第10次访问
在一分钟内您还有20次访问机会
普通用户小明,这是您第10次访问
在一分钟内您还有0次访问机会
普通用户小红,这是您第10次访问
在一分钟内您还有0次访问机会
会员用户if,这是您第11次访问
在一分钟内您还有19次访问机会
普通用户小明用户已经用尽了所有访问次数,请10秒以后再来试试把,可以升级成为会员!
普通用户小红用户已经用尽了所有访问次数,请10秒以后再来试试把,可以升级成为会员!
会员用户if,这是您第12次访问
在一分钟内您还有18次访问机会
会员用户if,这是您第13次访问
在一分钟内您还有17次访问机会

Guess you like

Origin blog.csdn.net/Jay_Chou345/article/details/113344066