大数据之路Week10_day05 (JavaAPI 操作Redis 第一阶段)

刚开始学习JavaAPI的时候,主要是对redis中的字符串,字节位图,列表,集合,有序集合进行操作,并能够完成简单的需求。

package com.wyh.redis;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class RedisApi {
    public static void main(String[] args) {
        Jedis master = new Jedis("master", 6379);
        master.set("001","123");
        String s = master.get("001");
        System.out.println(s);
        master.close();

    }

    Jedis master;
    JedisPool masterPool;

    @Before
    public void init(){
        master = new Jedis("master", 6379);

        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(100);
        jedisPoolConfig.setMaxIdle(10);

        masterPool = new JedisPool(jedisPoolConfig, "master", 6379);

    }

    /**
     * 字符串练习
     */
    @Test
    public void String(){
        Jedis resource = masterPool.getResource();
        resource.set("002","xiaohu");
        String s = resource.get("002");
        System.out.println(s);
        resource.close();
    }

    /**
     * bitmap练习
     */
    @Test
    public void bitmap(){
        Jedis resource = masterPool.getResource();
        resource.setbit("b1",1,true);
        resource.setbit("b1",3,true);
        resource.setbit("b1",5,true);

        //获取当前位是1还是0 1返回true,0则返回false
        Boolean b1 = resource.getbit("b1", 3);
        System.out.println(b1);

        //获取该键值中有多少个1
        Long b11 = resource.bitcount("b1");
        System.out.println(b11);
        resource.close();
    }

    /**
     *list练习
     *
     */
    @Test
    public void list(){
        Jedis resource = masterPool.getResource();
        resource.lpush("shujia06","王友虎","赵以浩","江蒗","尹可洋");
        String shujia006 = resource.lpop("shujia06");
        System.out.println(shujia006);

        //一次获取该键的所有值
        List<String> shujia0061 = resource.lrange("shujia06", 0, -1);
        System.out.println(shujia0061);
        resource.close();
    }

    /**
     *
     * HashMap的练习 将学生表添加到redis
     */
    @Test
    public void hashMap(){

        try {
            BufferedReader br = new BufferedReader(new FileReader("D:\\shujia\\shujia006\\hadoop\\src\\data\\students.txt"));
            String line;
            while ((line=br.readLine())!=null){
                String[] split = line.split(",");
                String id = split[0];

                String key = "student"+":"+id;

                String name = split[1];
                String age = split[2];
                String gender = split[3];
                String clazz = split[4];

                HashMap<String, String> map = new HashMap<>();
                map.put("name",name);
                map.put("age",age);
                map.put("gender",gender);
                map.put("clazz",clazz);


                master.hmset(key,map);
            }

            Set<String> keys = master.keys("student*");
            System.out.println(keys);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /**
     * 获取所有学生信息
     */
    @Test
    public void hGetAll(){

        Set<String> keys = master.keys("student*");

        for (String key : keys) {
            Map<String, String> stringStringMap = master.hgetAll(key);
            for (Map.Entry<String, String> stringStringEntry : stringStringMap.entrySet()) {
                String value = stringStringEntry.getValue();
                System.out.print(value);
                System.out.print("\t");
            }
            System.out.println();
        }
    }

    /**
     * 共同好友(交集)
     *
     */
    @Test
    public void sinter(){
        master.sadd("weibo:王友虎","赵以浩");
        master.sadd("weibo:王友虎","李宏灿");
        master.sadd("weibo:王友虎","齐博源");
        master.sadd("weibo:王友虎","李先锋");

        master.sadd("weibo:赵以浩","李先锋");
        master.sadd("weibo:赵以浩","王友虎");
        master.sadd("weibo:赵以浩","齐博源");
        master.sadd("weibo:赵以浩","黄天祥");


        Set<String> sinter = master.sinter("weibo:王友虎", "weibo:赵以浩");
        System.out.println("他们的共同好友为:");
        System.out.println(sinter);


    }

    /**
     * 有序集合
     */
    @Test
    public void numSet(){
        master.zadd("shujia",1.0,"赵以浩");
        master.zadd("shujia",1.0,"李宏灿");
        master.zadd("shujia",1.0,"齐博源");
        master.zadd("shujia",1.0,"李先锋");

        master.zadd("shujia",2.0,"李先锋");
        master.zadd("shujia",2.0,"王友虎");
        master.zadd("shujia",2.0,"齐博源");
        master.zadd("shujia",2.0,"黄天祥");

//        HashMap<String, Integer> map = new HashMap<>();
//
        Set<String> s1 = master.zrangeByScore("shujia", 1.0, 1.0);
//        for (String s : s1) {
//            map.put(s,1);
//        }
//
        Set<String> s2 = master.zrangeByScore("shujia", 2.0, 2.0);
//        for (String s : s2) {
//            map.put(s,1);
//        }
//
//        System.out.println("他们所有的好友为:");
//        for (Map.Entry<String, Integer> stringIntegerEntry : map.entrySet()) {
//            String key = stringIntegerEntry.getKey();
//            System.out.println(key);
//        }

        System.out.println(s1);
        System.out.println(s2);


    }


    @After
    public void close(){
        masterPool.close();
        master.close();

    }
}

 

在其中,有一个新的知识点,就是 JedisPool ,可以先创建好jedis连接对象,在需要的时候,从里面拿,也可以设置个数。

但是注意:

    1、我在代码中设置的是100个最大,我在将学生信息往redis中添加的时候,卡住不动了,我以为是代码出错,结果检查redis客户端软件发现,只插入了100条数据,剩下的900条数据都没有添加,这是为什么,因为我的“池子”中最大是100个,将其换成普通的获取连接就可以了,但是后面在写代码的过程中发现,我在循环添加的时候,并未添加一条就将这个连接关闭,逻辑上而是等全部添加完毕才将其关闭,啊。。原来原因在这,问题解决。

    2、一开始我想使用有序集合去将两个人的共同好友获取出来,后面发现,我在添加的时候,就算score是可以重复的,value值都是不可以重复的,尽管score不一样,在一个表中,它就是不可以重复的,后来经过查资料,我改用set集合,无序的,两个不同的表,进行sinter的方法取交集,获取到了共同好友。

    3、这里我遗留了一个问题,发现了一个我觉得很重要,通过百度也发现它很重要的东西,就是scan,hscan等,在上面的一个问题中我通过观察方法发现的,目前没有仔细了解,后面会补充。

posted @ 2020-01-10 21:15  Xiaohu_BigData  阅读(246)  评论(0编辑  收藏  举报