Redis:不只是缓存那么简单(九)

专栏:Redis 修行录

个人主页:手握风云

目录

一、核心依赖引入

二、连接配置

[2.1. 核心原因](#2.1. 核心原因)

[2.2. SSH 端口转发](#2.2. SSH 端口转发)

[三、Redis 基础通用操作](#三、Redis 基础通用操作)

[3.1. get 和 set](#3.1. get 和 set)

[3.2. exists 和 del](#3.2. exists 和 del)

[3.3. keys](#3.3. keys)

[3.4. setex 和 ttl](#3.4. setex 和 ttl)

[3.5. type](#3.5. type)


一、核心依赖引入

采用 Jedis 作为 Redis Java 客户端,Maven 依赖配置:

XML 复制代码
<dependencies>
	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>4.4.2</version>
		<scope>compile</scope>
	</dependency>
</dependencies>

二、连接配置

在 Java 本地开发中配置 Redis端口转发,核心是为了安全访问远程 Redis、打通本地与云服务器的网络通路,同时降低开发调试成本。

2.1. 核心原因

Redis 服务器部署在云服务器,而 Java 代码运行在本地主机,两者网络不通,本地无法直接连接云服务器的 Redis 端口(6379)。若直接在云服务器安全组 / 防火墙开放 Redis 6379 端口到公网,极易被黑客扫描、入侵,导致数据泄露、服务器被劫持,这是高危操作。

2.2. SSH 端口转发

Xshell 配置隧道规则,避免 Redis 端口暴露公网:

  • 类型:本地 (拨出)
  • 本地侦听端口:8888
  • 目标:服务器 localhost:6379
  • 保持 Xshell 连接,本地 8888 = 服务器 6379

配置好端口转发之后,一定要断开之前的链接,重新链接才能映射成功。如果我们断开 SSH 连接,端口转发自然也会失效。我们可以通过 cmd 终端命令 netstat -ano|findstr 8888 查看自己的主机是否存在该端口号。

用JedisPool管理连接,推荐 try-with-resources 自动关闭,Jedis.ping() 返回 PONG 即成功。

java 复制代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisDemoGeneric {
    public static void main(String[] args) {
        // 连接到本地 Redis 服务器
        JedisPool pool = new JedisPool("tcp://127.0.0.1:8888");

        try (Jedis jedis = pool.getResource()) {
            // 测试连接是否正常
            String pong = jedis.ping();
            System.out.println(pong);
        }
    }
}

SLF4J 日志报错可忽略,不影响功能。

三、Redis 基础通用操作

|----------|-------------|-------------------|
| 操作类型 | 核心功能 | 关键 API |
| 键值读写 | 设值 / 取值 | get() / set() |
| 键管理 | 判断存在 / 删除键 | exists() / del() |
| 键查询 | 模糊匹配所有键 | keys (匹配规则) |
| 过期控制 | 设过期 / 查剩余时间 | setex() 秒 / ttl() |
| 类型查询 | 查看键的数据类型 | type() |

3.1. get 和 set

java 复制代码
public static void test1(Jedis jedis) {
    System.out.println("get 和 set 的使用");
    jedis.flushDB();

    // 基础设置与获取
    jedis.set("name1", "Alice");
    String name = jedis.get("name1");
    System.out.println("获取 name1: " + name);

    // 覆盖已存在的 key
    jedis.set("name1", "Bob");
    System.out.println("覆盖后获取 name: " + jedis.get("name1"));

    // 获取不存在的 key
    String not_exist_name = jedis.get("name10");
    System.out.println("获取不存在的 key: " + not_exist_name);

    SetParams params = new SetParams();
    params.ex(10);
    params.nx();
    jedis.set("name2", "Frost", params);

    String value = jedis.get("name2");
    System.out.println("获取 name2: " + value);

    System.out.println("======");
}

3.2. exists 和 del

java 复制代码
public static void test2(Jedis jedis) {
    System.out.println("exists 和 del 的使用");
    jedis.flushDB();

    String key = "test_for_delete";
    jedis.set(key, "Hello Redis");

    // 判断是否存在
    boolean isExist = jedis.exists(key);
    System.out.println("删除前, " + key + "是否存在: " + isExist);

    // 删除 key
    long delCount = jedis.del(key);
    System.out.println("成功删除了 " + delCount + " 个 key");

    // 再次判断
    isExist = jedis.exists(key);
    System.out.println("删除后, " + key + "是否存在: " + isExist);

    // 删除多个 key
    jedis.set("key1", "val1");
    jedis.set("key2", "val2");
    long multiDel = jedis.del("key1", "key2", "key3");
    System.out.println("实际删除了 " + multiDel + " 个 key");

    System.out.println("======");
}

3.3. keys

java 复制代码
public static void test3(Jedis jedis) {
    System.out.println("keys 的使用");
    jedis.flushDB();

    jedis.set("user1", "Tom");
    jedis.set("user2", "Jerry");
    jedis.set("order1", "Apple");
    jedis.set("order2", "Banana");

    // 查找所有 keys
    Set<String> allKeys = jedis.keys("*");
    System.out.println("数据库中的所有 keys: " + allKeys);

    // 查找特定前缀的 keys
    Set<String> userKeys = jedis.keys("user:*");
    System.out.println("匹配 'user:*' 的 keys: " + userKeys);

    // 查找包含特定字符的 keys
    Set<String> orderKeys = jedis.keys("*der*");
    System.out.println("匹配 'der' 的 keys: " + orderKeys);
}

3.4. setex 和 ttl

java 复制代码
public static void test4(Jedis jedis) {
    System.out.println("setex() / ttl() 的使用");

    String sessionKey = "session:1001";

    // 设置一个存活时间为 5 秒的 key
    jedis.setex(sessionKey, 5, "session_data");
    System.out.println("设置 " + sessionKey + "存活时间为 5 秒");

    // 立即查看 TTL
    long ttl1 = jedis.ttl(sessionKey);
    System.out.println("当前的 TTL: " + ttl1 + " 秒");

    // 线程休眠 2 秒
    System.out.println("休眠 2 秒");
    try {
        Thread.sleep(2_000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    // 再次查看 TTL
    long ttl2 = jedis.ttl(sessionKey);
    System.out.println("休眠 2 秒后, 当前的 TTL: " + ttl2 + " 秒");

    // 查看一个不存在或者没有设置过期时间的 Key 的 TTL
    jedis.set("permanent_key", "always_here");
    System.out.println("未设置过期时间 key 的 TTL: " + jedis.ttl("permanent_key"));
    System.out.println("不存在的 key 的 TTL: " + jedis.ttl("ghost_key"));

    System.out.println("======");
}

3.5. type

java 复制代码
public static void test5(Jedis jedis) {
    System.out.println("type 的使用");
    jedis.flushDB();

    // String 类型
    jedis.set("string_type", "I'm a string");
    System.out.println("string_type 的类型是: " + jedis.type("string_type"));

    // List 类型
    jedis.lpush("list_type", "Java", "C++", "Python");
    System.out.println("list_type 的类型: " + jedis.type("list_type"));

    // Set 类型
    jedis.sadd("set_type", "Apple", "Banana", "Banana");
    System.out.println("set_type 的类型: " + jedis.type("set_type"));

    // Hash 类型
    jedis.hset("hash_type", "name", "John");
    jedis.hset("hash_type", "age", "30");
    System.out.println("hash_type 的类型: " + jedis.type("hash_type"));

    // 不存在的 key
    System.out.println("不存在的 Key 的类型是: " + jedis.type("none_type"));

    System.out.println("======");
}
相关推荐
gQ85v10Db1 小时前
Redis分布式锁进阶第三十二篇
数据库·redis·分布式
xu_ws2 小时前
redis的io多路复用和Java NIO的区别
java·redis·nio
Devin~Y2 小时前
大厂Java面试实录:Spring Boot微服务 + Redis/Kafka + Prometheus/Jaeger + RAG/Agent(小Y水货版)
java·spring boot·redis·spring cloud·kafka·prometheus·jaeger
阿里巴巴淘系技术团队官网博客2 小时前
缓存使用实践总结:以淘宝交易结算场景为例
缓存
lvrongbao2 小时前
互联网大厂Java面试场景:从Spring到Redis的技术问答解析
java·redis·spring·微服务·分布式事务
摇滚侠11 小时前
Redis 秒杀功能 超卖问题 一人一单问题 分布式锁 精彩!精彩!
redis·分布式·bootstrap
身如柳絮随风扬13 小时前
商品服务架构实战:多数据源切换与分级缓存设计全解析
缓存·架构
Emily呀16 小时前
【无标题】
redis
1892280486117 小时前
H27QCG8T2ELR-BCF海力士H27QCG8UDBIR-BCB
大数据·服务器·人工智能·科技·缓存