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


    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 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);
            }
        }
    
  • 相关阅读:
    导数求函数最大值和最小值习题
    java实现钉钉机器人消息推送
    【owt-server】m88分支和m59-server
    GTK实现水波纹效果
    LeetCode——动态规划篇(二)
    【学习日记2023.5.23】 之 Redis入门未入坑
    精品基于Uniapp+SSM实现的移动端的家庭客栈管理系统实现的App
    Github: ksrpc原码解读---HTTP异步文件交互
    n 皇后问题【Python】
    云服务器部署k8s集群
  • 原文地址:https://blog.csdn.net/weixin_62533201/article/details/139547201