Redis操作一(curd)

来源:互联网 发布:大数据技术与应用 编辑:程序博客网 时间:2024/06/06 04:04
package com.wjh.Redis;


import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;


import org.junit.Before;
import org.junit.Test;


import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;


/**
 * Redis操作
 * 
 * 参考:
 * http://blog.csdn.net/liubenlong007/article/details/53766734
 * http://doc.redisfans.com/index.html
 * 
 * Copyright:   Copyright 2007 - 2017 MPR Tech. Co. Ltd. All Rights Reserved.
 * Date:        2017年7月27日 下午6:15:10
 * Author:      wujianh
 * Version:     1.0.0.0
 * Description: Initialize
 */
public class Redis {


    static String prefix = "user:lbl";


    private JedisCluster cluster;


    @Before
    public void testInitJedisPool() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        // 最大连接数
        poolConfig.setMaxTotal(10);
        // 最大空闲数
        poolConfig.setMaxIdle(1);
        // 最大允许等待时间,如果超过这个时间还未获取到连接,则会报JedisException异常:
        // Could not get a resource from the pool
        poolConfig.setMaxWaitMillis(1000);
        Set<HostAndPort> nodes = new LinkedHashSet<HostAndPort>();
        nodes.add(new HostAndPort("192.168.61.136", 7000));
        nodes.add(new HostAndPort("192.168.61.136", 7001));
        nodes.add(new HostAndPort("192.168.61.136", 7002));
        nodes.add(new HostAndPort("192.168.61.142", 7000));
        nodes.add(new HostAndPort("192.168.61.142", 7001));
        nodes.add(new HostAndPort("192.168.61.142", 7002));
        cluster = new JedisCluster(nodes, poolConfig);


    }


    /**
     * 插入KEY
     * @Description: TODO
     *
     * Author: wujianh
     * Date: 2017年7月28日 下午7:08:42
     * Version: 1.0
     */
    @Test
    public void addJedis() {
        if (null != cluster) {
            System.out.println("set:" + cluster.set("test1", "test1"));
            System.out.println("set:" + cluster.set("test2", "test2"));
            System.out.println("set:" + cluster.set("test3", "test3"));
        }
    }


    /**
     * 取KEY
     * @Description: TODO
     *
     * Author: wujianh
     * Date: 2017年7月28日 下午7:08:55
     * Version: 1.0
     */
    @Test
    public void getJedis() {
        if (null != cluster) {
            System.out.println("get:" + cluster.get("test1"));
            System.out.println("get:" + cluster.get("test2"));
            System.out.println("get:" + cluster.get("test3"));
        }
    }


    /**
     * 修改
     * @Description: TODO
     *
     * Author: wujianh
     * Date: 2017年7月28日 下午7:19:24
     * Version: 1.0
     */
    @Test
    public void updateJedis() {
        if (null != cluster) {
            // 拼接
            System.out.println(
                    "update test2:" + cluster.append("test2", " is test"));
            /**
             *  incr:
             *  将 key 中储存的数字值增一。
             *  如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
             *  如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
             *  本操作的值限制在 64 位(bit)有符号数字表示之内。
             *  这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,所以 key 内储存的字符串被解释为十进制 64 位有符号整数来执行 INCR 操作。
             *  返回值:     执行 INCR 命令之后 key 的值。
             *  最终数据结果如果大于10000,好像会有问题(没有测试)
             */


            // 进行加1操作
            System.out.println("update age:" + cluster.incr("age"));
        }
    }


    /**
     * 删除
     * @Description: TODO
     *
     * Author: wujianh
     * Date: 2017年7月28日 下午7:14:27
     * Version: 1.0
     */
    @Test
    public void delJedis() {
        if (null != cluster) {
            System.out.println("del:" + cluster.del("test1"));
        }
    }


    /**
     * 批量操作
     * @Description: TODO
     *
     * Author: wujianh
     * Date: 2017年7月29日 上午11:48:20
     * Version: 1.0
     */
    @Test
    public void batch() {
        if (null != cluster) {
            /**
             * 批量操作key
             * keySlot算法中,如果key包含{},就会使用第一个{}内部的字符串作为hash key,
             * 这样就可以保证拥有同样{}内部字符串的key就会拥有相同slot。
             * 参考:http://brandnewuser.iteye.com/blog/2314280
             *
             * 注意:这样的话,本来可以hash到不同的slot中的数据都放到了同一个slot中,
             * 所以使用的时候要注意数据不要太多导致一个slot数据量过大,数据分布不均匀!
             *
             * MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,
             * 某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
             * 
             * 如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,
             * 如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
             */
            String result = cluster.mset("{user:lbl:}name", "wjh",
                    "{user:lbl:}age", "18", "{user:lbl:}qq", "88886666");
            System.out.println("batch mset:" + result);


            String name = cluster.get("{user:lbl:}name");
            System.out.println("batch get:" + name);


            List<String> values = cluster.mget("{user:lbl:}name",
                    "{user:lbl:}age", "{user:lbl:}qq");
            System.out.println(values);


        }
    }


}