Redis 中数据库命令使用详解

本文介绍了Redis中如何处理key的自动过期以及在Java中如何利用RedisTemplate进行相关操作,包括切换数据库、查找键、获取数据库大小、随机返回键、检测键存在性、查看键类型、键的重命名、删除键、移动键和数据库互换、排序以及清空数据库等常见命令和方法。

一、简介

  本文今天主要是介绍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;
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值