【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 <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;@Beforepublic void init() {pool = new JedisPool("tcp://127.0.0.1:8888");}/*** 测试SET、GET命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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命令*/@Testpublic 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.rhkb.cn/news/345012.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短剧看剧系统投流版系统搭建,前端uni-app

目录 前言&#xff1a; 一、短剧看剧系统常规款短剧系统和投流版的区别&#xff1f; 二、后端体系 1.管理端&#xff1a; 2.代理投流端 三、功能区别 总结&#xff1a; 前言&#xff1a; 23年上半年共上新微短剧481部&#xff0c;相较于2022年全年上新的454部&#xff0…

C语言王国——数据的内存管理

目录 一、引言 二、整形在内存中的存储 2.1 进制之间的转换 2.1.1 整形的二进制 2.1.2 十进制和二进制 2.1.3 十进制和八进制的转换 2.1.4 十六进制和十进制的转换 2.2 原码&#xff0c;反码&#xff0c;和补码 三、大、小端字节序 3.1 大小端的定义 3.2 为什么会有大…

高考后志愿填报信息采集系统制作指南

在高考的硝烟散去之后&#xff0c;每位学生都面临着一个重要的任务——志愿填报。老师们如何高效、准确地收集和整理这些信息&#xff0c;成为了一个棘手的问题。难道我们只能依赖传统的手工登记方式&#xff0c;忍受其繁琐和易错吗&#xff1f; 易查分是一个简单易用的在线工具…

容器中运行ping提示bash: ping: command not found【笔记】

容器中运行ping提示bash: ping: command not found 原因是容器中没有安装ping命令 在容器中安装ping命令&#xff0c;可以使用以下命令&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y iputils-ping对于基…

上位机图像处理和嵌入式模块部署(f407 mcu和其他mcu品类的选择)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多朋友读书的时候学的是stm32&#xff0c;工作中用的也是stm32。这本来问题不大&#xff0c;但是过去两三年的经历告诉我们&#xff0c;mcu的使用…

音频数据上的会话情感分析

情感分析&#xff0c;也被称为观点挖掘&#xff0c;是自然语言处理(NLP)中一个流行的任务,因为它有着广泛的工业应用。在专门将自然语言处理技术应用于文本数据的背景下,主要目标是训练出一个能够将给定文本分类到不同情感类别的模型。下图给出了情感分类器的高级概述。 例如,三…

牛客热题:最长公共子序列Ⅱ

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;最长公共子序列Ⅱ题目链接方法一…

网络安全形势与WAF技术分享

我一个朋友的网站&#xff0c;5月份时候被攻击了&#xff0c;然后他找我帮忙看看&#xff0c;我看他的网站、网上查资料&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;最近几年这网络安全形势真是不容乐观&#xff0c;在网上查了一下资料&#xff0c;1、中国信息通…

vue2的form利用插槽修改错误提示UI

1. 需求 很多时候我们使用el-form想修改下错误提示的UI&#xff0c;比如table中使用form校验这类场景下错误提示的UI调整就非常重要。 2. 了解文档 Form-Item Scoped Slot name说明error自定义表单校验信息的显示方式&#xff0c;参数为 { error } 3.实际使用 html里使用…

Python Flask实现蓝图Blueprint配置和模块渲染

Python基础学习&#xff1a; Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习&#xff1a; Python中如何选择Web开发框架&#xff1f;Pyth…

数据结构笔记 4 树和二叉树

二叉树和完全二叉树的区别&#xff1f; 二叉树和完全二叉树的主要区别在于它们的结构特性和节点排列方式&#xff1a; 1. **二叉树**&#xff1a; - 是一种数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;通常称为左子节点和右子节点。 - 节点的子节点数量…

git凭证

默认是manager # 将凭证缓存到内存中&#xff0c;默认缓存15分钟 git config --global credential.helper cache# 将凭证存储到磁盘上的纯文本文件中 git config --global credential.helper store# 使用 Git 凭证管理器 git config --global credential.helper manager-core查…

图文详解Windows系统下搭建mysql开发环境——mysql Community 8 和 navicat Premium 17 的安装和使用

在正式开始学习使用MySQL之前&#xff0c;我们有必要先搭建一个良好的开发环境&#xff0c;让我们的学习和工作效率事半功倍。 本文涉及到的软件百度云盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1jj_YajEv8adeEjMrXLhOTQ?pwd1023 提取码&#xff1a;1023 目录 …

元宇宙数字藏品交易所,未来发展的大趋势

随着科技的飞速进步&#xff0c;元宇宙以其独特的魅力为数字世界绘制了一幅前所未有的宏伟蓝图。在这一宏大的背景下&#xff0c;数字藏品交易所作为连接虚拟与现实的桥梁&#xff0c;正以其卓越的优势&#xff0c;引领着数字藏品市场迈向新的高度。 首先&#xff0c;元宇宙为…

三十六篇:未来架构师之道:掌握现代信息系统典型架构

未来架构师之道&#xff1a;掌握现代信息系统典型架构 1. 引言 在企业的数字化转型浪潮中&#xff0c;信息系统架构的角色变得日益重要。它不仅承载了企业的IT战略&#xff0c;更是确保企业在复杂、动态的市场环境中稳定运行的关键。作为信息系统的骨架&#xff0c;一个精心设…

HTML5+CSS3+JS小实例:网格图库

实例:网格图库 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&…

Python中猴子补丁是什么,如何使用

1、猴子补丁奇遇记 &#x1f412; 在Python的世界深处&#xff0c;隐藏着一种神秘而又强大的技巧——猴子补丁&#xff08;Monkey Patching&#xff09;。这是一项允许你在程序运行时动态修改对象&#xff08;如模块、类或函数&#xff09;的行为的技术。它得名于其“快速修补…

算法导论实战(六)(算法导论习题三十四、三十五章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 前言 算法导论的知识点学习将持续性更新在算…

Docker 基础使用(2) 镜像与容器

文章目录 镜像的含义镜像的构成镜像的作用镜像的指令容器的含义容器的状态容器的指令 Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用&#xff08;2&#xff09; 镜像与容器 Docker 基础使用&#xff08;3&#xff09; 存…

2024年【天津市安全员C证】免费试题及天津市安全员C证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】免费试题及天津市…