使用jedis连接redis-cluster进行hash数据结构api演示

继上一篇使用jedis连接redis-cluster进行list列表数据结构api演示

之后的第三章节。本章内容讲解使用jedis连接redis-cluster进行hash数据结构api演示。

package com.coderman.jedis.clusterdemo;

import com.alibaba.fastjson.JSON;
import org.junit.Test;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @Author fanchunshuai
 * @Date 2019/12/27 18
 * @Description:
 * redis hash操作 api
 */
public class HashDataAPITest extends ClusterTest {

    @Test
    public void testAddHashUser(){
        String userKey = "user:1000";
        Map<String,String> userMap = new HashMap<>();
        userMap.put("uname","fanchunshuai");
        userMap.put("uid","1203");
        userMap.put("deptid","890");
        userMap.put("sid","3094");
        userMap.put("ucname","樊春帅");
        userMap.forEach((k,v)->{
            cluster.hset(userKey.getBytes(),k.getBytes(),v.getBytes());
        });

        userMap.forEach((k,v)->{
            //一个一个获取
            String value =  new String(cluster.hget(userKey.getBytes(),k.getBytes()));
            System.out.println("value = "+value);
            //第二种方式
            String value2 = cluster.hget(userKey,k);
            System.out.println("value2 = "+value2);
        });

        Map<String,String> userMap2 = cluster.hgetAll(userKey);

        System.out.println(JSON.toJSONString(userMap2));
    }

    @Test
    public void testUpadateHashUser(){
        String userKey = "user:1000";
        Map<String,String> userMap = new HashMap<>();
        userMap.put("uname","fanchunshuai");
        userMap.put("uid","1203");
        userMap.put("deptid","890");
        userMap.put("sid","3094");
        userMap.put("ucname","樊春帅");

        userMap.forEach((k,v)->{
            //一个一个获取
            String value =  new String(cluster.hget(userKey.getBytes(),k.getBytes()));
            System.out.println("value = "+value);
            //第二种方式
            String value2 = cluster.hget(userKey,k);
            System.out.println("value2 = "+value2);
        });

        Map<String,String> userMap2 = cluster.hgetAll(userKey);
        System.out.println(JSON.toJSONString(userMap2));
        //修改其中hash 中uname的值
        cluster.hset(userKey,"uname","fanchunshuai002");
        Map<String,String> userMap3 = cluster.hgetAll(userKey);

        System.out.println(JSON.toJSONString(userMap3));
    }




    @Test
    public void testAddHashFeedStream(){
        Random random = new Random();
        //构造10000条微博动态
        for (int i = 0;i < 10000;i++){
            //假设有一条微博动态feed,id = 1000
            String userKey = "feed:"+i;

            Map<String,String> map = cluster.hgetAll(userKey);
            if(map == null || map.isEmpty()){
                continue;
            }
            Map<String,String> feedMap = new HashMap<>();
            //评论数
            feedMap.put("comment",random.nextInt(100)+"");
            //点赞数
            feedMap.put("praise",random.nextInt(10000)+"");
            //发布时间
            feedMap.put("ctime",(System.currentTimeMillis() - random.nextInt(10000))+"");

            feedMap.forEach((k,v)->{
                cluster.hset(userKey.getBytes(),k.getBytes(),v.getBytes());
            });
        }


        //查询10000条微博动态
        for (int i = 0;i < 10000;i++) {
            //假设有一条微博动态feed,id = 1000
            String userKey = "feed:" + i;
            Map<String,String> feedMap = cluster.hgetAll(userKey);
            System.out.println(JSON.toJSONString(feedMap));
            //点赞数加1
            cluster.hincrBy(userKey,"praise",1L);
            Map<String,String> feedMap2 = cluster.hgetAll(userKey);
            System.out.println(JSON.toJSONString(feedMap2));
            Integer prasie = Integer.parseInt(feedMap2.get("praise"));

            //点赞数大于5000设置uid
            if(prasie.intValue() > 5000){
                cluster.hset(userKey,"uid",random.nextInt(100000000)+"");
                Map<String,String> feedMap3 = cluster.hgetAll(userKey);
                System.out.println(JSON.toJSONString(feedMap3));
            }
        }
    }


    /**
     * 测试游标遍历
     * redis可以通过keys *命令获取所有key,或者通过匹配模式
     * 如keys user:*但是这种方式可能会导致redis存在阻塞,影响服务稳定性,
     * 使用下面的hscan可以降低这种风险
     * 参考《Redis深度历险:核心原理和应用实践》
     */
    @Test
    public void testHashScan(){
        String userKey = "user:1000";
        int cursor = 0;
        ScanParams scanParams = new ScanParams();
        //设置一次取100条
        scanParams.count(100);
        ScanResult scanResult = cluster.hscan(userKey,"0",scanParams);
        System.out.println(JSON.toJSONString(scanResult.getResult()));

        List<String> retList = new ArrayList<>();



        //这里演示对一个hash key增加超过10000个元素,然后进行遍历

        Map<String,String> userMap = new HashMap<>();
        userMap.put("uname","fanchunshuai");
        userMap.put("uid","1203");
        userMap.put("deptid","890");
        userMap.put("sid","3094");
        userMap.put("ucname","樊春帅");
        for (int i = 0;i < 10000;i++){
            userMap.put("uname"+i,"uname"+i);
        }


        userMap.forEach((k,v)->{
            cluster.hset(userKey.getBytes(),k.getBytes(),v.getBytes());
        });

        //下面是通过hscan命令循环获取
        //使用do while循环
        String scanRet = "";
        do {
            ScanResult scanResult2 = cluster.hscan(userKey,"0",scanParams);
            scanRet = scanResult2.getStringCursor();
            retList.addAll(scanResult2.getResult());
            System.out.println("retList = "+retList.size());

        } while (!scanRet.equals("0"));
    }
}

发布了159 篇原创文章 · 获赞 69 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/u010504064/article/details/103938369