Jedis的使用

4 篇文章 0 订阅
2 篇文章 0 订阅

参考地址: https://blog.csdn.net/qq_26525215/article/details/60466222

jedis的使用

  1. 由于使用的是Maven项目,首先要导入jedis和junit的依赖

    
    <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>
        <scope>test</scope>
    </dependency>
  2. 连接,关闭

    @Before
    public void init(){
        //连接redis服务器(String host,int port,int connectionTimeout,int soTimeout)
        jedis = new Jedis("192.168.25.129",6379);
        //由于我设置了密码,所以操作之前需要进行权限验证
        jedis.auth("anntly");
    }
    
    @After
    public void destory(){
        jedis.close();
    }
  3. String

    /**
     * jedis操作字符串
     */
    @Test
    public void stringTest(){
        //添加字符串
        jedis.set("study", "java");
        //获取字符串
        System.out.println("I love "+jedis.get("study"));
        //追加
        jedis.append("study", "redis");
        System.out.println("I love "+jedis.get("study"));
        //字符串长度
        System.out.println("len:"+jedis.strlen("study"));
        //批量添加
        jedis.mset("name","anntly","sex","male");
        System.out.println(jedis.mget("name","age","sex"));
        //自增
        jedis.incr("age");
        System.out.println("age:"+jedis.get("age"));
    
    }
    
  4. 哈希(map)

    
    /**
     * 哈希
     */
    @Test
    public void mapTest(){
        //添加数据
        Map<String, String> map = new HashMap<String,String>();
        map.put("name", "anntly");
        map.put("sex", "male");
        map.put("age", "22");
        jedis.hmset("user", map);
        jedis.hset("user", "email", "btzhang@foxmail.com");
        //取出name
        System.out.println("name: "+jedis.hget("user", "name"));
        //取出所有属性
        Map<String, String> user = jedis.hgetAll("user");
        for (Map.Entry<String, String> entry: user.entrySet()) {
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
        //使用hmget获取
        List<String> uList = jedis.hmget("user", "name","sex","age");
        System.out.println(uList);
        //返回key field个数
        System.out.println("总共:"+jedis.hlen("user"));
        //返回所有field的值
        System.out.println("属性有:"+jedis.hvals("user"));
        //删除field对应的value
        jedis.hdel("user", "sex");
        System.out.println("获取sex:"+jedis.hget("user", "sex"));
    }
  5. List

    
    /**
     * List
     */
    @Test
    public void listTest(){
        //因为list可以有重复元素
        jedis.del("bank");
        //添加数据(类比银行排队)
        jedis.lpush("bank", "xiaohong");
        jedis.lpush("bank", "xiaoming");
        jedis.lpush("bank", "xiaowang");
        //获取数据
        System.out.println("正在排队中:"+jedis.lrange("bank", 0, -1));
        //这个时候来了个插队的小白
        jedis.rpush("bank", "xiaobai");
        System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1));
        //这个时候保安来了要求小白到最后去
        jedis.lrem("bank", -1, "xiaobai");
        jedis.lpush("bank", "xiaobai");
        System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1));
        //队列正常工作
        jedis.rpop("bank");
        System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1));
        //小白很憋屈,他不排队了
        jedis.lpop("bank");
        System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1));
        //这个时候小王想上厕所,他让妻子小爱替他排队
        jedis.lset("bank", 0, "xiaoai");
        System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1));
        //到了晚上,银行关门了
        jedis.del("bank");
        System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1));
    }
  6. 集合(set)

    /**
     * 集合
     */
    @Test
    public void setTest(){
        //添加数据(菜单,菜品)
        jedis.sadd("menu", "hongshaorou","tangchupaigu","shuizhuroupian","dongpozhouzi");
        //总共有多少个菜
        System.out.println("餐馆共有菜品:"+jedis.scard("menu")+"个");
        //要点红烧肉,判断是否有
        System.out.println(jedis.sismember("menu", "hongshaorou")?"有红烧肉":"没有红烧肉");
        //要点糖醋里脊,判断是否有
        System.out.println(jedis.sismember("menu", "tangchuliji")?"有糖醋里脊":"没有糖醋里脊");
        //随机点两个菜
        System.out.println("随机点两个菜:"+jedis.srandmember("menu",2));
        //查看所有菜
        System.out.println(jedis.smembers("menu"));
        //随机弹出一个菜品
        jedis.spop("menu");
    
        //现在行开了一家餐馆
        jedis.sadd("menu1", "hongshaorou","tangchuliji","shuizhuroupian","huangmenji");
        //求交集
        Set<String> mSet = jedis.sinter("menu","menu1");
        System.out.println("相同的菜品有:");
        for (String string : mSet) {
            System.out.print(string+" ");
        }
        System.out.println();
        //求差集
        Set<String> mSet1 = jedis.sdiff("menu","menu1");
        System.out.println("不同的菜品有:");
        for (String string : mSet1) {
            System.out.print(string+" ");
        }
        System.out.println();
        //两家餐馆合并了
        jedis.sunionstore("finalmenu", "menu","menu1");
        System.out.println(jedis.smembers("finalmenu"));
    
    }
  7. 有序集合(zset)

    
    /**
     * 有序集合
     */
    @Test
    public void zsetTest(){
        //添加数据(成绩)
        Map<String, Double> student = new HashMap<>();
        student.put("xiaohong", 80d);
        student.put("xiaoming", 100d);
        student.put("xiaoding", 85d);
        jedis.zadd("student", student);
        //升序获取所有学生
        System.out.println("成绩由低到高排名:"+jedis.zrange("student", 0, -1));
        //由高到低
        System.out.println("成绩由低到高排名:"+jedis.zrevrange("student", 0, -1));
        //返回对应分数
        System.out.println("小红的分数为:"+jedis.zscore("student", "xiaohong"));
        //返回指定分数范围的学生
        System.out.println("成绩80-90的:"+jedis.zrangeByScore("student", 80d, 90d));
        //获取小红的排名(倒序从0开始)
        System.out.println("小红的排名为:"+jedis.zrank("student", "xiaohong"));
    }
    }

连接池

  1. 使用单例模式实现
  2. 连接池与直连对比
方式优点缺点
直连1.简单方便
2.适用于少量长期连接的场景
1.存在每次新建/关闭TCP开销
2.有的资源无法控制,存在连接泄露的可能
3.Jedis对象线程不安全
连接池1.Jedis预先生成,降低开销使用
2.连接池的形式保护和控制资源的使用
相当于直连,使用相对麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题

3. 代码

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

/**
 * redis连接池
 * @author Soledad
 *
 */
public final class RedisPool {

    //Redis服务器IP
    private static String ADDR = "192.168.25.129";
    //Redis的端口号
    private static Integer PORT = 6379;
    //访问密码
    private static String AUTH = "anntly";

    //可用连接实例的最大数目,默认为8;
    //如果赋值为-1,则表示不限制,如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
    private static Integer MAX_TOTAL = 1024;
    //控制一个pool最多有多少个状态为idle(空闲)的jedis实例,默认值是8
    private static Integer MAX_IDLE = 200;
    //等待可用连接的最大时间,单位是毫秒,默认值为-1,表示永不超时。
    //如果超过等待时间,则直接抛出JedisConnectionException
    private static Integer MAX_WAIT_MILLIS = 10000;
    private static Integer TIMEOUT = 10000;
    //在borrow(用)一个jedis实例时,是否提前进行validate(验证)操作;
    //如果为true,则得到的jedis实例均是可用的
    private static Boolean TEST_ON_BORROW = true;
    private  static JedisPool jedisPool = null;


    /**
     * 静态块,初始化Redis连接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
        /*注意:
            在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了
            这是因为高版本中官方废弃了此方法,用以下两个属性替换。
            maxActive  ==>  maxTotal
            maxWait==>  maxWaitMillis
         */
            config.setMaxTotal(MAX_TOTAL);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT_MILLIS);
            config.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取Jedis实例
     * @return
     */
    public synchronized static Jedis getJedis(){
        try {
            if(jedisPool != null){
                Jedis jedis = jedisPool.getResource();
                return jedis;
            }else{
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void returnResource(final Jedis jedis){
        //方法参数被声明为final,表示它是只读的。
        if(jedis!=null){
            jedisPool.returnResource(jedis);
            //jedis.close()取代jedisPool.returnResource(jedis)方法将3.0版本开始
            //jedis.close();
        }
    }
}
  1. 测试
public class RedisPoolTest {

    public static void main(String[] args) {

        RedisPool.getJedis().set("test", "success");
        System.out.println(RedisPool.getJedis().get("test"));
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值