Redis —— (五)

9. Redis 客户端

前面文字中 redis 的操作都是在 redis 命令行客户端,手动进行的

日常开发中,则是基于 redis 的 api 实现定制化的 redis 客户端程序,来操作redis ,即在代码中操作 redis。(redis 提供的 命令行客户端 / 第三方的图形化客户端,本质上都是 "通用的客户程序)

9.1 RESP 协议

RESP协议 是 redis 的应用层协议,全称 Redis serialization protocol

优点:

  • 简单好实现
  • 快速解析
  • 肉眼可读
    请求和响应之间的通信模型是一问一答的形式

客户端给服务器发送的是 redis 命令,(bulk string 数组形式发送)

服务器根据命令返回不同的结果,有的返回 ok,有的返一个整数或数组,且通过第一字节告诉客户端怎么解析。

simple string 只能用来传输文本,bulk string 可以传输二进制数据

后文,就要使用代码操作 redis 了,redis 支持 50+ 种语言,几乎包含了所有的常用语言,后面以 Java 进行

10. Redis 在 Java 中的使用

10.1 引入依赖

xml 复制代码
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>4.3.2</version>
</dependency>

10.2 配置端口转发

由于 redis 是部署在 云服务器 上的,没办法之间访问,若是开发 redis 的 6379 端口,则很有可能被黑客攻击,造成损失。

解决办法:配置 ssh 端口转发,将服务器上的 redis 端口映射到本地。

ssh 是一个程序,默认走 22 端口,功能强大,端口转发就是它的一项功能,即通过 ssh 的 22 端口,来传递其他端口的数据。

ssh 会监听本地映射的端口,将本地端口数据发送到服务器端口,服务器上的数据发送到本地。

右击图标,选择属性

点击 ssh 下的隧道,添加新隧道

上面的端口填要映射到的本地端口,下边填服务器上 redis 的端口

除此之外,最开始按照 redis 时要配置绑定的 ip 并关闭保护模式。

默认绑定 ip 是 127.0.0.1 只能本机访问,跨机无法访问。

保护模式默认是 yes,即开启保护模式,此时跨主机也无法访问。

具体配置,见之前的文章。

10.3 部分基本操作

java 复制代码
package com.example.demo;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;

import java.util.Iterator;
import java.util.Set;

public class RedisDemo {

    public static void test1(Jedis jedis) {
        System.out.println("get, set 使用");
        jedis.flushDB();
        jedis.set("key1","111");
        jedis.set("key2","222");
        SetParams setParams = new SetParams();
        setParams.ex(10);
        setParams.xx();
        jedis.set("key1","333",setParams);
        System.out.println(jedis.get("key1"));
        System.out.println(jedis.get("key2"));
    }

    public static void test2(Jedis jedis) {
        System.out.println("exist, del 使用");
        jedis.flushDB();
        jedis.set("key1","111");
        jedis.set("key2","222");
        boolean key1 = jedis.exists("key1");
        System.out.println(key1);

        long del = jedis.del("key1", "key2");
        System.out.println(del);

        long exists = jedis.exists("key1", "key2");
        System.out.println(exists);

    }

    public static void test3(Jedis jedis) {
        System.out.println("keys 使用");
        jedis.flushDB();
        jedis.set("key1","111");
        jedis.set("key2","222");
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);

    }


    public static void test4(Jedis jedis) {
        System.out.println("expire, ttl 使用");
        jedis.flushDB();
        jedis.set("key1","111");
        jedis.expire("key1",10);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long ttl = jedis.ttl("key1");
        System.out.println(ttl);
    }

    public static void test5(Jedis jedis) {
        System.out.println("type 使用");
        jedis.flushDB();
        jedis.set("key1","111");
        jedis.hset("key2", "field", "123");
        jedis.lpush("key3", "123456");
        jedis.sadd("key4","12346","123");
        jedis.zadd("key5",99.9,"789");
        Set<String> keys = jedis.keys("*");
        Iterator<String> iterator = keys.iterator();
        while(iterator.hasNext()) {
            String next = iterator.next();
            System.out.println(next);
            System.out.println(jedis.type(next));
        }


    }


    public static void main(String[] args) {
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:6379");
        try (Jedis jedis = jedisPool.getResource()){
//            System.out.println(jedis.ping());

//            test1(jedis);

//            test2(jedis);

//            test3(jedis);

//            test4(jedis);


            test5(jedis);
        }
    }
}

操作很简单,和 redis 命令行时的命令基本一致,无非是多加了一个 jedis,这里不再赘述其他的命令。

11. Redis 在 Spring Boot 中的使用

11.1 引入依赖

创建项目时,在 NoSQL 下选择 Spring Data Redis 加入。

或在 pom 文件中添加:

xm 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

11.2 配置文件配置

yml 复制代码
spring:
  data:
    redis:
      port: 6379
      host: localhost

因为在 10.2 小节中,我们已经进行了端口配置,这里就填 本机 IP 和 映射到本地的端口

11.3 部分基本操作

Spring 中 string,hash,list,set,zset 的命令都封装到了 opsForXXX 下。如果想用原命令则在 execute

Spring 中通过 RedisTemplate 接口操作 Redis,下面的 StringRedisTemplate 是针对 文本内容的接口实现

java 复制代码
package com.example.demo.springredis.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/redis")
@RestController
public class RedisController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping("/string")
    public String set() {
        stringRedisTemplate.opsForValue().set("key1","1");
        stringRedisTemplate.opsForValue().set("key2","2");
        stringRedisTemplate.opsForValue().set("key3","3");
        String key1 = stringRedisTemplate.opsForValue().get("key1");
        System.out.println(key1);
        return "OK";
    }

    @RequestMapping("/list")
    public String testList() {
        stringRedisTemplate.execute((RedisConnection connection) ->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForList().leftPush("key1","111");
        stringRedisTemplate.opsForList().leftPush("key1","222");
        stringRedisTemplate.opsForList().leftPush("key1","333");


        System.out.println(stringRedisTemplate.opsForList().range("key1", 0, -1));

        System.out.println(stringRedisTemplate.opsForList().rightPop("key1"));
        System.out.println(stringRedisTemplate.opsForList().rightPop("key1"));
        System.out.println(stringRedisTemplate.opsForList().rightPop("key1"));
        return null;
    }


    @RequestMapping("/set")
    public String testSet() {
        stringRedisTemplate.execute((RedisConnection connection) ->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForSet().add("key1","111","222","333");

        System.out.println(stringRedisTemplate.opsForSet().members("key1"));
        System.out.println(stringRedisTemplate.opsForSet().isMember("key1","111"));

        System.out.println(stringRedisTemplate.opsForSet().size("key1"));

        stringRedisTemplate.opsForSet().remove("key1","111");
        System.out.println(stringRedisTemplate.opsForSet().members("key1"));
        return null;
    }


    @RequestMapping("/hash")
    public String testHash() {
        stringRedisTemplate.execute((RedisConnection connection) ->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForHash().put("key1","111","1");
        stringRedisTemplate.opsForHash().put("key1","222","2");
        stringRedisTemplate.opsForHash().put("key1","333","3");

        System.out.println(stringRedisTemplate.opsForHash().entries("key1"));
        System.out.println(stringRedisTemplate.opsForHash().hasKey("key1","111"));
        System.out.println(stringRedisTemplate.opsForHash().size("key1"));

        System.out.println((String) stringRedisTemplate.opsForHash().get("key1", "111"));
        return null;
    }

    @RequestMapping("/zset")
    public String testZset() {
        stringRedisTemplate.execute((RedisConnection connection) ->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForZSet().add("key1","111",1);
        stringRedisTemplate.opsForZSet().add("key1","222",2);
        stringRedisTemplate.opsForZSet().add("key1","333",3);

        System.out.println(stringRedisTemplate.opsForZSet().rangeWithScores("key1", 0, -1));
        System.out.println(stringRedisTemplate.opsForZSet().score("key1","111"));
        System.out.println(stringRedisTemplate.opsForZSet().size("key1"));

        stringRedisTemplate.opsForZSet().remove("key1","111");

        System.out.println(stringRedisTemplate.opsForZSet().rangeWithScores("key1", 0, -1));
        return null;
    }
}
相关推荐
笨蛋不要掉眼泪4 分钟前
Spring Boot + RedisTemplate 数据结构的基础操作
java·数据结构·spring boot·redis·wpf
打工的小王8 分钟前
java并发编程(六)CountDownLatch和回环屏障CyclicBarrier
java·开发语言
知识即是力量ol12 分钟前
深度解析:基于 JWT + Redis 白名单的双令牌高安全认证架构
redis·安全·架构
nbsaas-boot17 分钟前
如何进行 Vibe Coding:从“灵感驱动”到“可交付工程”的方法论
java·ai编程
陌上丨19 分钟前
什么是Redis的大Key和热Key?项目中一般是怎么解决的?
数据库·redis·缓存
Remember_99320 分钟前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
roman_日积跬步-终至千里25 分钟前
【Java并发】用 JMM 与 Happens-Before 解决多线程可见性与有序性问题
java·开发语言·spring
空空kkk25 分钟前
SSM项目练习——hami音乐(三)
java·数据库
爬山算法33 分钟前
Hibernate(78)如何在GraphQL服务中使用Hibernate?
java·hibernate·graphql
独断万古他化38 分钟前
【Spring 核心:AOP】基础到深入:思想、实现方式、切点表达式与自定义注解全梳理
java·spring·spring aop·aop·切面编程