【Redis学习笔记05】Jedis客户端(string、list、set)

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);
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis二级缓存开启条件

MyBatis缓存为俩层体系。分为一级缓存和二级缓存。 一级缓存&#xff1a; 一级缓存默认开启&#xff0c;一级缓存的作用域是SqlSession级别的&#xff0c;这意味着当你更换SqlSession之后就不能再利用原来的SqlSession的一级缓存了。不同的SqlSession之间的一级缓存是隔离的。…

如何确保redis缓存中的数据与数据库一致

一、双写模式&#xff1a; 在写入数据库时&#xff0c;也写入缓存。 二&#xff1a;失效模式&#xff1a; 在写入新数据后&#xff0c;删除缓存中数据&#xff0c;下次请求时查询数据库&#xff0c;并把查到的最新数据写入缓存。 不管是双写模式还是失效模式&#xff0c;缓…

网页中生成ZIP文件,Zip 压缩、解压技术在 HTML5 浏览器中的应用

JSZip 是一款可以创建、读取、修改 .zip 文件的 javaScript 工具。在 web 应用中&#xff0c;免不了需要从 web 服务器中获取资源&#xff0c;如果可以将所有的资源都合并到一个 .zip 文件中&#xff0c;这时候只需要做一次请求&#xff0c;这样既减少了服务器的压力&#xff0…

每日题库:Huawe数通HCIA——15(30道)

注&#xff1a;由于限制原因&#xff0c;今后资料仅提供给粉丝 所有资料均来源自网络&#xff0c;但个人亲测有效&#xff0c;特来分享&#xff0c;希望各位能拿到好成绩&#xff01; PS&#xff1a;别忘了一件三连哈&#xff01; 今日题库&#xff1a; 231. 如下图所示的网…

OceanBase 4.3 特性解析:列存技术

在涉及大规模数据的复杂分析或即时查询时&#xff0c;列式存储是支撑业务负载的关键技术之一。相较于传统的行式存储&#xff0c;列式存储采用了不同的数据文件组织方式&#xff0c;它将表中的数据以列为单位进行物理排列。这种存储模式允许在分析过程中&#xff0c;查询计算仅…

Vitis HLS 学习笔记--接口存储器布局模型

目录 1. 简介 2. 详解 2.1 数据对齐 2.2 数据结构填充 3. 总结 1. 简介 软件开发者写的程序会在 CPU 处理器上运行&#xff0c;而硬件开发者设计的“内核”则会在 FPGA 上运行。这两部分需要通过一个精心设计的接口来沟通&#xff0c;就像两个人用对讲机来交流一样。为了…

GDPU unity游戏开发 寻路与导航

学会寻路&#xff0c;出门在外&#xff0c;身份不是他给的&#xff0c;他做不了你一直的导航。 角色寻路 角色控制器替换为普通的角色控制器&#xff0c;给实验九的地形增加NavMesh Surface组件&#xff0c;然后给角色增加NavMesh Agent组件&#xff0c;并选择合适的参数。通过…

mac安装brew遇到的一些问题

mac终端执行命令/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”&#xff0c;无法建立连接或连接超时错误&#xff0c;错误信息如下&#xff1a; curl: (28) Failed to connect to raw.githubusercontent.com port 443 af…

高性能MySQL(第3版)电子书笔记

Mysql官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/ 高性能MySQL&#xff08;第3版&#xff09;&#xff1a;百度网盘&#xff0c;基于Mysql5.1和Mysql5.5 本机版本 mysql> select version(); ------------ | version() | ------------ | 5.7.32-log |…

Numba 的 CUDA 示例(4/4):原子和互斥

本教程为 Numba CUDA 示例 第 4 部分。 本系列第 4 部分总结了使用 Python 从头开始学习 CUDA 编程的旅程 介绍 在本系列的前三部分&#xff08;第 1 部分&#xff0c;第 2 部分&#xff0c;第 3 部分&#xff09;中&#xff0c;我们介绍了 CUDA 开发的大部分基础知识&#xf…

第十一届蓝桥杯C++青少年组中/高级组国赛2020年10月真题解析

一、单选题 第1题 在数组中&#xff0c;数组名表示&#xff08; &#xff09;. A:数组第1个元素的首地址 B:数组第2个元素的首地址 C:数组所有元素的首地址&#xff0c; D:数组最后1个元素的首地址 答案&#xff1a;A 数组名是一个地址&#xff0c;指向第一个元素 第2题 …

locale本地化库学习

std::locale 类型的对象&#xff08;本地环境对象&#xff09;是不可变刻面的一个不可变索引集。C 输入/输出库的每个流对象都与一个 std::locale 对象关联&#xff0c;并用它的各刻面来分析及格式化所有数据。另外&#xff0c;每个 std::basic_regex 对象也都与一个本地环境对…

如何用群晖当异地组网服务器?

在当今信息化时代&#xff0c;远程通信成为了企业和个人之间不可或缺的一部分。特别是对于跨地区的通信需求&#xff0c;一个可靠的异地组网服务器是必不可少的。而群晖&#xff08;Synology&#xff09;作为一款功能强大的网络存储设备&#xff0c;可以被用作办公室或家庭的异…

【小白专用24.6.8】C#Lambda表达式

Lambda表达式可以采用以下任意一种形式的表达式&#xff1a; 1.表达式Lambda&#xff0c;表达式为其主体&#xff1a; (input-parameters) > expression 1 2.语句Lambda&#xff0c;语句块作为其主体&#xff1a; (input-parameters) > {<sequence-of-statements>…

★pwn 24.04环境搭建保姆级教程★

★pwn 24.04环境搭建保姆级教程★ &#x1f338;前言&#x1f33a;Ubuntu 24.04虚拟机&#x1f337;VM&#x1f337;Ubuntu 24.04镜像 &#x1f33a;工具&#x1f337;可能出现的git clone错误&#x1f337;复制粘贴问题&#x1f337;攻击&#x1f337;编题 &#x1f33a;美化&…

C++的STL 中 set.map multiset.multimap 学习使用详细讲解(含配套OJ题练习使用详细解答)

目录 一、set 1.set的介绍 2.set的使用 2.1 set的模板参数列表 2.2 set的构造 2.3 set的迭代器 2.4 set的容量 2.5 set的修改操作 2.6 set的使用举例 二、map 1.map的介绍 2.map的使用 2.1 map的模板参数说明 2.2 map的构造 2.3 map的迭代器 2.4 map的容量与元…

【数据结构】栈的应用

目录 0 引言 1 栈在括号匹配中的应用 2 栈在表达式求值中的应用 2.1 算数表达式 2.2 中缀表达式转后缀表达式 2.3 后缀表达式求值 3 栈在递归中的应用 3.1 栈在函数调用中的作用 3.2 栈在函数调用中的工作原理 4 总结 0 引言 栈&#xff08;Stack&#xff09;是一…

【网络编程开发】8.TCP连接管理与UDP协议 9.IP协议与ethernet协议

8.TCP连接管理与UDP协议 三次握手 三次握手的过程在TCP/IP网络通信中起着至关重要的作用&#xff0c;它不仅确保了数据的可靠传输&#xff0c;还为两端的数据传输提供了稳定的连接初始化过程。这一过程涉及到几个关键步骤&#xff0c;每个步骤都有其特定的目的和功能。 步骤&…

LSTM卷土重来之Vision-LSTM横空出世!!

在Transformer诞生三年后&#xff0c;谷歌将这一自然语言处理的重要研究扩展到了视觉领域&#xff0c;也就是Vision Transformer。 论文链接&#xff1a;https://arxiv.org/abs/2406.04303 项目链接: https://nx-ai.github.io/vision-lstm/ GPT-4o深夜发布&#xff01;Plus免…

MySQL—多表查询—联合查询

一、引言 之前学习了连接查询。现在学习联合查询。 union&#xff1a;联合、联盟 对于union查询&#xff0c;就是把多次查询的结果合并起来&#xff0c;形成一个新的查询结果集 涉及到两个关键字&#xff1a;union 和 union all 注意&#xff1a; union 会把上面两个SQL查询…