目录
一、简介
本文今天主要是介绍Redis中key自动过期,以及redis对应的Java实现该怎么用。因为篇幅问题,我这里写了一个测试类,引入 RedisTemplate对象,后面例子里就不一一引入了。大家理解就行,如果大家还不知道如何通过Spring Boot 整合redis则可以查看我之前的文章:SpringBoot整合redis(redis支持单节点和集群)
package com.alian.datastruct;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisDatabaseTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
}
二、常用方法
2.1、SELECT
- SELECT 切换至指定的数据库
语法
SELECT index
命令操作
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SELECT 2
OK
127.0.0.1:6379[2]> SELECT 15
OK
127.0.0.1:6379[15]> SELECT 0
OK
Redis服务启动后会创建16个数据库,编号从头0-15
Java操作
@Test
public void select() {
// 切换到1号数据库
int index = 1;
redisTemplate.execute((RedisCallback<Object>) connection -> {
connection.select(index);
return null;
});
}
2.2、KEYS
- KEYS 获取所有与给定匹配符相匹配的键(慎用)
语法
KEYS PATTERN
命令操作
127.0.0.1:6379> set like like
OK
127.0.0.1:6379> set lake lake
OK
127.0.0.1:6379> set leke leke
OK
127.0.0.1:6379> set leake leake
OK
127.0.0.1:6379> keys le*
1) "leke"
2) "leake"
127.0.0.1:6379> keys l[iae]ke
1) "like"
2) "leke"
3) "lake"
127.0.0.1:6379> keys le?ke
1) "leake"
127.0.0.1:6379> keys l[^e]ke
1) "like"
2) "lake"
Java操作
@Test
public void keys() {
// 模式串
String pattern = "le*";
// 匹配结果
Set<String> keys = redisTemplate.keys(pattern);
log.info("le*匹配到的结果:{}",keys);
pattern = "l[iae]ke";
keys = redisTemplate.keys(pattern);
log.info("l[iae]ke匹配到的结果:{}",keys);
pattern = "le?ke";
keys = redisTemplate.keys(pattern);
log.info("le?ke匹配到的结果:{}",keys);
pattern = "l[^e]ke";
keys = redisTemplate.keys(pattern);
log.info("l[^e]ke匹配到的结果:{}",keys);
}
le*匹配到的结果:[leke, leake]
l[iae]ke匹配到的结果:[like, leke, lake]
le?ke匹配到的结果:[leake]
l[^e]ke匹配到的结果:[like, lake]
2.3、DBSIZE
- DBSIZE 获取数据库包含的键值对数量
语法
DBSIZE
命令操作
127.0.0.1:6379> dbsize
(integer) 4
Java操作
@Test
public void dbSize() {
// 获取数据库包含的键值对数量
Long size = redisTemplate.execute((RedisCallback<Long>) connection -> connection.serverCommands().dbSize());
log.info("获取数据库包含的键值对数量:{}",size);
}
获取数据库包含的键值对数量:4
2.4、RANDOMKEY
- RANDOMKEY 随机返回一个键
语法
RANDOMKEY
命令操作
127.0.0.1:6379> randomkey
"lake"
Java操作
@Test
public void randomKey() {
// 随机返回一个键
String key = redisTemplate.randomKey();
log.info("随机返回一个键:{}",key);
}
随机返回一个键:leake
2.5、EXISTS
- EXISTS 检测键是否存在
语法
EXISTS key [key...]
命令操作
127.0.0.1:6379> exists lake
(integer) 1
127.0.0.1:6379> exists nake
(integer) 0
Java操作
@Test
public void exists() {
// 检测键lake是否存在
Boolean hasKey1 = redisTemplate.hasKey("lake");
log.info("检测键lake是否存在:{}", hasKey1);
// 检测键nake是否存在
Boolean hasKey2 = redisTemplate.hasKey("nake");
log.info("检测键nake是否存在:{}", hasKey2);
}
检测键lake是否存在:true
检测键nake是否存在:false
2.6、TYPE
- TYPE 查看键的类型
语法
TYPE key
命令操作
127.0.0.1:6379> set name alian
OK
127.0.0.1:6379> hset hash1 food fish
(integer) 1
127.0.0.1:6379> sadd set1 apple
(integer) 1
127.0.0.1:6379> lpush list1 book
(integer) 1
127.0.0.1:6379> zadd zset 100 alian
(integer) 1
127.0.0.1:6379> type name
string
127.0.0.1:6379> type hash1
hash
127.0.0.1:6379> type set1
set
127.0.0.1:6379> type list1
list
127.0.0.1:6379> type zset
zset
Java操作
@Test
public void type() {
// 获取键的类型
DataType type = redisTemplate.type("name");
log.info("获取键【name】的类型:{}", type);
type = redisTemplate.type("hash1");
log.info("获取键【hash1】的类型:{}", type);
type = redisTemplate.type("set1");
log.info("获取键【set1】的类型:{}", type);
type = redisTemplate.type("list1");
log.info("获取键【list1】的类型:{}", type);
type = redisTemplate.type("zset");
log.info("获取键【zset】的类型:{}", type);
}
}
获取键【name】的类型:STRING
获取键【hash1】的类型:HASH
获取键【set1】的类型:SET
获取键【list1】的类型:LIST
获取键【zset】的类型:ZSET
2.7、RENAME、RENAMENX
- RENAME 覆盖已经存在的键
- RENAMENX 只有在新键名尚未被占用的情况下进行改名
语法
RENAME originKey newKey
RENAMENX originKey newKey
命令操作
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> rename k1 k2
OK
127.0.0.1:6379> exists k1
(integer) 0
127.0.0.1:6379> exists k2
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> get k2
"v1"
如果键 k1 和键 k2 都存在,如果使用 RENAME 命令将 k1 改名为键 k2 ,那么原来的键 k2 将被删除
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6379> renamenx k3 k4
(integer) 0
127.0.0.1:6379> renamenx k3 k5
(integer) 1
如果键 k3 和键 k4 都存在,如果使用 RENAMENX 命令尝试将键 k3 改名为 k4 ,则会失败,因为 k4 已经存在
Java操作
@Test
public void renameAndRenameNx() {
// 键k1改名为k2
redisTemplate.rename("k1","k2");
// 键k3改名为k5
redisTemplate.renameIfAbsent("k3","k5");
}
2.8、DEL、UNLINK
- DEL 移除指定的键(要注意big key)
- UNLINK 以异步的方式移除指定的键
语法
DEL key [key...]
UNLINK key [key...]
命令操作
127.0.0.1:6379> del k2
(integer) 1
127.0.0.1:6379> get k2
(nil)
127.0.0.1:6379> unlink k4
(integer) 1
127.0.0.1:6379> get k4
(nil)
使用 DEL 移除指定的键,是一个同步的操作,如果你的键对应的值是一个很大的值,比如hash,list,set等直接删除可能就会阻塞redis;
使用 UNLINK 以异步的方式移除指定的键,该命令在不同的线程中执行实际的内存回收,因此它不是阻塞的,该命令只是从键空间中取消键的链接,实际删除将在稍后异步进行
Java操作
@Test
public void delAndUnlink() {
// 移除键k2
Boolean delete1 = redisTemplate.delete("k2");
log.info("移除键k2:{}", delete1);
// 键k3改名为k4
Boolean delete2 = redisTemplate.unlink("k4");
log.info("以异步的方式移除键k4:{}", delete2);
}
移除键k2:true
以异步的方式移除键k4:true
2.9、MOVE、SWAPDB
- MOVE 将给定的键移动到另外一个数据库
- SWAPDB 互换数据库
语法
MOVE key database_index
SWAPDB index index
命令操作
127.0.0.1:6379> get name
"alian"
127.0.0.1:6379> move name 1 #将键移动到1号数据库
(integer) 1
127.0.0.1:6379> get name #当前数据库已经查不到值了
(nil)
127.0.0.1:6379> select 1 #切换到1号数据库
OK
127.0.0.1:6379[1]> get name #成功获取到值
"alian"
127.0.0.1:6379[1]> swapdb 0 1 #互换数据库(0号和1号交换)
OK
127.0.0.1:6379[1]> get name #1号本来有name,现在没有了
(nil)
127.0.0.1:6379[1]> hgetall hash1 #1号拥有之前0号创建的键了
1) "food"
2) "fish"
Java操作
@Test
public void move() {
// 将设置myName的值为alian
redisTemplate.opsForValue().set("myName","alian");
// 将键name移动到2号数据库
Boolean move = redisTemplate.move("myName",2);
log.info("将键name移动到2号数据库:{}", move);
}
2.10、SORT
- SORT
语法
SORT key [BY pattern] [LIMIT offset count] [GET pattern
[GET pattern...]] [ASC | DESC] [ALPHA] [STORE destination]
命令操作
127.0.0.1:6379[1]> del list1
(integer) 1
127.0.0.1:6379[1]> lpush list1 "95.2" "98.5" "88.8" "78.9" "60.0"
(integer) 5
127.0.0.1:6379[1]> sort list1 LIMIT 0 -1 ALPHA ASC
1) "60.0"
2) "78.9"
3) "88.8"
4) "95.2"
5) "98.5"
127.0.0.1:6379[1]> del set1
(integer) 1
127.0.0.1:6379[1]> SADD set1 "bcd" "cde" "abc" "efg" "def"
(integer) 5
127.0.0.1:6379[1]> sort set1 LIMIT 0 -1 ALPHA ASC
1) "abc"
2) "bcd"
3) "cde"
4) "def"
5) "efg"
Java操作
@Test
public void sort() {
redisTemplate.delete("list1");
// 初始化List集合数据
redisTemplate.opsForList().leftPushAll("list1","95.2","98.5","88.8","78.9","60.0");
SortParameters.Range range2 = new SortParameters.Range(0, -1);
// 对键的值进行排序
SortQuery<String> query2 = SortQueryBuilder.sort("list1").order(SortParameters.Order.ASC).alphabetical(true).limit(range2).build();
List<Object> sortList2 = redisTemplate.sort(query2);
log.info("【List】集合排序结果:{}",sortList2);
redisTemplate.delete("set1");
// 初始化Set集合数据
redisTemplate.opsForSet().add("set1","bcd","cde","abc","efg","def");
SortParameters.Range range = new SortParameters.Range(0, -1);
// 对键的值进行排序
SortQuery<String> query = SortQueryBuilder.sort("set1").order(SortParameters.Order.ASC).alphabetical(true).limit(range).build();
List<Object> sortList = redisTemplate.sort(query);
log.info("【Set】集合排序结果:{}",sortList);
}
【List】集合排序结果:[60.0, 78.9, 88.8, 95.2, 98.5]
【Set】集合排序结果:[abc, bcd, cde, def, efg]
2.11、FLUSHDB、FLUSHALL
- FLUSHDB 清空当前数据库(慎用)
- FLUSHALL 清空所有数据库(慎用)
语法
FLUSHDB [async]
FLUSHALL [async]
命令操作
127.0.0.1:6379[1]> flushdb
OK
127.0.0.1:6379[1]> FLUSHALL async
OK
Java操作
@Test
public void flushDbAndFlushAll() {
// 清空当前数据库
redisTemplate.execute((RedisCallback<Object>) connection -> {
connection.serverCommands().flushDb();
return null;
});
// 清空所有数据库
redisTemplate.execute((RedisCallback<Object>) connection -> {
connection.serverCommands().flushAll();
return null;
});
}
本文介绍了Redis中如何处理key的自动过期以及在Java中如何利用RedisTemplate进行相关操作,包括切换数据库、查找键、获取数据库大小、随机返回键、检测键存在性、查看键类型、键的重命名、删除键、移动键和数据库互换、排序以及清空数据库等常见命令和方法。

388

被折叠的 条评论
为什么被折叠?



