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;
    }
}
相关推荐
骇客野人3 小时前
通过脚本推送Docker镜像
java·docker·容器
铁蛋AI编程实战3 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘3 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10113 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
喵叔哟4 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
摇滚侠4 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.4 小时前
java多态
java·开发语言·c++
李堇4 小时前
android滚动列表VerticalRollingTextView
android·java
泉-java4 小时前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
Charlie_lll4 小时前
力扣解题-移动零
后端·算法·leetcode