【Redis学习笔记05】Jedis客户端(中)

news2024/11/27 6:22:25

Jedis客户端

1. 命令

1.1 String类型

1.1.1 常见命令
  1. SET命令

语法:SET key value [EX seconds | PX milliseconds] [NX|XX]
说明:将string类型的value值设置到指定key中,如果之前该key存在,则会覆盖原先的值,原先数据类型以及TTL时长将会重置
时间复杂度:O(1)
选项:

  • EX:设置键的过期时间,以秒为单位
  • PX:设置键的过期时间,以毫秒为单位
  • NX:只有键存在时才进行设置,不存在则不设置
  • XX:只有键不存在时才进行设置,存在则不设置

返回值:

  • 如果设置成功,则返回OK
  • 如果一些选项参数例如NX、XX,条件不满足则不设置并返回nil
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 hello
OK
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379> set k2 world EX 20
OK
127.0.0.1:6379> TTL k2
(integer) 15
127.0.0.1:6379> set k3 value3 PX 20000
OK
127.0.0.1:6379> TTL k3
(integer) 15
127.0.0.1:6379> set k1 hello2 NX
(nil)
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379> set k5 value5 XX
(nil)
127.0.0.1:6379> get k5
(nil)
127.0.0.1:6379> set k1 hello2 XX
OK
127.0.0.1:6379> get k1
"hello2"
  1. GET命令

语法:GET key
说明:返回指定key对应的value,如果key不存在则返回nil,如果key对应的value的不为string类型则报错
时间复杂度:O(1)
返回值:

  • 如果key存在并且value为string类型则返回value值,如果不为string类型则报错
  • 如果key不存在则返回nil
127.0.0.1:6379> SET k1 v1
OK
127.0.0.1:6379> GET k1
"v1"
127.0.0.1:6379> GET k2
(nil)
127.0.0.1:6379> LPUSH k3 11 22 33
(integer) 3
127.0.0.1:6379> get k3
(error) WRONGTYPE Operation against a key holding the wrong kind of value
  1. MGET命令

语法:MGET key [key...]
说明:一次性获取多个key对应的value,如果value不为string类型或者key不存在则返回nil
时间复杂度:O(K),K为key的个数
返回值:对应value的列表

127.0.0.1:6379> SET k1 v1
OK
127.0.0.1:6379> SET k2 v2
OK
127.0.0.1:6379> LPUSH k3 11 22 33
(integer) 3
127.0.0.1:6379> MGET k1 k2
1) "v1"
2) "v2"
127.0.0.1:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) (nil)
127.0.0.1:6379> MGET k1 k2 k4
1) "v1"
2) "v2"
3) (nil)
  1. MSET命令

语法:MSET key value [key value...]
说明:一次性设置多个key值
时间复杂度:O(K),K为key的个数
返回值:永远为OK

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> MSET k1 v1 k2 v2
OK

为什么已经存在SET、GET命令还是需要MSET、MGET命令呢?这是因为Redis是一个客户端-服务器程序,需要经过网络通信跨主机传输数据,一次性批量传输数据效率大于多次网络通信传输效率!!!

1.1.2 计数命令
  1. INCR命令

语法:INCR key
说明:给key的整型value值+1,如果key不存在则默认初始值为0,如果不是int类型或者数值范围超过64位有符号整型则报错
时间复杂度:O(1)
返回值:

  • 返回integer类型的加完后的数值
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 10
OK
127.0.0.1:6379> INCR k1
(integer) 11
127.0.0.1:6379> INCR k2
(integer) 1
127.0.0.1:6379> GET k2
"1"
127.0.0.1:6379> set k2 abab
OK

1.2 List类型

List类型就类似于Java当中的顺序表以及链表,更准确的来说是一个"Deque"双端队列,可以快速对其两端元素进行操作,其数据结构大致表示如下:

List类型的特点如下:

  • 元素顺序有序(元素的摆放位置是十分重要的)
  • 元素可以重复
  • 元素下标可以为负数,下标为i的位置也可以使用i - len进行表示
1.2.1 常用命令
  1. LPUSH命令:

语法格式:LPUSH key element [element...]
说明:向某个key左端插入一个或多个元素
时间复杂度:O(K),K为插入的元素个数
返回值:插入后list的长度

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> LPUSH k1 11 22 33
(integer) 3
127.0.0.1:6379> LRANGE k1 0 -1
1) "33"
2) "22"
3) "11"
  1. LPUSHX命令:

语法格式:LPUSHX key element [element...]
说明:向某个key左端插入一个或者多个元素(要求key必须存在)
时间复杂度:O(K),K为插入的元素个数
返回值:插入后list的长度

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> LPUSHX k1 44
(integer) 4
127.0.0.1:6379> LRANGE k1 0 -1
1) "44"
2) "33"
3) "22"
4) "11"
127.0.0.1:6379> LPUSHX k2 33 22 11
(integer) 0
127.0.0.1:6379> keys *
1) "k1"
  1. RPUSH命令:

语法格式:RPUSH key element [element...]
说明:向某个key右端插入一个或者多个元素
时间复杂度:O(K),K为插入的元素个数
返回值:插入后list的长度

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> RPUSH k1 11 22 33
(integer) 3
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
  1. RPUSHX命令:

语法格式:RPUSHX key element [element...]
说明:向某个key右端插入一个或者多个元素(要求key必须存在)
时间复杂度:O(K),K为插入的元素个数
返回值:插入后list的长度

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> RPUSHX k1 44 55 66
(integer) 6
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
4) "44"
5) "55"
6) "66"
127.0.0.1:6379> RPUSHX k2 11 22 33
(integer) 0
127.0.0.1:6379> KEYS *
1) "k1"
  1. LRANGE命令:

语法格式:LRANGE key start end
说明:获取区间[start, end]内的元素,区间左闭右闭,支持负数下标
时间复杂度:O(N)
返回值:区间[start, end]内的元素列表

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> LPUSH k1 11 22 33
(integer) 3
127.0.0.1:6379> LRANGE k1 0 2
1) "33"
2) "22"
3) "11"
127.0.0.1:6379> LRANGE k1 0 -1
1) "33"
2) "22"
3) "11"
  1. LPOP命令:

语法格式:LPOP key [count]
说明:从list的左端取出元素(即头删)无元素则返回nil,若指定count则删除count个元素
时间复杂度:O(count)
返回值:元素值或者nil

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> LRANGE k1 0 -1
1) "33"
2) "22"
3) "11"
127.0.0.1:6379> LPOP k1 
"33"
127.0.0.1:6379> LRANGE k1 0 -1
1) "22"
2) "11"
127.0.0.1:6379> LPOP k1 2
1) "22"
2) "11"
127.0.0.1:6379> LRANGE k1 0 -1
(empty array)
127.0.0.1:6379> LPOP k1
(nil)
  1. RPOP命令:

语法格式:RPOP key [count]
说明:从list的右端取出元素(即尾删)无元素则返回nil,若指定count则删除count个元素
时间复杂度:O(count)
返回值:元素值或者nil

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> RPUSH k1 11 22 33
(integer) 3
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> RPOP k1
"33"
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
127.0.0.1:6379> RPOP k1 2
1) "22"
2) "11"
127.0.0.1:6379> LRANGE k1 0 -1
(empty array)
127.0.0.1:6379> RPOP k1
(nil)
  1. LINDEX命令:

语法格式:LINDEX key index
说明:返回list下标位置为index的元素(不删除),如果位置不合法就返回nil
时间复杂度:O(N)
返回值:元素值或者nil

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> RPUSH k1 11 22 33
(integer) 3
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> LINDEX k1 0
"11"
127.0.0.1:6379> LINDEX k1 -1
"33"
127.0.0.1:6379> LINDEX k1 10
(nil)
  1. LINSERT命令:

语法格式:LINSERT key <BRFORE | AFTER> pivot element
说明:向某个指定元素(pivot)前或者后插入元素element,如果有多个pivot则选择从左往右的第一个
时间复杂度:O(N)
返回值:插入后的list长度

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> LINSERT k1 AFTER 22 11
(integer) 4
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "11"
4) "33"
127.0.0.1:6379> LINSERT k1 before 11 100
(integer) 5
127.0.0.1:6379> LRANGE k1 0 -1
1) "100"
2) "11"
3) "22"
4) "11"
5) "33"
  1. LLEN命令:

语法格式:LLEN key
说明:返回某个list的长度
时间复杂度:O(1)
返回值:长度

127.0.0.1:6379> RPUSH k1 11 22 33 44
(integer) 4
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
4) "44"
127.0.0.1:6379> LLEN k1
(integer) 4
  1. LREM命令:

语法格式:LREM key count element
说明:

  • 如果count = 0那么就删除全部的element
    • 如果count < 0则从左往右删除count个element
  • 如果count > 0则从右往左删除count个element

时间复杂度:O(N)
返回值:删除元素的个数

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> RPUSH k1 11 22 33 11 22 33 22
(integer) 7
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
4) "11"
5) "22"
6) "33"
7) "22"
127.0.0.1:6379> LREM k1 22 -2
(integer) 0
127.0.0.1:6379> LREM k1 -2 22
(integer) 2
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "33"
4) "11"
5) "33"
127.0.0.1:6379> LREM k1 1 33
(integer) 1
127.0.0.1:6379> LRANGE k1 0 -1
1) "11"
2) "22"
3) "11"
4) "33"
127.0.0.1:6379> LREM k1 0 11
(integer) 2
127.0.0.1:6379> LRANGE k1 0 -1
1) "22"
2) "33"

1.3 Set类型

1.3.1 基本命令
  1. sadd命令:

语法格式:SADD key member [member...]
说明:向指定key的set中存储一个或多个元素,如果重复则忽略加入
时间复杂度:O(N),N为插入member元素的个数
返回值:插入成功的元素个数

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 11 22 33
(integer) 3
127.0.0.1:6379> SADD k1 11 44 55
(integer) 2
127.0.0.1:6379> SMEMBERS k1
1) "11"
2) "22"
3) "33"
4) "44"
5) "55"
  1. SMEMBERS命令:

语法格式:SMEMBERS key
说明:返回指定key的set中全部元素
时间复杂度:O(N),N为set内元素个数
返回值:set全部元素列表

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SMEMBERS k1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
  1. SISMEMBER命令:

语法格式:SISMEMBER key member
说明:判断member元素是否在key这个set内部
时间复杂度:O(1)
返回值:

  • 1:表示member在set内部
  • 0:表示member不在set内部
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> TYPE k1
set
127.0.0.1:6379> SMEMBERS k1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SISMEMBER k1 2
(integer) 1
127.0.0.1:6379> SISMENBER k1 100
(integer) 0
  1. SRANDMEMBER命令:

语法格式:SRANDMEMBER key [count]
说明:返回指定key的set中随机一个或多个元素,count默认为1,正数与负数的含义不一样
时间复杂度:O(1) / O(N),如果不设置count,则为O(1),否则取决于count
返回值:

  • 当count为正数时,返回元素列表是不重复的,此时返回列表长度 = Math.min(SCARD, count),即当count >= SCARD时返回数据全集
  • 当count为负数时,返回元素列表是可以重复的,此时返回 |count| 个随机元素组成的列表
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SRANDMEMBER k1 2
1) "2"
2) "4"
127.0.0.1:6379> SRANDMEMBER k1 7
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SRANDMEMBER k1 -7
1) "4"
2) "3"
3) "3"
4) "4"
5) "1"
6) "3"
7) "5"
  1. SPOP命令:

语法格式:SPOP key [count]
说明:随机删除指定key的set中一个或多个元素并返回
时间复杂度:O(1) / O(count)
返回值:

  • 如果key不存在则返回nil
  • 如果不指定count则默认返回一个随机元素
  • 如果指定count则返回多个随机元素组成的列表
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> SMEMBERS k1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SPOP k1
"3"
127.0.0.1:6379> SMEMBERS k1
1) "1"
2) "2"
3) "4"
4) "5"
127.0.0.1:6379> SPOP k1 3
1) "4"
2) "5"
3) "2"
127.0.0.1:6379> SMEMBERS k1
1) "1"
127.0.0.1:6379> SPOP k1
"1"
127.0.0.1:6379> SPOP k1
(nil)
  1. SCARD命令:

语法格式:SCARD key
说明:返回set内部存储的元素个数
时间复杂度:O(1)
返回值:set内部存储的元素个数

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SCARD k1
(integer) 5
127.0.0.1:6379> SPOP k1 2
1) "1"
2) "4"
127.0.0.1:6379> SCARD k1
(integer) 3
127.0.0.1:6379> SPOP k1 4
1) "2"
2) "3"
3) "5"
127.0.0.1:6379> SCARD k1
(integer) 0
  1. SREM命令:

语法格式:SREM key member [member...]
说明:从set中删除一个或多个指定元素,如果元素在set中不存在则返回忽略
时间复杂度:O(N),N为删除元素的个数
返回值:删除成功的元素个数

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SREM k1 1 2 3 6
(integer) 3
127.0.0.1:6379> SMEMBERS k1
1) "4"
2) "5"
  1. SMOVE命令:

语法格式:SMOVE source destination member
说明:将member从source移除并插入到destination中
时间复杂度:O(1)
返回值:

  • 如果source中不存在则返回0
  • 如果source中存在,就执行从source中删除并插入到desitination中,并返回1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SMEMBERS k1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SADD k2 2 3 4 5 6
(integer) 5
127.0.0.1:6379> SMEMBERS k2
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
127.0.0.1:6379> SMOVE k1 k2 2
(integer) 1
127.0.0.1:6379> SMEMBERS k1
1) "1"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> SMEMBERS k2
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
1.3.2 集合间命令
  1. SINTER命令:

语法格式:SINTER key [key...]
说明:取出多个集合间的交集
时间复杂度:O(M * N),其中M是最小集合的长度,N是最大集合的长度
返回值:多个集合间交集组成的列表

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SADD k2 4 5 6 7 8
(integer) 5
127.0.0.1:6379> SINTER k1 k2
1) "4"
2) "5"
  1. SUNION命令:

语法格式:SUNION key [key...]
说明:取出多个集合间的并集
时间复杂度:O(N),N为全集元素个数
返回值:多个集合间并集运算结果列表

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SADD k2 4 5 6 7 8
(integer) 5
127.0.0.1:6379> SUNION k1 k2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
  1. SDIFF命令:

语法格式:SDIFF key [key...]
说明:取出多个集合间差集运算结果
时间复杂度:O(N),N为全集元素个数
返回值:多个集合间差集运算结果列表

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> SMEMBERS k1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SMEMBERS k2
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
127.0.0.1:6379> SDIFF k1 k2
1) "1"
2) "2"
3) 

2. Java客户端操作redis

2.1 测试string类型

redis中string类型常见的命令有:set、get、mset、mget、getrange、setrange、append、incr、incrby、decr、decrby、incrbyfloat…
下面我们简单介绍一些命令如何使用Jedis客户端调用:

  1. 测试SET、GET命令:
/**
 * 测试string类型
 * @author 米饭好好吃
 */
public class TestString {
    private JedisPool pool;

    @Before
    public void init() {
        pool = new JedisPool("tcp://127.0.0.1:8888");
    }

    /**
     * 测试SET、GET命令
     */
    @Test
    public void testSETAndGET() {
        // 1. 获取jedis连接对象
        try(Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试SET、GET方法
            jedis.set("k1", "111");
            String res = jedis.get("k1");
            System.out.println("k1: " + res);
        }
    }
}

  1. 测试MSET、MGET方法:
 /**
     * 测试MSET、MGET命令
     */
    @Test
    public void testMSETAndMGET() {
        // 1. 获取Jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
//            jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试MSET、MGET命令
            jedis.mset("k1", "111", "k2", "222", "k3", "333");
            List<String> list = jedis.mget("k1", "k2", "k3");
            System.out.println(list);
        }
    }

:::success
注意:此处MSET的参数列表也是一个可变参数,格式为key1, value1, key2, value2…,MGET可以同时获取多个key对应的value,返回值为List类型
:::

  1. 测试SETRANGE、GETRANGE命令:
   /**
     * 测试SETRANGE以及GETRANGE命令
     */
    @Test
    public void testSETRANGEAndGETRANGE() {
        // 1. 获取jedis连接对象
        try(Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试SETRANGE、GETRANGE命令
            jedis.set("key", "hello world");
            jedis.setrange("key", 6, "ricejson");
            String rangeStr = jedis.getrange("key", 0, 4);
            System.out.println("rangeStr: " + rangeStr);
            String totalStr = jedis.getrange("key", 0, -1);
            System.out.println("totalStr: " + totalStr);
        }
    }
  1. 测试APPEND命令:
    /**
     * 测试APPEND命令
     */
    @Test
    public void testAPPEND() {
        // 1. 获取Jedis连接对象
        try(Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试APPEND命令
            jedis.set("k1", "hello");
            jedis.append("k1", "world");
            String str = jedis.get("k1");
            System.out.println("k1: " + str);
        }
    }
  1. 测试INCR、INCRBY命令:
    /**
     * 测试INCR以及INCRBY命令
     */
    @Test
    public void testINCRAndINCRBY() {
        // 1. 获取jedis连接对象
        try(Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试INCR、INCRBY命令
            jedis.set("k1", "10");
            long ret = jedis.incr("k1");
            String res = jedis.get("k1");
            System.out.println("ret: " + ret);
            System.out.println("res: " + res);
            ret = jedis.incrBy("k1", 10);
            res = jedis.get("k1");
            System.out.println("ret: " + ret);
            System.out.println("res: " + res);
        }
    }

2.2 测试List类型

redis中List类型常见的命令有:lpush、rpush、lpushx、rpushx、lpop、rpop、blpop、brpop、lrange、lindex、lrem、llen…
下面我们简单介绍一些命令如何使用Jedis客户端调用:

  1. 测试LPUSH、LRANGE命令:
  /**
     * 测试LPUSH以及LRANGE命令
     */
    @Test
    public void testLPUSHAndLRANGE() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试LPUSH以及LRANGE命令
            jedis.lpush("k1", "11", "22", "33");
            List<String> lRangeList = jedis.lrange("k1", 0, -1);
            System.out.println(lRangeList);
        }
    }

:::success
注意:LPUSH是头插,方法参数列表为可变参数,上述代码最后结果是[33, 22, 11],LRANGE返回指定区间[0, -1]所有元素,返回值为List类型
:::

  1. 测试LPOP、BLPOP命令:
    /**
     * 测试LPOP以及BLPOP命令
     */
    @Test
    public void testLPOPAndBLPOP() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试LPOP命令
            jedis.lpush("k1", "11");
            String popVal = jedis.lpop("k1");
            System.out.println("popVal: " + popVal);
            // 4. 测试BLPOP命令
            List<String> blpop = jedis.blpop(10, "k1");
            System.out.println("key: " + blpop.get(0) + ", val: " + blpop.get(1));
        }
    }

:::danger
注意:LPOP直接返回List头部元素,而BLPOP会阻塞指定时长(timeout),如果监听的一组key中有值则返回list结构(该结构是一个二元组,第一个元素是取得元素所在的key,第二个元素是取得元素值),如果超过时限timeout还没有获取元素,则返回null
:::

  1. 测试LLEN、LINDEX命令:
    /**
     * 测试LLEN以及LINDEX命令
     */
    @Test
    public void testLLENAndLINDEX() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试LLEN命令
            jedis.lpush("k1", "11", "22", "33");
            long len = jedis.llen("k1");
            System.out.println("len: " + len);
            // 4. 测试LINDEX命令
            String midVal = jedis.lindex("k1", 1);
            System.out.println("mid: " + midVal);
        }
    }
  1. 测试LREM命令:
    /**
     * 测试LREM命令
     */
    @Test
    public void testLREM() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试LREM命令
            jedis.lpush("k1", "11", "22", "11", "11");
            jedis.lrem("k1", -2, "11");
            List<String> list = jedis.lrange("k1", 0, -1);
            System.out.println(list);
        }
    }

:::danger
注意:LREM命令其中参数count指定删除方式,如果为0表示删除所有,负数表示从右往左删除|count|个value,正数表示从左往右删除|count|个value
:::

2.3 测试Set类型

对于Redis中的Set类型,常见的命令有:sadd、smembers、sismember、srandmember、spop、srem、scard、sinter、sunion、sdiff…
下面我们简单介绍一些命令如何使用Jedis客户端调用:

  1. 测试SADD、SMEMBERS命令:
    /**
     * 测试SADD以及SMEMBERS命令
     */
    @Test
    public void testSADDAndSMEMBERS() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试SADD命令
            jedis.sadd("k1", "11", "22", "11");
            // 4. 测试SMEMBERS命令
            Set<String> smembers = jedis.smembers("k1");
            System.out.println(smembers);
        }
    }

注意:SMEMBERS命令返回类型为Set,因为Redis中的Set类型要求元素不重复、无序,与Java中的Set类型匹配

  1. 测试SISMEMBER、SPOP命令:
    /**
     * 测试SISMEMBER以及SPOP命令
     */
    @Test
    public void testSISMEMBERAndSPOP() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试SISMEMBER命令
            jedis.sadd("k1", "11", "22", "33");
            boolean res = jedis.sismember("k1", "11");
            System.out.println("11 exists: " + res);
            res = jedis.sismember("k1", "44");
            System.out.println("44 exists: " + res);
            // 4. 测试SPOP命令
            String popValue = jedis.spop("k1");
            System.out.println("popVal: " + popValue);
        }

    }
  1. 测试SREM、SCARD命令:
    /**
     * 测试SREM以及SCARD命令
     */
    @Test
    public void testSREMAndSCARD() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试SCARD命令
            jedis.sadd("k1", "11", "22", "33");
            long size = jedis.scard("k1");
            System.out.println("size: " + size);
            // 4. 测试SREM命令
            jedis.srem("k1", "11");
            size = jedis.scard("k1");
            System.out.println("size: " + size);
        }
    }
  1. 测试SINTER、SINTERSTORE命令:
    /**
     * 测试SINTER以及SINTERSTORE命令
     */
    @Test
    public void testSINTERAndSINTERSTORE() {
        // 1. 获取jedis连接对象
        try (Jedis jedis = pool.getResource();) {
            // 设置密码(如果有的话)
            // jedis.auth("xxxxxx");
            // 2. 清空数据库
            jedis.flushDB();
            // 3. 测试SINTER命令
            jedis.sadd("k1", "11", "22", "33");
            jedis.sadd("k2", "22", "33", "44");
            Set<String> interSet = jedis.sinter("k1", "k2");
            System.out.println("interSet: " + interSet);
            // 4. 测试SINTERSTORE命令
            jedis.sinterstore("k3", "k1", "k2");
            Set<String> k3 = jedis.smembers("k3");
            System.out.println("k3: " + k3);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1805309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有什么借助伦敦金行情软件才能做的技术分析方法吗?

现在伦敦金交易都可以在网上去完成&#xff0c;这样我们就必须借助伦敦金行情软件。由于科学技术的发展&#xff0c;现在的伦敦金行情软件不光提供交易买卖的功能&#xff0c;它还有图表分析、时间周期选择等等各种各样的功能&#xff0c;这样丰富了我们的分析手段。那么下面我…

qt4-qt5 升级(2)-GUI-UTF-8-GBK-QTextCode-字符集乱码

MFC与QT的消息机制的区别_qt信号槽机制与mfc的消息映射机制的区别-CSDN博客 1.QT4-QT5差别 kits构建 控件&#xff0c;信号与槽 ui修改好后点击编译会自动生成 ui_XXX.h 聚合的关系&#xff0c;不是拥有的关系。 QWidget 和QWindow有什么差别&#xff1f; 2.VS2019-QT5 构建…

Xsens动作捕捉系统:角色动画制作与运动分析领域的先进工具

随着传感器技术的不断进步&#xff0c;动作捕捉技术现在更加趋向于民用化&#xff0c;拥有价格优势的惯性动作捕捉系统现在更多的出现在独立动画工作室与国内外多所高校的实际项目应用中。 凭借无场地限制、价格优惠、校准使用方便、数据采集精确等多项优势&#xff0c;Xsens惯…

KEIL5如何打开KEIL4的GD工程

GD官方提供的很多KEIL例程为KIEL4的版本&#xff0c;读者使用的时候可能会碰到使用KEIL5打开KEIL4的工程会报错以及无法找到芯片选型的问题&#xff0c;具体表现如下图所示。 我们该怎么办呢&#xff1f; 下面为大家介绍两种方法&#xff1a; 第一种方法是在keil4的工程后缀u…

数据结构---树与二叉树

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

数据结构笔记 3 串 数组 广义表

以下了解即可&#xff0c;暂时没发现有什么考点 参考&#xff1a; 【数据结构】——多维数组和广义表_数据结构loc-CSDN博客 相对应的题目&#xff1a; 他这个数组不是从0开始的&#xff0c;是从1开始的&#xff0c;所以为了配合公式要减1 下面这道题又不一样&#xff0c;它是…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好&#xff0c;牢饭少不了&#xff01;&#xff01;&#xff01; 原理&#xff1a; 模拟WiFi的已连接设备&#xff0c;强制让其下线重连&#xff0c;获取其握手包&#xff0c;使用密码字典&#xff08;宝丽&#xff09;婆洁。 环境&#xff08;准备工作&#xff09;&a…

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标&#xff1a; 学习嵌入式实时操作系统&#xff08;RTOS&#xf…

【Tool】Matlab 数据分析可视化

一、问题描述 近期围绕imu总是出现问题&#xff0c;自己整理了一下将数据可视化的工具 二、imu 类 1. 待处理数据格式 # yaw roll pitch time -2.08131 -0.0741765 0.0200713 121.281000000 -2.08724 -0.0745256 0.0197222 121.301000000 -2.093 -0.075747…

引入Springcloud--Sleuth-链路追踪中MDC是如何获取到traceid和何时放入traceid的

在分布式项目中需要引入 spring-cloud-starter-sleuth框架来记录跟踪请求在不同服务之前流转的路径。在整个流转路径通过traceid将所有的路径给串联起来。 项目中需要保存traceid来实现日志快速搜索和定位&#xff0c;可以通过MDC.get("traceId")获取到traceId。 …

统计信号处理基础 习题解答10-9

题目 某质检员的工作是监控制造出来的电阻阻值。为此他从一批电阻中选取一个并用一个欧姆表来测量它。他知道欧姆表质量较差&#xff0c;它给测量带来了误差&#xff0c;这个误差可以看成是一个的随机变量。为此&#xff0c;质检员取N个独立的测量。另外&#xff0c;他知道阻值…

gRPC(狂神说)

gRPC&#xff08;狂神说&#xff09; 视频地址&#xff1a;【狂神说】gRPC最新超详细版教程通俗易懂 | Go语言全栈教程_哔哩哔哩_bilibili 1、gRPC介绍 单体架构 一旦某个服务宕机&#xff0c;会引起整个应用不可用&#xff0c;隔离性差只能整体应用进行伸缩&#xff0c;浪…

基于小波多分辨分析的一维时间序列信号趋势检测与去除(MATLAB R2018a)

小波最开始是数学上提出的概念&#xff0c;并且在纯数学的王国里存在了一个世纪之久。最开始是为了弥补傅里叶分析的缺陷&#xff0c;即傅里叶级数发散的问题&#xff0c;并寻找出能够代替傅里叶分析的方法。从最早的一些艰难的探索开始直到慢慢发展成为一套完整系统的小波分析…

Flutter Image源码分析

本文用于记录分析Imge图片加载流程源码分析学习笔记 切入点是Image.network,加载网络图片 构造方法会创建NetworkImage,加载图片的实现类,父类是ImageProvider 加载本地图片等等都是类似 下面进入_ImageState类 void resolveStreamForKey(ImageConfiguration configurat…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第37课-自动切换纹理

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第37课-自动切换纹理 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

【iOS】JSONModel源码阅读笔记

文章目录 前言一、JSONModel使用二、JSONModel其他方法转换属性名称 三、源码分析- (instancetype)initWithDictionary:(NSDictionary*)dict error:(NSError **)err[self init]__setup____inspectProperties - (BOOL)__doesDictionary:(NSDictionary*)dict matchModelWithKeyMa…

Day25 首页待办事项及备忘录添加功能

​ 本章节,完成首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 在 AddMemoViewModel逻辑处理类中,为了支持与其关联的View视图文件的数据绑定,需要定义一个与视图文件相匹配的实体类 Model。这个Model将包含 View中…

Java开发-面试题-0005-==和String的equals()和String的intern()方法的区别

Java开发-面试题-0005-和String的equals()和String的intern()方法的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术…

算法:101. 对称二叉树

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中节…

蓝桥杯--跑步计划

问题描述 小蓝计划在某天的日期中出现 11 时跑 55 千米&#xff0c;否则只跑 11 千米。注意日期中出现 11 不仅指年月日也指星期。 请问按照小蓝的计划&#xff0c;20232023 年小蓝总共会跑步锻炼多少千米?例如&#xff0c;55 月 11 日、11 月 1313 日、1111 月 55 日、44 月…