bboyjing's blog

Redis学习笔记六【Redis命令(三)】

本章节学习一些和数据结构本身没有关系的其他命令

排序

命令 描述
SORT 根据给定的选项,对输入的列表、集合或者有序集合进行排序,返回结果
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
//构造测试数据
127.0.0.1:6379> rpush sort-input 23 15 110 7
(integer) 4
//根据数字大小对元素进行排序
127.0.0.1:6379> sort sort-input
1) "7"
2) "15"
3) "23"
4) "110"
//根据字母表顺序对元素进行排序
127.0.0.1:6379> sort sort-input by alpha
1) "110"
2) "15"
3) "23"
4) "7"
//将散列的域field用作权重对sort-input进行排序
127.0.0.1:6379> hset d-7 field 5
(integer) 1
127.0.0.1:6379> hset d-15 field 1
(integer) 1
127.0.0.1:6379> hset d-23 field 9
(integer) 1
127.0.0.1:6379> hset d-110 field 3
(integer) 1
127.0.0.1:6379> sort sort-input by d-*->field
1) "15"
2) "110"
3) "7"
4) "23"
//获取排序权重,并返回
127.0.0.1:6379> sort sort-input by d-*->field get d-*->field
1) "1"
2) "3"
3) "5"
4) "9"

基本的Redis事物

Redis的基本书屋需要用到MULTI命令和EXEC命令,这种事物可以让一个客户端在不被其他客户端打断的情况下执行多个命令,和关系型数据库那种可以在执行的过程中进行回滚的事物不同,在Redis里,被MULTI命令和EXEC命令包围的所有命令会一个接一个地执行,直到所有命令都执行完毕为止。当一个事物执行完毕,Redis才会处理其他客户端的命令。下面在redis-sample项目的command模块里测试下该功能。

不加事物,并行执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void incr() throws InterruptedException {
//自增操作
System.out.println(redisTemplate.opsForValue().increment("notrans:", 1));
//休眠100毫秒
Thread.sleep(100);
//自减操作
redisTemplate.opsForValue().increment("notrans:", -1);
}
//自增和自减不在一个事物中,三个线程的输出时随机的
public void test() throws Exception {
for(int i = 0; i < 3; i++){
new Thread(()->{
try {
noTransactionService.incr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
Thread.sleep(Integer.MAX_VALUE);
}

添加事物,并行执行命令

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
public void incr() throws InterruptedException {
List<Object> results = stringRedisTemplate.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();
operations.opsForValue().increment("trans:", 1);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
operations.opsForValue().increment("trans:", -1);
return operations.exec();
}
});
System.out.println(results.get(0));
}
//自增和自减在同一个事物中,作为一个整体发送到Redis,三个线程的输出均为1
public void test() throws Exception {
for(int i = 0; i < 3; i++){
new Thread(()->{
try {
transactionService.incr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
Thread.sleep(Integer.MAX_VALUE);
}

键的过期时间

命令 描述
PERSIST 移除键的过期时间
TTL 查看给定键距离过期还有多少秒
EXPIRE 让给定键在指定的秒数后过期
EXPIREAT 将给定键的过期时间设置为给定UNIX时间戳
PTTL 查看给定键距离过期时间还有多少毫秒
PEXPIRE 让给定键在指定的毫秒数之后过期
PEXPIREAT 将一个毫秒级精度的UNIX时间戳设置为给定键的过期时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> set key value
OK
127.0.0.1:6379> get key
"value"
127.0.0.1:6379> expire key 2
(integer) 1
//2秒后获取key
127.0.0.1:6379> get key
(nil)
//查看key距离过期还有多少秒
127.0.0.1:6379> set key value2
OK
127.0.0.1:6379> expire key 100
(integer) 1
127.0.0.1:6379> ttl key
(integer) 97

Redis命令的学习就到此结束了,更多的命令可自行查看Redis官方api。