package com.yh;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

import java.util.HashMap;
import java.util.Map;

public class TestRedis {

    private Jedis jedis;

    @Before
    public void init() {
        //连接本地的 Redis 服务
        jedis = new Jedis("localhost");
        System.out.println("连接成功");
    }

    @Test
    public void testList() { // 有序,链表结构
        System.out.println(jedis.lpush("list1", "v1", "v2", "v3", "v4")); // 4 从左边添加
        System.out.println(jedis.rpush("list2", "v1", "v2", "v3", "v4")); // 4 从右边添加
        System.out.println(jedis.lrange("list1", 0, -1)); // [v4, v3, v2, v1]
        System.out.println(jedis.lrange("list2", 0, -1)); // [v1, v2, v3, v4]
        System.out.println(jedis.rpop("list1")); // v1 删除最后一个元素
        System.out.println(jedis.lpop("list2")); // v1 删除第一个元素
    }

    @Test
    public void testSet() { // 无序,不可重复
        jedis.sadd("set1", "v1", "v2", "v3", "v4");
        System.out.println(jedis.smembers("set1")); // 获取所有成员
        System.out.println(jedis.sismember("set1", "v1")); // 判断是否存在

        jedis.sadd("set2", "v1", "v3", "v5", "v7");
        System.out.println(jedis.sdiff("set1", "set2")); // 输出第一个有,后面没有的(差集)
        System.out.println(jedis.sinter("set1", "set2")); // 输出两个都有的(交集)
        System.out.println(jedis.sunion("set1", "set2")); // 输出两个总和(并集)
    }

    @Test
    public void testZSet() { // 有序集合
        Map<String, Double> map = new HashMap<>();
        map.put("k1", 20d);
        map.put("k2", 30d);
        map.put("k3", 15d);
        map.put("k4", 25d);
        System.out.println(jedis.zadd("zset", map)); // 4
        System.out.println(jedis.zrange("zset", 0, -1)); // [k3, k1, k4, k2]
        System.out.println(jedis.zrangeWithScores("zset", 0, -1)); // [[k3,15.0], [k1,20.0], [k4,25.0], [k2,30.0]]
    }

    @Test
    public void testHash(){
        Map<String, String> map = new HashMap<>();
        map.put("k1", "v1");
        map.put("k2", "v2");
        map.put("k3", "v3");
        System.out.println(jedis.hset("hash", "","")); // 4
        System.out.println(jedis.hkeys("hash")); // [k3, k1, k4, k2]
        System.out.println(jedis.hvals("hash")); // [k3, k1, k4, k2]
        System.out.println(jedis.hgetAll("hash")); // [k3, k1, k4, k2]
    }

    @Test
    public void testString() {
        System.out.println(jedis.set("k1", "v1")); // OK
        System.out.println(jedis.get("k1")); // v1
        System.out.println(jedis.del("k1")); // 1
        System.out.println(jedis.append("k1", "v12")); // 3 key不存在时,append相当于set
        System.out.println(jedis.append("k1", "v123")); // 7
        System.out.println(jedis.get("k1")); // v12v123
        System.out.println(jedis.strlen("k1")); // 7
        System.out.println(jedis.mset("k1", "v1", "k2", "v2", "k3", "v3")); // OK 和逐条添加的不同点在于这是原子性操作
        System.out.println(jedis.mget("k1", "k2", "k3")); // [v1,v2,v3]
        System.out.println(jedis.setnx("k1", "v4")); // 0 先判断key是否存在,存在则不创建
        System.out.println(jedis.setex("k1", 66, "v4")); // OK 增加过期时间(秒)
        System.out.println(jedis.ttl("k1")); // 返回距离过期的剩余时间

        SetParams setParams = new SetParams(); // 相当于设置一个规范,可应用到其他键值对
        setParams.ex(100); // 过期时间100s
        setParams.nx(); // 创建键值对之前先判断是否存在,存在则不创建
        System.out.println(jedis.set("k1", "v1", setParams));
    }

    @Test
    public void testKey() {
        System.out.println(jedis.keys("*")); // 查找所有key,参数为正则表达式,不推荐使用
        System.out.println(jedis.exists("k1")); // 判断key是否存在
        System.out.println(jedis.expire("k1", 60)); // 设值过期时间
        System.out.println(jedis.incr("count")); // 相当于++
        System.out.println(jedis.decr("count")); // 相当于--
        System.out.println(jedis.incrBy("count", 2)); // 相当于+=2
        System.out.println(jedis.decrBy("count", 2)); // 相当于-=2
    }

    @After
    public void close() {
        jedis.close();
    }

}