Redis实战:Redis在Java中的基本使用

news2024/11/27 0:34:11

本片将介绍 Redis 在 Java 中的基本使用


文章目录

        • 1、使用jedis操作redis
          • 1.1、Jedis简介
          • 1.2、引入jedis的Maven依赖
          • 1.2、获取连接
          • 1.3、使用实例
        • 2、对于JedisPooled的使用
          • 2.1、使用JedisPooled
          • 2.2、关于连接池
        • 3、SpringBoot下使用Redis
          • 3.1、引入Maven依赖
          • 3.2、配置Redis连接
          • 3.3、创建RedisTemplate
        • 3.4、使用RedisTemplate


1、使用jedis操作redis

1.1、Jedis简介

Jedis 是 Java 语言开发的 Redis 客户端工具包,用于 Java 语言与 Redis 数据进行交互。

Jedis 在 github 官网地址:https://github.com/redis/jedis#readme

Jedis 只是对 Redis 命令的封装,掌握 Redis 命令便可轻易上手 Jedis。

Jedis 遵循 RESP 协议规范开发,具有良好的通用性与可读性。

1.2、引入jedis的Maven依赖
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.4.3</version>
        </dependency>
1.2、获取连接

对于许多应用程序,需要连接到 Redis 时。最好使用连接池。可以像这样实例化一个 Jedis 连接池:

JedisPool pool = new JedisPool("localhost", 6379);

对于 JedisPool 实例,可以使用 try-With-resources 块获得连接并运行 Redis 命令(这种方式无须自己手动 close)。

try (Jedis jedis = pool.getResource()) {
	// 运行单个 SET 命令
  jedis.set("clientName", "Jedis");
}
1.3、使用实例

编写以下代码:

    public static void main(String[] args) {
        // Redis服务端IP和端口号
        JedisPool pool = new JedisPool("127.0.0.1", 6379);
        try (Jedis jedis = pool.getResource()) {
            // 使用相关Redis的命令
            // 选择第0个数据库进行操作
            jedis.select(0);
            // 向0号数据库写入,字符串数据
            jedis.set("Java", "best");
            jedis.set("PHP", "good");
            // 查询是否写入
            System.out.println(jedis.get("Java"));
            System.out.println(jedis.get("PHP"));
        }
    }

运行测试用例:

image-20230812233428661

Jedis 实例实现了大多数 Redis 命令,这些命令可以在 https://www.javadoc.io/doc/redis.clients/jedis/latest/redis/clients/jedis/Jedis.htmlApI 中查询命令对应的方法。

image-20230812233859534


2、对于JedisPooled的使用

2.1、使用JedisPooled

对每个命令使用 try-with-resources 块可能比较麻烦,因此我们可以考虑使用 JedisPooled。

JedisPooled jedis = new JedisPooled("localhost", 6379);

详细代码:

    public static void main(String[] args) {
        JedisPooled pool = new JedisPooled("127.0.0.1", 6379, null, null);
        pool.set("Java", "best");
        pool.set("PHP", "good");
        System.out.println(pool.get("Java"));
        System.out.println(pool.get("PHP"));
    }

运行效果:

image-20230812233428661

2.2、关于连接池

使用链接池是官方推荐的使用方式,通过连接池可以更好的使用 Jedis 的,我们可以通过 GenericObjectPoolConfig 对连接池进行相关配置,GenericObjectPoolConfig API 文档:https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/GenericObjectPoolConfig.html

通过 GenericObjectPoolConfig 对象对连接池进行配置,具体代码如下:

    public static void main(String[] args) {
        GenericObjectPoolConfig config = new JedisPoolConfig();
        // 设置连接池中最多允许放100个Jedis对象
        config.setMaxTotal(100);
        // 设置连接池中最大允许空闲连接
        config.setMaxIdle(100);
        // 设置连接池中最小允许的连接数
        config.setMinIdle(10);
        // 借出连接的时候是否测试有效性,推荐false
        config.setTestOnBorrow(false);
        // 归还时是否测试,推荐false
        config.setTestOnReturn(false);
        // 创建时是否测试有效  开发的时候设置为false,实践运行的时候设置为true
        config.setTestOnCreate(false);
        // 当连接池内jedis无可用资源时,是否等待资源,true
        config.setBlockWhenExhausted(true);
        // 没有获取资源时最长等待1秒,1秒后没有还没有的话就报错
        config.setMaxWaitMillis(1000);

        JedisPool pool = new JedisPool(config, "127.0.0.1", 6379);

        try (Jedis jedis = pool.getResource()) {
            // 使用相关Redis的命令
            // 选择第0个数据库进行操作
            jedis.select(0);
            // 向0号数据库写入,字符串数据
            jedis.set("Java", "best");
            jedis.set("PHP", "good");

            // 查询是否写入
            System.out.println(jedis.get("Java"));
            System.out.println(jedis.get("PHP"));
        }
    }

运行效果:

image-20230812233428661


3、SpringBoot下使用Redis

3.1、引入Maven依赖

首先,需要在 pom.xml 文件中添加 Redis 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

这个依赖包含了 Spring Data Redis,以及 Jedis 和 Lettuce 这两种 Redis 客户端的实现。

3.2、配置Redis连接

在 SpringBoot 项目中,可以通过在 application.properties 或 application.yml 文件中配置 Redis 连接信息。以下是一个示例:

spring:
  data:
    redis:
      timeout: 3000
      database: 0
      password: password
      port: 6379
      host: localhost

其中,host 和 port 分别是 Redis 服务器的地址和端口号,password 是 Redis的密码(如果没有密码,可以不填),timeout 是 Redis 连接超时时间,jedis.pool 是连接池的相关设置。

3.3、创建RedisTemplate

使用 Spring Data Redis 操作 Redis,通常会使用 RedisTemplate 类。为了方便起见,我们可以创建一个工具类来管理 RedisTemplate 的创建和使用。以下是一个示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {

    /**
     * 如果使用 @Autowired 注解完成自动装配 那么
     * RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>
     * 如果你使用其他类型的 比如RedisTemplate<String,Object>
     * 那么请使用 @Resource 注解
     * */
    @Resource
    private RedisTemplate<String,Object> redisTemplate;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 缓存value
     *
     * @param key -
     * @param value -
     * @param time -
     * @return -
     */
    public boolean cacheValue(String key, Object value, long time) {
        try {
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            valueOperations.set(key, value);
            if (time > 0) {
                // 如果有设置超时时间的话
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Throwable e) {
            logger.error("缓存[" + key + "]失败, value[" + value + "] " + e.getMessage());
        }
        return false;
    }

    /**
     * 缓存value,没有设置超时时间
     *
     * @param key -
     * @param value -
     * @return -
     */
    public boolean cacheValue(String key, Object value) {
        return cacheValue(key, value, -1);
    }

    /**
     * 判断缓存是否存在
     *
     * @param key
     * @return
     */
    public boolean containsKey(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Throwable e) {
            logger.error("判断缓存是否存在时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return false;
    }

    /**
     * 根据key,获取缓存
     *
     * @param key -
     * @return -
     */
    public Object getValue(String key) {
        try {
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            return valueOperations.get(key);
        } catch (Throwable e) {
            logger.error("获取缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return null;
    }

    /**
     * 移除缓存
     *
     * @param key -
     * @return -
     */
    public boolean removeValue(String key) {
        try {
            redisTemplate.delete(key);
            return true;
        } catch (Throwable e) {
            logger.error("移除缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return false;
    }

    /**
     * 根据前缀移除所有以传入前缀开头的key-value
     *
     * @param pattern -
     * @return -
     */
    public boolean removeKeys(String pattern) {
        try {
            Set<String> keySet = redisTemplate.keys(pattern + "*");
            redisTemplate.delete(keySet);
            return true;
        } catch (Throwable e) {
            logger.error("移除key[" + pattern + "]前缀的缓存时失败", "err[" + e.getMessage() + "]");
        }
        return false;
    }

}

在这个示例中,我们使用 @Resource 注解自动注入了一个 RedisTemplate<String, Object> 对象。然后,我们提供了三个方法来对 Redis 进行操作:cacheValue 方法用于缓存数据,getValue 方法用于获取缓存数据,removeValue 方法用于删除缓存数据。这些方法都是通过 redisTemplate 对象来实现的。

需要注意的是,在使用 RedisTemplate 时,需要指定键值对的类型。在这个示例中,我们指定了键的类型为 String,值的类型为 Object。

3.4、使用RedisTemplate

在上面的示例中,我们已经创建了一个 RedisTemplate 对象,并提供了一些方法来对 Redis 进行操作。现在,我们可以在 SpringBoot 项目中的任何地方使用这个工具类来进行缓存操作。以下是一个示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private RedisUtils redisUtils;

    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {

        String key = "user_" + id;
        User user = (User) redisUtils.getValue(key);
        if (user == null) {
            user = userService.getUserById(id);
            redisUtils.cacheValue(key, user);
        }
        return user;
    }
}

在这个示例中,我们创建了一个 UserController 类,用于处理 HTTP 请求。在 getUserById 方法中,我们首先构造了一个缓存的 key,然后使用 redisUtils.getValue 方法从 Redis 中获取缓存数据。如果缓存中没有数据,我们调用 userService.getUserById 方法从数据库中获取数据,并使用 redisUtils.cacheValue 方法将数据存入Redis缓存中。最后,返回获取到的数据。

通过这个示例,我们可以看到,在S pringBoot 项目中使用 Redis 作为缓存的流程。我们首先需要添加 Redis 依赖,然后在配置文件中配置 Redis 连接信息。接着,我们创建了一个 RedisUtil s工具类来管理 RedisTemplate 的创建和使用。最后,我们在控制器中使用 RedisUtils 来对 Redis 进行缓存操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言入门log03

2023.9.19 周二 江苏 软件&#xff1a;visual studio 2017 &#xff1b;注释快捷键 ctrlkc&#xff1b;取消ctrlku;运行快捷键 ctrlf5 B站视频 P4 按位取反~ int main() {//int arr[] {1,2,3,4,5,6};//4*624//printf("%d\n",sizeof(arr));//24 数组大小//print…

第14章 结构和其他数据形式

本章介绍以下内容&#xff1a; 关键字&#xff1a;struct、union、typedef 运算符&#xff1a;.、-> 什么是C结构&#xff0c;如何创建结构模板和结构变量 如何访问结构的成员&#xff0c;如何编写处理结构的函数 联合和指向函数的指针 设计程序时&#xff0c;最重要的步骤之…

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式&#xff1f; &#xff08;设计模式是什么&#xff1f;优点有哪些&#xff1f;&#xff09; 设计模式是一套经过验证的有效的软件开发指导思想/解决方案&#xff1b;提高代码的可重用性和可维护性&#xff1b;提高团…

DAQ高频量化平台:引领Ai高频量化交易模式变革

近年来&#xff0c;数字货币投资市场掀起了一股热潮&#xff0c;以&#xff08;BTC&#xff09;为代表的区块链技术带来了巨大的商业变革。数字资产的特点&#xff0c;如无国界、无阶级、无门槛、高流动性和高透明度&#xff0c;吸引了越来越多的人们的关注和认可&#xff0c;创…

linux内网渗透

一、信息收集 主机发现&#xff1a; nmap -sP 192.168.16.0/24 端口探测 masscan -p 1-65535 192.168.16.168 --rate1000 开放端口如下 nmap端口详细信息获取 nmap -sC -p 8888,3306,888,21,80 -A 192.168.16.168 -oA ddd4-port目录扫描 gobuster dir…

Windows安装GPU版本的pytorch详细教程

文章目录 chatGLM2-6B安装教程正式安装 chatGLM2-6B ChatGLM2-6B版本要装pytorch2.0&#xff0c;而且要2.0.1 &#xff0c;因此CUDA不能用12.0 &#xff0c;也不能用10.0&#xff0c;只能用11.x 版本。 安装教程 pip install直接下载安装 官网&#xff1a; https://pytorch.…

Python语言学习实战-内置函数all()和any()的使用(附源码和实现效果)

实现功能 all()和any()函数都是Python的内置函数&#xff0c;用于对布尔值进行操作。 all()函数接受一个可迭代对象作为参数&#xff0c;如果可迭代对象中所有元素都为真值&#xff08;即非零、非空、非None等&#xff09;&#xff0c;则返回True&#xff0c;否则返回False。…

VR全景需要加盟吗?简述VR全景加盟的意义

对于一个刚开始了解VR全景行业的新人来说&#xff0c;VR全景不是有软件、有设备、会拍摄就行了吗&#xff1f;为什么还要找全景平台进行加盟呢&#xff1f;VR全景加盟的作用又是什么呢&#xff1f;那么&#xff0c;我们就不得不多问几个问题了&#xff0c;例如不加盟的话&#…

企业级数据仓库-理论知识

D3 AM 大数据中间件 Hive&#xff1a;将SQL转化成分布式Map/Reduce进行运算&#xff0c;也支持转换成Spark,需要单独安装Hive集群才能访问Spark,支持60%的SQL&#xff0c;延迟比较大。SparkSQL:属于Spark生态圈&#xff0c;Hive on Sqark。HBase: NoSQL,高并发读&#xff0c;适…

霓虹灯效果

源码&#xff1a; void neon(Mat& src,Mat& dst) {for (int i 1; i < src.rows - 1; i) {for (int j 1; j < src.cols - 1; j){int r1, r2, r3, g1, g2, g3, b1, b2, b3;r1 src.at<Vec3b>(i, j)[2];r2 src.at<Vec3b>(i 1, j)[2];r3 src.at<…

Mac 错误zsh: command not found: brew解决方法

打开iterm或其他shell终端&#xff0c;执行命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择下载brew的源&#xff0c;输入1~6任意都行 根据提示输入Y及开机密码 最后执行&#xff1a;source ~/.z…

Jenkins自动化测试

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 它…

应用(Application)部署容器化演进之路

目录 一、应用程序部署痛点 1.1 应用程序部署流程 1.2 应用程序扩缩容 1.3 应用程序多环境部署 二、 计算资源应用演进过程 2.1 使用物理服务器痛点 2.2 使用虚拟机优点与缺点 2.2.1 使用虚拟机优秀点 2.2.2 使用虚拟机缺点 2.3 使用容器的优点与缺点 2.3.1 使用容器…

中国提出FastSAM:在RTX3090上提升了ViT-H E(32×32) 50倍速度

文章目录 1. Abstract2. 背景介绍3. 框架详情 (Methodology)3.1 Overview3.2 All-instance Segmentation3.3 Prompt-guided Selection4. Experiments4.1 Run-time Efficiency Evaluation4.2 Zero-Shot Edge Detection4.2.1 BSDS5004.2.2 Sobel filtering4.2.3 NMS4.3 Zero-Shot…

最优化方法——Matlab实现黄金分割法一维搜索

文章目录 黄金分割法一维搜索原理算法流程&#xff1a; Matlab代码命令行窗口结果打印&#xff1a;《最优化方法》教材上写成表的答案&#xff1a;黄金分割法的一些性质 黄金分割法一维搜索原理 若保留区间为[x1,b],我们得到的结果是一致的. 该方法称为黄金分割法,实际计算取近…

编译工具:CMake(七) | cmake 常用变量和常用环境变量

编译工具&#xff1a;CMake&#xff08;七&#xff09; | cmake 常用变量和常用环境变量 cmake 变量引用方式cmake 自定义变量的方式cmake 常用变量总结 cmake 变量引用方式 cmake使用${}进行变量的引用。 在 IF 等语句中&#xff0c;是直接使用变量名而不通过${}取值 cmake…

京东全店商品采集教程(详解京东店铺所有商品数据采集步骤方法和代码示例)

随着电商行业的快速发展&#xff0c;京东已成为国内的电商平台之一&#xff0c;拥有着海量的商品资源。对于一些需要大量商品数据的商家或者需求方来说&#xff0c;京东全店采集是非常必要的。本文将详细介绍京东全店采集的步骤和技巧&#xff0c;帮助大家更好地完成数据采集任…

基于Spark的K-means快速聚类算法的优化

摘要 1 引言 2 相关研究 2.1 Spark计算框架 2.2 K-means算法 2.3 K-means++算法

Python异步编程高并发执行爬虫采集,用回调函数解析响应

一、问题&#xff1a;当发送API请求&#xff0c;读写数据库任务较重时&#xff0c;程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用&#xff0c;经常面临对外发送网络请求&#xff0c;调用外部接口&#xff0c;或者不断更新数据库或文…

位深bitdepth是什么

bitdepth bit depth/color depth到底是什么&#xff0c;其对视频有何影响&#xff1f; 数字数据比如数字视频、数字照片等&#xff0c;都是以二进制存储的&#xff0c;那么其一个最小的数据单元就是一位bit&#xff0c;比特位中只有0或1两种值。为了方便处理&#xff0c;把多…