Redis在Java中的基本使用

这篇具有很好参考价值的文章主要介绍了Redis在Java中的基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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



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"));
        }
    }

运行测试用例:

Redis在Java中的基本使用,中间件,redis,java,数据库

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

Redis在Java中的基本使用,中间件,redis,java,数据库


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"));
    }

运行效果:

Redis在Java中的基本使用,中间件,redis,java,数据库

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"));
        }
    }

运行效果:

Redis在Java中的基本使用,中间件,redis,java,数据库


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 进行缓存操作。文章来源地址https://www.toymoban.com/news/detail-661247.html

到了这里,关于Redis在Java中的基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 中间件: Redis安装与部署

    集群部署 启动6个redis节点 扩缩容 https://blog.csdn.net/lzb348110175/article/details/122168638 扩容: 添加两个节点, 第一个节点表示新节点,第二个节点表示集群中已有的任意一个节点 分配slot, 后面的节点是已有的节点 添加slave, 第一个为slave, 第二个为slave对应的master 缩容: 查看集

    2024年02月12日
    浏览(46)
  • Go重写Redis中间件 - Go实现Redis集群

    这章的内容是将我们之前实现的单机版的Redis扩充成集群版,给Redis增加集群功能,在增加集群功能之前,我们先学习一下在分布式系统中引用非常广泛的技术一致性哈希,一致性哈希在我们项目里就应用在我们Redis集群的搭建这块 详解一致性哈希 Redis集群需求背景 单台服务

    2024年02月13日
    浏览(45)
  • 缓存中间件Redis必知必会

    作者: 逍遥Sean 简介:一个主修Java的Web网站游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 前言: 本文是对redis的基本用法操作的整理。 如果需要在linux环境中搭建一个redis服务参考

    2024年02月11日
    浏览(50)
  • 基于 Docker 的 Spring Boot 项目部署演示,其中使用了 Redis、MySQL 和 RabbitMQ 中间件

    这是一个基于 Docker 的 Spring Boot 项目部署演示,其中使用了 Redis、MySQL 和 RabbitMQ 中间件。 拉取 MySQL 镜像: 创建 MySQL 容器: 将 密码 、 数据库名 、 用户名 和 密码 替换为您自己的值。 拉取 Redis 镜像: 创建 Redis 容器: 拉取 RabbitMQ 镜像: 创建 RabbitMQ 容器: 构建和运行

    2024年02月06日
    浏览(58)
  • Go重写Redis中间件 - Go实现Redis协议解析器

    Redis网络协议详解 在解决完通信后,下一步就是搞清楚 Redis 的协议-RESP协议,其实就是一套类似JSON、Protocol Buffers的序列化协议,也就是我们的客户端和服务端通信的协议 RESP定义了5种格式 简单字符串(Simple String) : 服务器用来返回简单的结果,以\\\"+\\\"开头,\\\"rn\\\"结尾的字符串形

    2024年02月15日
    浏览(51)
  • Go重写Redis中间件 - Go实现Redis持久化

    项目开发到这里,我们的下一步就是实现Redis的持久化落盘功能,Redis是一个内存型的数据库,在之前我们实现的单机版Redis如果把进程杀掉,我们通过GET、SET指令存储的数据都将不复存在,数据只存在内存的map里面,重启之后什么都没有了 我们现在的目标就是把用户发来的指

    2024年02月14日
    浏览(52)
  • 微服务中间件-分布式缓存Redis

    – 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: 1.数据丢失问题: Redis是内存存储,服务重启可能会丢失数据 2.并发能力问题: 单节点Redis并发能力虽然不错,但也无法满足如618这样的高并发场景 3.故障恢复问题: 如果Redis宕机,则服务不可用,需要一种自动

    2024年02月12日
    浏览(68)
  • 中间件系列 - Redis入门到实战(原理篇)

    学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 学习目标 Redis数据结构 Redis网络模型 Redis通信协议-RESP协议 我们都知道Redis中保

    2024年02月03日
    浏览(49)
  • 【缓存中间件】Redis哈希槽的概念

    分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。。 需要重点关注的是数据分区规则。常见的分区规则有哈希分区和顺序分区两种,哈希分区离散度好、数据分布业务无关、无法顺

    2024年02月13日
    浏览(44)
  • 常用中间件redis,kafka及其测试方法

    一、中间件的使用场景 引入中间件的目的一般有两个: 1、提升性能 产品架构中的性能设计: 常用的中间件: 1) 高速缓存:redis 基于内存,所以比mysql块(存在磁盘io) 为什么查询速度快? 单进程+IO多路复用去提高性能 基于内存 做缓存,极大缓解了数据库压力 非常适合

    2024年04月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包