package redis;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;

public class RedisJava {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接redis:"+jedis.ping());
        redisHashTest(jedis);
        //redisSortedSetTest(jedis);
        //redisSetTest(jedis);
        //redisListTest(jedis);
        //redisStringTest(jedis);
    }
    
    public static void redisHashTest(Jedis jedis) {
         //添加元素
		jedis.hset("hash", "name", "张三");
		jedis.hset("hash", "sex", "未知");
		jedis.hset("hash", "age", "10");
        //输出所有值
		System.out.println("***输出所有值***"+jedis.hvals("hash"));
        //删除某个键值
		jedis.hdel("hash", "sex");
		System.out.println("***输出所有值***"+jedis.hvals("hash"));
        //整型键值加数
		jedis.hincrBy("hash", "age", 10);
		System.out.println("***整型键值加数***"+jedis.hget("hash", "age"));
        //判断某个键值是否存在
		System.out.println("***判断某个键值是否存在***"+jedis.hexists("hash", "age"));
    }
    
    public static void redisSortedSetTest(Jedis jedis) {
        //添加元素
		jedis.zadd("score", 1.0, "80");
		jedis.zadd("score", 2.0, "70");
		jedis.zadd("score", 3.0, "60");
		jedis.zadd("score", 1.2, "50");
		jedis.zadd("score", 1.3, "40");
		System.out.println("***所有元素***"+jedis.zrange("score", 0, -1));
        //删除元素
		jedis.zrem("score", "60");
		System.out.println("***所有元素***"+jedis.zrange("score", 0, -1));
        //获取元素个数
		System.out.println("***元素个数***"+jedis.zcard("score"));
        //获取指定权重的元素个数
		System.out.println("***元素权重个数***"+jedis.zcount("score", 1.0, 2.0));
        //获取指定元素的权重
		System.out.println("***元素权重***"+jedis.zscore("score", "50"));
        //获取指定下标的元素
		System.out.println("***获取指定下标的元素***"+jedis.zrange("score", 0, 1));
    }
    
    public static void redisSetTest(Jedis jedis) {
        //添加元素
		jedis.sadd("num", "1","2","3","4");
		System.out.println("***集合***"+jedis.smembers("num"));
		//删除指定集合内元素
		jedis.srem("num", "2","3");
		System.out.println("***集合***"+jedis.smembers("num"));
		//判断某个元素是否在指定集合内
		System.out.println("***判断某个元素是否在指定集合内***"+jedis.sismember("num", "3"));
		//交集
		jedis.sadd("code", "7","8","9","10");
		jedis.sadd("tax", "1","2","9","10");
		System.out.println("***交集***"+jedis.sinter("tax", "code"));
		//并集
		System.out.println("***并集***"+jedis.sunion("tax", "code"));
		//差
		System.out.println("***差***"+jedis.sunion("tax", "code"));
        
    }
    
    public static void redisListTest(Jedis jedis) {
        //添加元素
		jedis.lpush("user", "张三");
        jedis.lpush("user", "李四");
        jedis.lpush("user", "王五");
        jedis.lpush("user", "赵六");
        System.out.println("获取指定位置的元素:"+jedis.lrange("user", 0, 2));
        //删除最左边的元素
        jedis.lpop("user");
        System.out.println("删除最左边的元素:"+jedis.lrange("user", 0, -1));
        //删除最右边的元素
        jedis.rpop("user");
        System.out.println("删除最右边的元素:"+jedis.lrange("user", 0, -1));
        //删除重复元素个数,先添加的先删除
        jedis.lpush("user", "李四");
        jedis.lpush("user", "李四");
        jedis.lpush("user", "李四");
        System.out.println("获取所有的元素:"+jedis.lrange("user", 0, -1));
        jedis.lrem("user", 2, "李四");
        System.out.println("删除重复元素:"+jedis.lrange("user", 0, -1));
        //删除指定区间外的元素
        jedis.ltrim("user", 1, 2);
        System.out.println("删除指定区间外的元素:"+jedis.lrange("user", 0, -1));
        //更改列表中指定元素值
        jedis.lset("user", 1, "王五,你好");
        System.out.println("更改列表中指定元素值:"+jedis.lrange("user", 0, -1));
        //获取list长度
        System.out.println("获取list长度:"+jedis.llen("user"));
        //获取下标为1的元素
        System.out.println("获取下标为1的元素:"+jedis.lindex("user", 1));
        //排序
        jedis.lpush("num", "13");
        jedis.lpush("num", "14");
        jedis.lpush("num", "15");
        jedis.lpush("num", "12");
        jedis.lpush("num", "11");
        SortingParams sortingParameters = new SortingParams();
        sortingParameters.asc();
        sortingParameters.alpha();
        jedis.sort("num", sortingParameters);
        System.out.println("排序后的list:"+jedis.lrange("num", 0, -1));
    }
    
    public static void redisStringTest(Jedis jedis) {
        System.out.println("存入键值对:"+jedis.set("user", "张三"));
		System.out.println("判断键值是否存在:"+jedis.exists("user"));
		System.out.println("移除键值对:"+jedis.del("user"));
		//设置键值对失效时间为2秒
		System.out.println("存入键值对:"+jedis.set("user", "李四"));
		System.out.println("设置键值对失效时间为2秒:"+jedis.expire("user", 2));
		try {
			Thread.sleep(1000);
			System.out.println("键值对user剩余时间:"+jedis.ttl("user"));
			Thread.sleep(2000);
			System.out.println("2秒后键值对是否存在:"+jedis.exists("user"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("批量存入键值对:"+jedis.mset("userA", "王五","userB", "王五","userC", "王五"));
		System.out.println("批量获取键值对:"+jedis.mget("userA","userB","userC"));
		//查找某键值
		//通过key进行检索,可能会造成堵塞引起卡顿。
		Set<String> keys = jedis.keys("user*");
		for (String key:keys) {
			System.out.println(key);
		}
		//通过sacn扫描可能出现键值对重复。
		ScanParams params = new ScanParams();
		params.count(5);//扫描数量
		params.match("user*");//匹配条件
		ScanResult scanResult = jedis.scan("0", params);//游标,条件
		List<String> result = scanResult.getResult();
		for (String scan:result) {
			System.out.println(scan);
		}
		//在原来的value后面进行追加
		System.out.println("在原来的value后面追加:"+jedis.append("userA", ",你好"));
		System.out.println("追加后的userA:"+jedis.get("userA"));
		System.out.println("截取userA:"+jedis.getrange("userA", 0, -1));
		//key值不存在时添加,存在时不处理
		System.out.println("不存在就新增:"+jedis.setnx("userE", "赵六"));
        
    }
    
    
    
    
}