Jredis的使用

Redis-Java(Jredis)

Maven中的依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.1.0</version>
</dependency>

常用API

    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1",6379);
        //授权
        jedis.auth("123456");

        //输出PONG,redis连通成功
        System.out.println(jedis.ping());
        jedis.set("k1","v1");
        jedis.set("k2","v2");
        jedis.set("k3","v3");
        Set<String> keys = jedis.keys("*");
        keys.forEach(u-> System.out.println(u));
        System.out.println("jedis.exists:" + jedis.exists("k2"));
        //一次放入多个String
        jedis.mset("m1","vm1","m2","vm2","m3","vm3");
        Set<String> keys1 = jedis.keys("*");
        keys.forEach(u-> System.out.print(u+" "));
        System.out.println("");
        // list
        jedis.lpush("mylist","1","2","3","4");
        List<String> list=jedis.lrange("mylist",0,-1);
        System.out.println(list);
        //set
        jedis.sadd("myset","hello");
        jedis.sadd("myset","hello");
        jedis.sadd("myset","hello1");
        jedis.sadd("myset","hello2");
        Set<String> set=jedis.smembers("myset");
        System.out.println(set);
        // hash
        jedis.hset("myhash","username","lcg");
        jedis.hset("myhash","username","lcg1");
        jedis.hset("myhash","password","123456");
        jedis.hset("myhash1","username","lcg1");
        jedis.hset("myhash1","username","lcg111");
        jedis.hset("myhash1","password","12345611");
        jedis.hset("myhash2","username","lcg1");
        jedis.hset("myhash2","username","lcg1213");
        jedis.hset("myhash2","password","123456afewf");
        List<String> list1=jedis.hmget("myhash","username","password");
        Map<String,String> map1=jedis.hgetAll("myhash2");
        System.out.println(list1);
        System.out.println(map1);


        //zset
        jedis.zadd("zset01", 60d, "v1");
        jedis.zadd("zset01", 170d, "v2");
        jedis.zadd("zset01", 180d, "v3");
        jedis.zadd("zset01", 90d, "v4");
        Set<String> s1 = jedis.zrange("zset01", 0, -1);
        System.out.println(s1);
    }

事务

package com.example.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;

import java.util.List;

public class TestRedisTransaction {
public static void main(String[] args) throws InterruptedException {
Jedis jedis = new Jedis(“127.0.0.1”,6379);
//授权
jedis.auth(“123456”);

    //输出PONG,redis连通成功
    System.out.println(jedis.ping());

    //事务
    Transaction transaction=jedis.multi();
    Response<String> response = transaction.get("serialNum");
    transaction.set("serialNum", "s002");
    transaction.set("serialNum", "s004");
    response = transaction.get("serialNum");
    transaction.lpush("list3", "a");
    transaction.lpush("list3", "b");
    transaction.lpush("list3", "c");
    transaction.exec();
    // 2 transaction.discard();
    System.out.println("serialNum***********" + response.get());
    List<String> list= jedis.lrange("list3",0,-1);
    System.out.println(list);


    /**
     * 通俗点讲,watch命令就是标记一个键,如果标记了一个键, 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中 重新再尝试一次。
     * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减; 足够的话,就启动事务进行更新操作,
     * 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错, 程序中通常可以捕获这类错误再重新执行一次,直到成功。
     *
     * @throws InterruptedException
     */
    TestRedisTransaction t1=new TestRedisTransaction();
    boolean retValue = t1.transMethod();
    System.out.println("main retValue-------: " + retValue);

}


public static boolean transMethod() throws InterruptedException {
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    jedis.auth("123456");
    int balance;// 可用余额
    int debt;// 欠额
    int amtToSubtract = 10;// 实刷额度
    jedis.set("balance","100");
    jedis.set("debt","0");
    jedis.watch("balance");

   // Thread.sleep(7000); //让该线程休眠七秒,然后在其他地方例如再开启一个redis-cli修改balance,就会报错
    balance = Integer.parseInt(jedis.get("balance"));
    if (balance < amtToSubtract) {
        jedis.unwatch();
        System.out.println("modify");
        return false;
    } else {
        System.out.println("***********transaction");
        Transaction transaction = jedis.multi();
        transaction.decrBy("balance", amtToSubtract);
        transaction.incrBy("debt", amtToSubtract);
        transaction.exec();
        balance = Integer.parseInt(jedis.get("balance"));
        debt = Integer.parseInt(jedis.get("debt"));

        System.out.println("*******" + balance);
        System.out.println("*******" + debt);
        return true;
    }

}

}

主从复制

package com.example.redis;
import redis.clients.jedis.Jedis;

public class MasterSlave {
    public static void main(String[] args) {
        //主从复制
        Jedis jedis_M = new Jedis("127.0.0.1", 6379);
		Jedis jedis_S = new Jedis("127.0.0.1", 6380);

		jedis_S.slaveof("127.0.0.1", 6379);

		jedis_M.set("class", "1122V2");

		String result = jedis_S.get("class");//可能有延迟,需再次启动才能使用
		System.out.println(result);
         
    }
}

Redis线程池

池化技术

池化技术的含义

池化技术应用:Java多线程知识模块的线程池、Mysql,Redis的数据库连接池、http连接池等等。

池化技术的优点
  1. 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

  2. 提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行。

  3. 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,监控和调优。

Redis数据库连接池的实现
package com.example.redis;

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

public class JedisPoolUtil {
    private static volatile JedisPool jedisPool=null;
    private JedisPoolUtil(){}
    public static JedisPool getJedisPoolInstance(){
        if(jedisPool==null){
            synchronized (JedisPoolUtil.class){
                if(jedisPool==null){
                    JedisPoolConfig poolConfig = new JedisPoolConfig();
                    poolConfig.setMaxActive(1000);
                    poolConfig.setMaxIdle(32);
                    poolConfig.setMaxWait(100 * 1000);
                    poolConfig.setTestOnBorrow(true);
                    //redis线程池和主从复制不是一回事情!
                    //redis线程池是针对一个ip+port的redis而言,即同一个redis的不同redis-cli,而主从复制是针对不同的redis-server
                    jedisPool=new JedisPool(poolConfig,"121.37.68.120",6379);
                }
            }
        }
        return jedisPool;
    }

    public static void release(JedisPool jedisPool, Jedis jedis) {
        if (null != jedis) {
            jedisPool.returnResourceObject(jedis);
        }
    }
}

Test

package com.example.redis;

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

public class RedisPool {
    public static void main(String[] args) {
        JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
        JedisPool jedisPool2 = JedisPoolUtil.getJedisPoolInstance();

        System.out.println(jedisPool == jedisPool2);

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.set("testaa", "testaa");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JedisPoolUtil.release(jedisPool, jedis);
        }
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值