1. 简介
Redis 是一个开源(BSD许可)的,内存中的key-value存储系统,它可以用作数据库、缓存和消息中间件。
2. 对key的操作
首先要建立连接Jedis jedis = new Jedis("127.0.0.1", 6379),然后就可以对string,set,zset,hash进行操作了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
//对key的测试
public void keyTest() {
System.out.println(jedis.flushDB());
//清空数据
System.out.println(jedis.echo( "hello" ));
//打印hello
System.out.println(jedis.exists( "foo" ));
//判断key是否存在
jedis.set( "key1" , "values1" );
jedis.set( "key2" , "values2" );
System.out.println(jedis.exists( "key1" ));
//判断key是否存在
String randomKey = jedis.randomKey();
//选择一个随机的key
System.out.println( "randomKey的为: " + randomKey);
jedis.expire( "key1" , 60 );
//生存时间
System.out.println(jedis.pttl( "key1" ));
//剩下的生存时间
//移除key的过期时间
jedis.persist( "key1" );
// 获取key的类型, "string", "list", "set" "none" none表示key不存在
System.out.println( "type的类型为: " + jedis.type( "key1" ));
//key的类型
// 导出key的值
String value = jedis.get( "key1" );
System.out.println(value);
// 将key重命名
jedis.renamenx( "key1" , "keytest" );
System.out.println( "key1是否存在: " + jedis.exists( "key1" ));
// 判断是否存在
System.out.println( "keytest是否存在: " + jedis.exists( "keytest" ));
// 判断是否存在
// 查询匹配的key
// KEYS * 匹配数据库中所有 key 。
// KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
// KEYS h*llo 匹配 hllo 和 heeeeello 等。
// KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
// 特殊符号用 \ 隔开。
Set<string> set = jedis.keys( "k*" );
//获取所有相关的key keys方法
System.out.println(set);
jedis.del( "key1" );
// 删除key del方法
System.out.println(jedis.exists( "key1" ));
}
|
3. String数据类型
1
2
3
4
5
6
7
8
9
10
11
12
|
set mystr "hello world!" //设置字符串类型
get mystr //读取字符串类型
对字符串进行数值操作
127.0 . 0.1 : 6379 > set mynum "2"
OK
127.0 . 0.1 : 6379 > get mynum
"2"
127.0 . 0.1 : 6379 > incr mynum
(integer) 3
127.0 . 0.1 : 6379 > get mynum
"3"
|
Java操作代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//对string操作的测试
public void stringTest() {
jedis.set( "hello" , "hello" );
//set
System.out.println(jedis.get( "hello" ));
//get
// 使用append 向字符串后面添加
jedis.append( "hello" , " world" );
//追加 append方法
System.out.println(jedis.get( "hello" ));
// set覆盖字符串
jedis.set( "hello" , "123" );
System.out.println(jedis.get( "hello" ));
// 设置过期时间
jedis.setex( "hello2" , 2 , "world2" );
System.out.println(jedis.get( "hello2" ));
try {
Thread.sleep( 3000 );
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(jedis.get( "hello2" ));
// 一次添加多个key-value对
jedis.mset( "a" , "1" , "b" , "2" );
// 获取a和b的value
List<string> valus = jedis.mget( "a" , "b" );
System.out.println(valus);
// 批量删除
jedis.del( "a" , "b" );
System.out.println(jedis.exists( "a" ));
System.out.println(jedis.exists( "b" ));
}
|
4. List数据类型
redis中的lists在底层实现上并不是数组,而是链表。
一系列操作:RPUSH, LPUSH, LLEN, LRANGE, LPOP和 RPOP。
我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//新建一个list叫做mylist,并在列表头部插入元素"1"
127.0 . 0.1 : 6379 > lpush mylist "1"
//返回当前mylist中的元素个数
(integer) 1
//在mylist右侧插入元素"2"
127.0 . 0.1 : 6379 > rpush mylist "2"
(integer) 2
//在mylist左侧插入元素"0"
127.0 . 0.1 : 6379 > lpush mylist "0"
(integer) 3
//列出mylist中从编号0到编号1的元素
127.0 . 0.1 : 6379 > lrange mylist 0 1
1 ) "0"
2 ) "1"
//列出mylist中从编号0到倒数第一个元素
127.0 . 0.1 : 6379 > lrange mylist 0 - 1
1 ) "0"
2 ) "1"
3 ) "2"
|
Java操作代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
public void listTest() {
String key = "mylist" ;
jedis.del(key);
//把之前的删除
// 队列添加元素
jedis.rpush(key, "aaaa" );
jedis.rpush(key, "aaaa" );
jedis.rpush(key, "bbbb" );
jedis.rpush(key, "cccc" );
jedis.rpush(key, "cccc" );
//队列长度
System.out.println( "lenth: " + jedis.llen(key));
// 打印队列,从索引0开始,到倒数第1个(全部元素)
System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 ));
// 索引为1的元素
System.out.println( "index of 1: " + jedis.lindex(key, 1 ));
// 设置队列里面一个元素的值,当index超出范围时会返回一个error。
jedis.lset(key, 1 , "aa22" );
System.out.println( "index of 1: " + jedis.lindex(key, 1 ));
// 从队列的右边入队一个元素
jedis.rpush(key, "-2" , "-1" );
// 先-2,后-1入队列
System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 ));
// 从队列的左边入队一个或多个元素
jedis.lpush(key, "second element" , "first element" );
// 先second
// element,后first
// elementF入队列
System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 ));
// 从队列的右边出队一个元素
System.out.println(jedis.rpop(key));
// 从队列的左边出队一个元素
System.out.println(jedis.lpop(key));
System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 ));
// count > 0: 从头往尾移除值为 value 的元素,count为移除的个数。
// count < 0: 从尾往头移除值为 value 的元素,count为移除的个数。
// count = 0: 移除所有值为 value 的元素。
jedis.lrem(key, 1 , "cccc" );
System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 ));
// 即最右边的那个元素也会被包含在内。 如果start比list的尾部下标大的时候,会返回一个空列表。
// 如果stop比list的实际尾部大的时候,Redis会当它是最后一个元素的下标。
System.out.println(jedis.lrange(key, 0 , 2 ));
System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 ));
// 删除区间以外的元素
System.out.println(jedis.ltrim(key, 0 , 2 ));
System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 ));
}
|
5. Set类型
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
一系列操作:SADD, SREM, SISMEMBER, SMEMBERS 和 SUNION.
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
//向集合myset中加入一个新元素"one"
127.0 . 0.1 : 6379 > sadd myset "one"
(integer) 1
127.0 . 0.1 : 6379 > sadd myset "two"
(integer) 1
//列出集合myset中的所有元素
127.0 . 0.1 : 6379 > smembers myset
1 ) "one"
2 ) "two"
//判断元素1是否在集合myset中,返回1表示存在
127.0 . 0.1 : 6379 > sismember myset "one"
(integer) 1
//判断元素3是否在集合myset中,返回0表示不存在
127.0 . 0.1 : 6379 > sismember myset "three"
(integer) 0
//新建一个新的集合yourset
127.0 . 0.1 : 6379 > sadd yourset "1"
(integer) 1
127.0 . 0.1 : 6379 > sadd yourset "2"
(integer) 1
127.0 . 0.1 : 6379 > smembers yourset
1 ) "1"
2 ) "2"
//对两个集合求并集
127.0 . 0.1 : 6379 > sunion myset yourset
1 ) "1"
2 ) "one"
3 ) "2"
4 ) "two"
|
Java操作代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public void setTest() {
// 清空数据
System.out.println(jedis.flushDB());
String key = "myset1" ;
String key2 = "myset2" ;
// 集合添加元素
jedis.sadd(key, "aaa" , "bbb" , "ccc" );
jedis.sadd(key2, "bbb" , "ccc" , "ddd" );
// 获取集合里面的元素数量
System.out.println(jedis.scard(key));
//the number count of the set
// 获得两个集合的交集,并存储在一个关键的结果集
jedis.sinterstore( "destination" , key, key2);
System.out.println(jedis.smembers( "destination" ));
// 获得两个集合的并集,并存储在一个关键的结果集
jedis.sunionstore( "destination" , key, key2);
System.out.println(jedis.smembers( "destination" ));
// key1集合中,key2集合没有的元素,并存储在一个关键的结果集
jedis.sdiffstore( "destination" , key, key2);
System.out.println(jedis.smembers( "destination" ));
// 确定某个元素是一个集合的成员
System.out.println(jedis.sismember(key, "aaa" ));
// 从key集合里面随机获取一个元素
System.out.println(jedis.srandmember(key));
// aaa从key移动到key2集合
jedis.smove(key, key2, "aaa" );
System.out.println(jedis.smembers(key));
//获取集合中的元素
System.out.println(jedis.smembers(key2));
// 删除并获取一个集合里面的元素
System.out.println(jedis.spop(key));
// 从集合里删除一个或多个元素
jedis.srem(key2, "ccc" , "ddd" );
System.out.println(jedis.smembers(key2));
}
|
6. Sorted Sets类型
我们都将redis中的有序集合叫做zsets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1
127.0 . 0.1 : 6379 > zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一个元素360.com,赋予它的序号是3
127.0 . 0.1 : 6379 > zadd myzset 3 360 .com
(integer) 1
//向myzset中新增一个元素google.com,赋予它的序号是2
127.0 . 0.1 : 6379 > zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
127.0 . 0.1 : 6379 > zrange myzset 0 - 1 with scores
1 ) "baidu.com"
2 ) "1"
3 ) "google.com"
4 ) "2"
5 ) "360.com"
6 ) "3"
//只列出myzset的元素
127.0 . 0.1 : 6379 > zrange myzset 0 - 1
1 ) "baidu.com"
2 ) "google.com"
3 ) "360.com"
|
Java操作代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public void zsetTest() {
// 清空数据
System.out.println(jedis.flushDB());
String key = "mysortset" ;
Map<string, double = "" > scoreMembers = new HashMap<>();
scoreMembers.put( "aaa" , 1001.0 );
scoreMembers.put( "bbb" , 1002.0 );
scoreMembers.put( "ccc" , 1003.0 );
// 添加数据
jedis.zadd(key, 1004.0 , "ddd" );
jedis.zadd(key, scoreMembers);
// 获取一个排序的集合中的成员数量
System.out.println(jedis.zcard(key));
// 返回的成员在指定范围内的有序集合,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。
// 负数下标,以-1表示最后一个成员,-2表示倒数第二个成员
Set<string> coll = jedis.zrange(key, 0 , - 1 );
System.out.println(coll);
// 返回的成员在指定范围内的逆序集合
coll = jedis.zrevrange(key, 0 , - 1 );
System.out.println(coll);
// 元素下标
System.out.println(jedis.zscore(key, "bbb" ));
// 删除元素
System.out.println(jedis.zrem(key, "aaa" ));
System.out.println(jedis.zrange(key, 0 , - 1 ));
// 给定值范围内的成员数
System.out.println(jedis.zcount(key, 1002.0 , 1003.0 ));
}
|
7. Hash类型
hashes存的是字符串和字符串值之间的映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//建立哈希,并赋值
127.0 . 0.1 : 6379 > HMSET user: 001 username antirez password P1pp0 age 34
OK
//列出哈希的内容
127.0 . 0.1 : 6379 > HGETALL user: 001
1 ) "username"
2 ) "antirez"
3 ) "password"
4 ) "P1pp0"
5 ) "age"
6 ) "34"
//更改哈希中的某一个值
127.0 . 0.1 : 6379 > HSET user: 001 password 12345
(integer) 0
//再次列出哈希的内容
127.0 . 0.1 : 6379 > HGETALL user: 001
1 ) "username"
2 ) "antirez"
3 ) "password"
4 ) "12345"
5 ) "age"
6 ) "34"
|
Java操作代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public void hashTest() {
// 清空数据
System.out.println(jedis.flushDB());
String key = "myhash" ;
Map<string, string= "" > hash = new HashMap<>();
hash.put( "aaa" , "11" );
hash.put( "bbb" , "22" );
hash.put( "ccc" , "33" );
// 添加数据
jedis.hmset(key, hash);
jedis.hset(key, "ddd" , "44" );
// 获取hash的所有元素(key值)
System.out.println(jedis.hkeys(key));
// 获取hash中所有的key对应的value值
System.out.println(jedis.hvals(key));
// 获取hash里所有元素的数量
System.out.println(jedis.hlen(key));
// 获取hash中全部的域和值,以Map<string, string=""> 的形式返回
Map<string, string= "" > elements = jedis.hgetAll(key);
System.out.println(elements);
// 判断给定key值是否存在于哈希集中
System.out.println(jedis.hexists(key, "bbb" ));
// 获取hash里面指定字段对应的值
System.out.println(jedis.hmget(key, "aaa" , "bbb" ));
// 获取指定的值
System.out.println(jedis.hget(key, "aaa" ));
// 删除指定的值
System.out.println(jedis.hdel(key, "aaa" ));
System.out.println(jedis.hgetAll(key));
// 为key中的域 field 的值加上增量 increment
System.out.println(jedis.hincrBy(key, "bbb" , 100 ));
System.out.println(jedis.hgetAll(key));
}
|
8. 事务
事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。
在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTI、EXEC、DISCARD、WATCH。这四个指令构成了redis事务处理的基础。
1.MULTI用来组装一个事务;
2.EXEC用来执行一个事务;
3.DISCARD用来取消一个事务;
4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
redis> MULTI //标记事务开始
OK
redis> INCR user_id //多条命令按顺序入队
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC //执行
1 ) (integer) 1
2 ) (integer) 2
3 ) (integer) 3
4 ) PONG
|
Java操作代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public void transactionTest() {
Transaction t = jedis.multi();
//组装一个事务
t.set( "hello" , "world" );
Response<string> response = t.get( "hello" );
t.zadd( "foo" , 1 , "barowitch" );
t.zadd( "foo" , 0 , "barinsky" );
t.zadd( "foo" , 0 , "barikoviev" );
Response<set<string>> sose = t.zrange( "foo" , 0 , - 1 );
// 返回全部相应并以有序集合的方式返回
System.out.println(response);
System.out.println(sose);
t.exec();
// 此行注意,不能缺少 执行
String foolbar = response.get();
// Response.get() 可以从响应中获取数据
int soseSize = sose.get().size();
// sose.get()
System.out.println(foolbar);
System.out.println(sose.get());
System.out.println( "集合的size为:" + soseSize);
}
|
管道操作Java代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public void transactionPipelineTest() {
Pipeline p = jedis.pipelined();
//开一个管道
p.set( "fool" , "bar" );
p.zadd( "foo" , 1 , "barowitch" );
p.zadd( "foo" , 0 , "barinsky" );
p.zadd( "foo" , 0 , "barikoviev" );
Response<string> pipeString = p.get( "fool" );
Response<set<string>> sose = p.zrange( "foo" , 0 , - 1 );
System.out.println(pipeString);
System.out.println(sose);
p.sync();
//提交
System.out.println( "==========" );
System.out.println(p.get( "fool" ));
System.out.println(p.zrange( "foo" , 0 , - 1 ));
int soseSize = sose.get().size();
Set<string> setBack = sose.get();
System.out.println(soseSize);
System.out.println(setBack);
System.out.println(pipeString.get());
}
|
总结
以上就是本文关于Java操作Redis详细介绍的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。
原文链接:https://www.2cto.com/kf/201608/541731.html