Java程序员从笨鸟到菜鸟(五十五) java 对 Redis 的基本操作

基本功能测试

1、添加 Redis 依赖

<properties>
  <jedis.version>2.9.0</jedis.version>
</properties>

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>${jedis.version}</version>
</dependency>

2、功能类

public class RedisClient {
    /**
     * 非切片客户端连接
     * */
    private Jedis jedis;
    /**
     * 非切片连接池
     * */
    private JedisPool jedisPool;
    /**
     * 切片客户端连接池
     * */
    private ShardedJedis shardedJedis;
    /**
     * 切片连接池
     * */
    private ShardedJedisPool shardedJedisPool;

    public RedisClient() {
        initialPool();
        initialShardedPool();
        jedis = jedisPool.getResource();
        shardedJedis = shardedJedisPool.getResource();
        jedis.auth("admin"); // Redis 未设置密码的话,不需要这一步
    }

    /**
     * 初始化非切片池
     * */
    private void initialPool() {
        // 池基本配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(5);
        config.setMaxWaitMillis(10001);
        config.setTestOnBorrow(false);

        jedisPool = new JedisPool(config,"127.0.0.1",6379);
    }

    /**
     * 初始化切片池
     * */
    private void initialShardedPool() {
        // 池基本配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(5);
        config.setMaxWaitMillis(10001);
        config.setTestOnBorrow(false);

        // slave 链接
        List<JedisShardInfo> list = new ArrayList<JedisShardInfo>();
        JedisShardInfo jedisShardInfo = new JedisShardInfo("127.0.0.1",6379,"master");
        jedisShardInfo.setPassword("admin"); // shardedJedis 使用 JedisShardInfo 设置密码
        list.add(jedisShardInfo);
        // 构造池
        shardedJedisPool = new ShardedJedisPool(config,list);

    }

    public void show() {
        keyOperate();
        stringOperate();
        listOperate();
        setOperate();
        zsetOperate();
        hashOperate();
        jedisPool.returnResource(jedis);
        shardedJedisPool.returnResource(shardedJedis);
    }
    
    private void keyOperate() {
	 ...
    }
    
    private void stringOperate() {
	  ...  
    }

    private void listOperate() {
          ...
    }
    
    private void setOperate() {
	  ...
    }

    private void zsetOperate() {
	  ...
    }
	
    private void hashOperate() {
	  ...
    }
}

3、测试类

package redis;

/**
 * create by 1311230692@qq.com on 2018/8/29 13:48
 * redis 测试主类
 **/
public class Main {
    public static void main(String[] args) {
        new RedisClient().show();
    }
}

4、方法实现

4.1 key 功能

/**
 * key 操作
 * */
private void keyOperate() {
    System.out.println("---------- key ------------");
    // 清空数据
    System.out.println("清空库中所有的数据:" + jedis.flushDB());
    // 判断 key 是否存在
    System.out.println("判断 key001 是否存在:" + shardedJedis.exists("key001"));
    System.out.println("新增 key002,value002 键值对:" + shardedJedis.set("key002","value002"));
    System.out.println("判断 key002 是否存在:" + shardedJedis.exists("key002"));
    // 输出系统中所有的key
    System.out.println("新增 key003,value003 键值对:" + shardedJedis.set("key003","value003"));
    System.out.println("系统中所有的键值对如下:");
    Set<String> keys = jedis.keys("*");
    Iterator<String> iterator = keys.iterator();
    while (iterator.hasNext()) {
        String key = iterator.next();
        System.out.println(key);
    }
    // 删除某个 key,若 key不存在,则忽略该命令
    System.out.println("系统中删除 key002" + jedis.del("key002"));
    System.out.println("判断 key002 是否存在" + shardedJedis.exists("key002"));
    // 设置 key003 的过期时间
    System.out.println("设置 key003 过期时间为 5 秒:" + jedis.expire("key003",5));
    try {
        Thread.sleep(3000);
    } catch (InterruptedException i) {
        i.printStackTrace();
    }
    // 查看某个 key 的剩余生存时间,单位【秒】,永久生存或不存在的都返回 -1 -2 表示过期且已删除,>0 表示举例过期还有多少秒或毫秒
    System.out.println("查看 key003 的剩余生存时间:" + jedis.ttl("key003"));
    // 移除某个 key 的生存时间
    System.out.println("移除 key003 的生存时间:" + jedis.persist("key003"));
    System.out.println("查看 key003 的剩余生存时间:" + jedis.ttl("key003"));
    // 查看 key 所存储的值得类型
    System.out.println("查看 key 所存储的类型:" + jedis.type("key003"));
}

运行结果:

---------- key ------------
清空库中所有的数据:OK
判断 key001 是否存在:false
新增 key002,value002 键值对:OK
判断 key002 是否存在:true
新增 key003,value003 键值对:OK
系统中所有的键值对如下:
key003
key002
系统中删除 key0021
判断 key002 是否存在false
设置 key003 过期时间为 5 秒:1
查看 key003 的剩余生存时间:2
移除 key003 的生存时间:1
查看 key003 的剩余生存时间:-1
查看 key 所存储的类型:string

Process finished with exit code 0

4.2 String 功能

/**
 * String 功能
 * */
private void stringOperate() {
    System.out.println("----------- String_1 --------------");
    // 清空数据
    System.out.println("清空库中所有的数据:" + jedis.flushDB());

    System.out.println("------------- 新增 --------------");
    jedis.set("key001","value001");
    jedis.set("key002","value002");
    jedis.set("key003","value003");
    System.out.println("已新增的 3 个键值对如下:");
    System.out.println(jedis.get("key001"));
    System.out.println(jedis.get("key002"));
    System.out.println(jedis.get("key003"));
    System.out.println();

    System.out.println("-------------- 删除 -------------");
    System.out.println("删除 key003 键值对:" + jedis.del("key003"));
    System.out.println("查看 key003 键对应的值:" + jedis.get("key003"));
    System.out.println();

    System.out.println("------------- 修改 ------------");
    // 直接覆盖原来的数据
    System.out.println("直接覆盖 key001 原来的数据:" + jedis.set("key001","value001-update"));
    System.out.println("查看 key001 键对应的值:" + jedis.get("key001"));
    // 直接覆盖原来的数据
    System.out.println("在 key002 原来的值后面追加:" + jedis.append("key002","+appendStr"));
    System.out.println("查看 key002 键对应的值:" + jedis.get("key002"));
    System.out.println();

    System.out.println("-------------- 新增、删除、查找多个 ------------");
    System.out.println("一次性新增 key201,key202,key203,key204 及其对应值:" + jedis.mset("key201","value201",
            "key202","value202","key203","value203","key204","value204"));
    System.out.println("一次性获取 key201,key202,key203,key204 各自对应的值:"+
            jedis.mget("key201","key202","key203","key204"));
    System.out.println("一次性删除 key201,key202:" + jedis.del(new String[]{"key201", "key202"}));
    System.out.println("一次性获取 key201,key202,key203,key204 各自对应的值:" +
            jedis.mget("key201","key202","key203","key204"));
    System.out.println();

    System.out.println("-------------- String_2 ---------------");
    // 清空数据
    System.out.println("清空库中所有数据:" + jedis.flushDB());
    System.out.println("------------新增键值对时防止覆盖原先值-------------");
    System.out.println("原先 key301 不存在时,新增 key301:" + shardedJedis.setnx("key301", "value301"));
    System.out.println("原先 key302 不存在时,新增 key302:" + shardedJedis.setnx("key302", "value302"));
    System.out.println("当 key302 存在时,尝试新增 key302:" + shardedJedis.setnx("key302", "value302_new"));
    System.out.println("获取 key301 对应的值:" + shardedJedis.get("key301"));
    System.out.println("获取 key302 对应的值:" + shardedJedis.get("key302"));

    System.out.println("---------- 超出有效期键值对被删除 -----------");
    // 设置 key 的有效期,并存储数据
    System.out.println("新增 key303,并指定过期时间为 2 秒" + shardedJedis.setex("key303", 2, "key303-2second"));
    System.out.println("获取 key303 对应的值:" + shardedJedis.get("key303"));
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("3 秒之后,获取 key303 对应的值:" + shardedJedis.get("key303"));

    System.out.println("-------- 获取原值,更新新值一步完成 ----------");
    System.out.println("key302 原值:" + shardedJedis.getSet("key302", "value302-after-getset"));
    System.out.println("key302 新值:" + shardedJedis.get("key302"));

    System.out.println("--------- 获取子串 ---------");
    System.out.println("获取 key302 对应值中的子串:" + shardedJedis.getrange("key302", 5, 7));
}

运行结果:

----------- String_1 --------------
清空库中所有的数据:OK
------------- 新增 --------------
已新增的 3 个键值对如下:
value001
value002
value003

-------------- 删除 -------------
删除 key003 键值对:1
查看 key003 键对应的值:null

------------- 修改 ------------
直接覆盖 key001 原来的数据:OK
查看 key001 键对应的值:value001-update
在 key002 原来的值后面追加:18
查看 key002 键对应的值:value002+appendStr

-------------- 新增、删除、查找多个 ------------
一次性新增 key201,key202,key203,key204 及其对应值:OK
一次性获取 key201,key202,key203,key204 各自对应的值:[value201, value202, value203, value204]
一次性删除 key201,key202:2
一次性获取 key201,key202,key203,key204 各自对应的值:[null, null, value203, value204]

-------------- String_2 ---------------
清空库中所有数据:OK
------------新增键值对时防止覆盖原先值-------------
原先 key301 不存在时,新增 key301:1
原先 key302 不存在时,新增 key302:1
当 key302 存在时,尝试新增 key302:0
获取 key301 对应的值:value301
获取 key302 对应的值:value302
---------- 超出有效期键值对被删除 -----------
新增 key303,并指定过期时间为 2 秒OK
获取 key303 对应的值:key303-2second
3 秒之后,获取 key303 对应的值:null
-------- 获取原值,更新新值一步完成 ----------
key302 原值:value302
key302 新值:value302-after-getset
--------- 获取子串 ---------
获取 key302 对应值中的子串:302

Process finished with exit code 0

4.3 list 功能

/**
 * List 功能
 * */
private void listOperate() {
    System.out.println("----------- list -----------");
    // 清空数据
    System.out.println("清空所有数据:" + jedis.flushDB());
    System.out.println("-------- 新增 ----------");
    shardedJedis.lpush("stringlists", "vector");
    shardedJedis.lpush("stringlists", "ArrayList");
    shardedJedis.lpush("stringlists", "vector");
    shardedJedis.lpush("stringlists", "vector");
    shardedJedis.lpush("stringlists", "LinkedList");
    shardedJedis.lpush("stringlists", "MapList");
    shardedJedis.lpush("stringlists", "SerialList");
    shardedJedis.lpush("stringlists", "HashList");
    shardedJedis.lpush("numberlists", "3");
    shardedJedis.lpush("numberlists", "1");
    shardedJedis.lpush("numberlists", "5");
    shardedJedis.lpush("numberlists", "2");
    // start为元素下标,end也为元素下标;-1代表倒数一个元素,-2代表倒数第二个元素
    System.out.println("所有元素-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
    System.out.println("所有元素-numberlists:" + shardedJedis.lrange("numberlists", 0, -1));
    System.out.println();
    
    System.out.println("---------- 删除 ---------");
    // 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈
    System.out.println("成功删除指定元素个数-stringlists:" + shardedJedis.lrem("stringlists", 2, "vector"));
    System.out.println("删除指定元素之后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
    // 删除区间以外的数据
    System.out.println("删除下标 0-3 区间之外的元素:" + shardedJedis.ltrim("stringlists", 0, 3));
    System.out.println("删除指定区间之外元素后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
    // 列表元素出栈
    System.out.println("出栈元素:" + shardedJedis.lpop("stringlists"));
    System.out.println("元素出栈后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
    System.out.println();

    System.out.println("---------- 修改 -----------");
    // 修改列表中指定下标的值
    shardedJedis.lset("stringlists", 0, "hello list!");
    System.out.println("下标为 0 的值修改后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
    System.out.println();
    
    System.out.println("---------- 查找 -----------");
    // 数组长度
    System.out.println("长度-stringlists:" + shardedJedis.llen("stringlists"));
    System.out.println("长度-numberlists:" + shardedJedis.llen("numberlists"));

    // 排序
    /**
     * list中存字符串时必须指定参数为alpha,如果不使用SortingParams,而是直接使用sort("list"),
     * 会出现"ERR One or more scores can't be converted into double"
     * */
    SortingParams sortingParams = new SortingParams();
    sortingParams.alpha();
    sortingParams.limit(0, 3);
    System.out.println("返回排序后的结果-stringlists:" + shardedJedis.sort("stringlists", sortingParams));
    System.out.println("返回排序后的结果-numberlists:" + shardedJedis.sort("numberlists"));

    // 子串:  start为元素下标,end也为元素下标;-1代表倒数一个元素,-2代表倒数第二个元素
    System.out.println("子串-第二个开始到结束:" + shardedJedis.lrange("stringlists", 1, -1));
    // 获取指定下标的值
    System.out.println("获取下标为 2 的元素:" + shardedJedis.lindex("stringlists", 2)+"\n");
}

运行结果:

----------- list -----------
清空所有数据:OK
-------- 新增 ----------
所有元素-stringlists:[HashList, SerialList, MapList, LinkedList, vector, vector, ArrayList, vector]
所有元素-numberlists:[2, 5, 1, 3]

---------- 删除 ---------
成功删除指定元素个数-stringlists:2
删除指定元素之后-stringlists:[HashList, SerialList, MapList, LinkedList, ArrayList, vector]
删除下标 0-3 区间之外的元素:OK
删除指定区间之外元素后-stringlists:[HashList, SerialList, MapList, LinkedList]
出栈元素:HashList
元素出栈后-stringlists:[SerialList, MapList, LinkedList]

---------- 修改 -----------
下标为 0 的值修改后-stringlists:[hello list!, MapList, LinkedList]

---------- 查找 -----------
长度-stringlists:3
长度-numberlists:4
返回排序后的结果-stringlists:[LinkedList, MapList, hello list!]
返回排序后的结果-numberlists:[1, 2, 3, 5]
子串-第二个开始到结束:[MapList, LinkedList]
获取下标为 2 的元素:LinkedList


Process finished with exit code 0

4.4 set 功能

/**
 * set 功能
 * */
private void setOperate() {
    System.out.println("---------- set -----------");
    System.out.println("清空库中所有数据:" + jedis.flushDB());

    System.out.println("---------- 新增 -----------");
    System.out.println("向sets集合中加入元素 element001:" + jedis.sadd("sets", "element001"));
    System.out.println("向sets集合中加入元素 element002:" + jedis.sadd("sets", "element002"));
    System.out.println("向sets集合中加入元素 element003:" + jedis.sadd("sets", "element003"));
    System.out.println("向sets集合中加入元素 element004:" + jedis.sadd("sets", "element004"));
    System.out.println("查看sets集合中的所有元素:" + jedis.smembers("sets"));
    System.out.println();

    System.out.println("--------- 删除 -----------");
    System.out.println("集合 sets 中删除元素 element003:" + jedis.srem("sets", "element003"));
    System.out.println("查看 sets 集合中的所有元素:" + jedis.smembers("sets"));
    System.out.println();

    System.out.println("--------- 修改 ----------");
    System.out.println();

    System.out.println("---------- 查找 ----------");
    System.out.println("判断 element001 是否在集合 sets 中:"+jedis.sismember("sets", "element001"));
    System.out.println("循环查询获取 sets 中的每个元素:");
    Set<String> set = jedis.smembers("sets");
    Iterator<String> it = set.iterator();

    while (it.hasNext()) {
        Object obj = it.next();
        System.out.println(obj);
    }
    System.out.println();

    System.out.println("------- 集合运算 -------");
    System.out.println("sets1 中添加元素 element001:" + jedis.sadd("sets1", "element001"));
    System.out.println("sets1 中添加元素 element002:" + jedis.sadd("sets1", "element002"));
    System.out.println("sets1 中添加元素 element003:" + jedis.sadd("sets1", "element003"));
    System.out.println("sets2 中添加元素 element002:" + jedis.sadd("sets2", "element002"));
    System.out.println("sets2 中添加元素 element003:" + jedis.sadd("sets2", "element003"));
    System.out.println("sets2 中添加元素 element004:" + jedis.sadd("sets2", "element004"));
    System.out.println("查看 sets1 集合中的所有元素:" + jedis.smembers("sets1"));
    System.out.println("查看 sets2 集合中的所有元素:" + jedis.smembers("sets2"));
    System.out.println("sets1 和 sets2 交集:" + jedis.sinter("sets1", "sets2"));
    System.out.println("sets1 和 sets2 并集:" + jedis.sunion("sets1", "sets2"));
    System.out.println("sets1 和 sets2 差集:" + jedis.sdiff("sets1", "sets2"));//差集:set1中有,set2中没有的元素
}

运行结果:

---------- set -----------
清空库中所有数据:OK
---------- 新增 -----------
向sets集合中加入元素 element001:1
向sets集合中加入元素 element002:1
向sets集合中加入元素 element003:1
向sets集合中加入元素 element004:1
查看sets集合中的所有元素:[element004, element003, element001, element002]

--------- 删除 -----------
集合 sets 中删除元素 element003:1
查看 sets 集合中的所有元素:[element004, element001, element002]

--------- 修改 ----------

---------- 查找 ----------
判断 element001 是否在集合 sets 中:true
循环查询获取 sets 中的每个元素:
element004
element001
element002

------- 集合运算 -------
sets1 中添加元素 element001:1
sets1 中添加元素 element002:1
sets1 中添加元素 element003:1
sets2 中添加元素 element002:1
sets2 中添加元素 element003:1
sets2 中添加元素 element004:1
查看 sets1 集合中的所有元素:[element003, element001, element002]
查看 sets2 集合中的所有元素:[element004, element003, element002]
sets1 和 sets2 交集:[element003, element002]
sets1 和 sets2 并集:[element004, element001, element003, element002]
sets1 和 sets2 差集:[element001]

Process finished with exit code 0

4.5 zset 功能

/**
 * SortedSet 有序集合
 * */
private void zsetOperate() {
    System.out.println("--------- zset --------");
    // 清空数据
    System.out.println("清空库中所有数据:" + jedis.flushDB());

    System.out.println("-------- 新增 ----------");
    System.out.println("zset 中添加元素 element001:" + shardedJedis.zadd("zset", 7.0, "element001"));
    System.out.println("zset 中添加元素 element002:" + shardedJedis.zadd("zset", 8.0, "element002"));
    System.out.println("zset 中添加元素 element003:" + shardedJedis.zadd("zset", 2.0, "element003"));
    System.out.println("zset 中添加元素 element004:" + shardedJedis.zadd("zset", 3.0, "element004"));
    System.out.println("zset 集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1));//按照权重值排序
    System.out.println();

    System.out.println("-------- 删除 ----------");
    System.out.println("zset 中删除元素 element002:" + shardedJedis.zrem("zset", "element002"));
    System.out.println("zset 集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1));
    System.out.println();

    System.out.println("-------- 修改 ----------");
    System.out.println();

    System.out.println("-------- 查找 ----------");
    System.out.println("统计 zset 集合中的元素中个数:" + shardedJedis.zcard("zset"));
    System.out.println("统计 zset 集合中权重某个范围内(1.0——5.0),元素的个数:" + shardedJedis.zcount("zset", 1.0, 5.0));
    System.out.println("查看 zset 集合中element004的权重:" + shardedJedis.zscore("zset", "element004"));
    System.out.println("查看下标 1 到 2 范围内的元素值:" + shardedJedis.zrange("zset", 1, 2));
}

运行结果:

--------- zset --------
清空库中所有数据:OK
-------- 新增 ----------
zset 中添加元素 element001:1
zset 中添加元素 element002:1
zset 中添加元素 element003:1
zset 中添加元素 element004:1
zset 集合中的所有元素:[element003, element004, element001, element002]

-------- 删除 ----------
zset 中删除元素 element002:1
zset 集合中的所有元素:[element003, element004, element001]

-------- 修改 ----------

-------- 查找 ----------
统计 zset 集合中的元素中个数:3
统计 zset 集合中权重某个范围内(1.0——5.0),元素的个数:2
查看 zset 集合中element004的权重:3.0
查看下标 1 到 2 范围内的元素值:[element004, element001]

Process finished with exit code 0

4.6 hash 功能

/**
 * Hash 功能
 * */
private void hashOperate() {
    System.out.println("-------- hash --------");
    // 清空数据
    System.out.println("清空库中所有数据:" + jedis.flushDB());

    System.out.println("------- 新增 --------");
    System.out.println("hashs 中添加key001和value001键值对:" + shardedJedis.hset("hashs", "key001", "value001"));
    System.out.println("hashs 中添加key002和value002键值对:" + shardedJedis.hset("hashs", "key002", "value002"));
    System.out.println("hashs 中添加key003和value003键值对:" + shardedJedis.hset("hashs", "key003", "value003"));
    System.out.println("新增 key004 和 4 的整型键值对:" + shardedJedis.hincrBy("hashs", "key004", 4l));
    System.out.println("hashs 中的所有值:" + shardedJedis.hvals("hashs"));
    System.out.println();

    System.out.println("------- 删除 --------");
    System.out.println("hashs 中删除 key002 键值对:" + shardedJedis.hdel("hashs", "key002"));
    System.out.println("hashs 中的所有值:" + shardedJedis.hvals("hashs"));
    System.out.println();

    System.out.println("------- 修改 --------");
    System.out.println("key004 整型键值的值增加 100:" + shardedJedis.hincrBy("hashs", "key004", 100l));
    System.out.println("hashs 中的所有值:" + shardedJedis.hvals("hashs"));
    System.out.println();

    System.out.println("------- 查找 --------");
    System.out.println("判断 key003 是否存在:" + shardedJedis.hexists("hashs", "key003"));
    System.out.println("获取 key004 对应的值:" + shardedJedis.hget("hashs", "key004"));
    System.out.println("批量获取 key001 和 key003 对应的值:" + shardedJedis.hmget("hashs", "key001", "key003"));
    System.out.println("获取 hashs 中所有的 key:" + shardedJedis.hkeys("hashs"));
    System.out.println("获取 hashs 中所有的 value:" + shardedJedis.hvals("hashs"));
    System.out.println();
}

运行结果:

-------- hash --------
清空库中所有数据:OK
------- 新增 --------
hashs 中添加key001和value001键值对:1
hashs 中添加key002和value002键值对:1
hashs 中添加key003和value003键值对:1
新增 key004 和 4 的整型键值对:4
hashs 中的所有值:[value001, value002, value003, 4]

------- 删除 --------
hashs 中删除 key002 键值对:1
hashs 中的所有值:[value001, value003, 4]

------- 修改 --------
key004 整型键值的值增加 100:104
hashs 中的所有值:[value001, value003, 104]

------- 查找 --------
判断 key003 是否存在:true
获取 key004 对应的值:104
批量获取 key001 和 key003 对应的值:[value001, value003]
获取 hashs 中所有的 key:[key004, key003, key001]
获取 hashs 中所有的 value:[value001, value003, 104]


Process finished with exit code 0
作者明割
邮箱1311230692@qq.com

Github 项目地址https://github.com/tan0130/redis_test.git
原文转载自https://www.cnblogs.com/edisonfeng/p/3571870.html 非常感谢作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值