大数据之路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等,在上面的一个问题中我通过观察方法发现的,目前没有仔细了解,后面会补充。