redis(四)—— java如何操作redis、springboot集成redis

news2024/11/17 1:28:43

一、java如何操作redis——Jedis

  • jedis的“j”就是java
  • jedis是java官方推荐的java操作redis工具,是一个非可视化的客户端redis-client
  • springboot的redisTemplate对象就相当于这里的jedis对象(redisTemplate去调用一系列方法不就相当于jedis这个client去调用一系列方法吗?remember一下ES的client),虽然以后工作中都是用springboot集成redis,也就是说以后不会再用jedis了。但是我们还是要学习一下。

1、导入依赖

需要两个依赖,一个肯定是jedis依赖。再就是需要把java对象转Json,那就需要一个JSON包,这里我们用fastjson

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.4.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.79</version>
        </dependency>

2、配置

不用配,服务器地址和端口号待会在方法里去配

3、Jedis 的API跟redis命令一模一样

测试连接成功否

public class demo {
    public static void main(String[] args) {
       Jedis j = new Jedis("121.36.42.22",6380);
       j.auth("CsiFlow!@#680");  // 密码
       System.out.println(j.ping());  //返回“PING”则成功
    }
}

二、springboot集成redis

1、新建一个springboot项目

2、添加redis依赖包

可以在新建项目的时候就选上

 也可以建完项目以后手动导入pom.xml

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

3、配置

在application.yml文件中进行如下配置:

spring:
    redis:
      host: 121.36.42.22
      port: 6380
      # 数据库索引
      database: 0
      password: CsiFlow!@#680
      # 连接超时时间
      connect-timeout: 10s
      # springboot2.x之后把jedis换成了lettuce
      lettuce:
        pool:
          min-idle: 0 # 最小空闲连接
          max-idle: 8  # 最大空闲连接
          max-active: 8  # 连接池的最大连接数
          max-wait: -1ms  # 连接池的最大阻塞等待时间(负值表示没有限制

 PS: 在springboot2.x之后把原来使用的jedis换成了lettuce,因为jedis线程不安全,而lettuce的底层是netty,新能更高。并且jedis从spring-boot-starter-data-redis源码中扣除了,也就是springboot2.x以后只能用lettuce了。

4、看自动配置的源码

 应该找到RedisAutoConfiguration才对

 但是我们在这里找到了这个文件

 找到了其配置文件所在类RedisProperties

 在这里可以看到都有什么可配置项(在application.yml里),有什么已经配好默认值了。

@AutoConfiguration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)  //指明配置文件
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(name = "redisTemplate")  //ConditionalOnMissingBean注解,如果我们自己写了一个redisTemplate的bean就替代默认的这个
	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {  //默认的redisTemplate是<Object,Object>类型的,但是我们一般会自己写一个<String,Object>类型的
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

	@Bean  //因为String类型是redis最常用的类型,所以单独给这个类型写了一个redisTemplate
	@ConditionalOnMissingBean 
	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
		return new StringRedisTemplate(redisConnectionFactory);
	}

}

5、常用操作

先@Autowired注入自动配置好的redisTemplate,然后redisTemplate可以调用一系列方法,这些方法对应我们redis里的指令。

6、上手测试

@SpringBootTest
class SpringbootMybatisApplicationTests {

    @Resource
    RedisTemplate redisTemplate;

    @Test
    public void test01(){
        redisTemplate.opsForValue().set("mykey","Tuesday");
        System.out.println(redisTemplate.opsForValue().get("mykey"));
    }

}

测试成功

 所以数据写到我们在application.yml里配置的db0里面去了吗?是这样的。但是前面有一串符号,这是redis控制台的原因,设置一下就好了

三、自定义redisTemplate实现java对象序列化

企业实际开发中,所有的pojo类都要implements Serializable实现序列化! 

        实体类可序列化以后,就可以直接传这个对象了。

        但是我们在学 implements serializable的时候就说过,实际开发中并不使用这种JDK自带的序列化方式,之前就介绍过原因:

         企业中通常采用的是JSON这种文本类序列化的方式,酱紫:

    @Test
    public void test01(){
        // 1.从数据库中取出一条数据,转为java对象
        Blog blogs = blogMapper.selectById(2);
        // 2.java对象-->json
        String blogString = JSON.toJSONString(blogs);
        // 3. 存到redis里
        redisTemplate.opsForValue().set("blog",blogString);
    }

如果我们还想再简化一点,不需要每次存redis的时候都调用JSON.toJSONString,那就重写redisTemplate,直接指定序列化方式!下面给出固定模板:

/**
 * redis配置
 */
@Configuration
public class RedisConfig {

    @Bean
    @SuppressWarnings("all")
                        //<String, Object>是我们最常用的类型
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
        template.setConnectionFactory(factory);

        //配置:用jackson进行Json序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        
        //String的序列化方式
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        
        //key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        //hash的key采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value采用jackson序列化方式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash的value也采用jackson序列化方式
        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();
        return template;
    }

}

然后我们会封装一个RedisUtils.java工具类,这样我们调用redis方法的时候会更加简单。

package com.example.demo.springbootmybatis.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component  //别忘了注入这个工具类
public final class RedisUtils {

    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * set命令
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key,Object value){
        try {
            redisTemplate.opsForValue().set(key,value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * get命令
     * @param key
     * @return
     */
    public Object get(String key){
        return (key == null)? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 指定key的时效时间
     * @param key
     * @param time
     * @return
     */
    public boolean expire(String key, long time){
        try {
            if(time > 0){
                redisTemplate.expire(key,time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 还有其他命令,在RedisUtils工具类里要写30多个勒
     */

}

测试一下:

    @Autowired
    @Qualifier("redisUtils")
    RedisUtils redisUtils;
   
    @Test
    public void test02(){
        Blog blog1 = blogMapper.selectById(2);
        redisUtils.set("blog1",blog1);
        System.out.println(redisUtils.get("blog1"));
    }

变得如此丝滑~

而且在控制台里没有乱码了

 

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

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

相关文章

使用java将个人微信打造成得力助手

本文提供一个通过java编程将微信打造成得力助手的方案, 先看效果&#xff1a; 查看支持的功能与对该功能开放的用户 接入人工智能 下载BiliBili 视频 原理 这个方案最难的地方就是如何把个人账号安全的接入微信&#xff0c;不会被封号。网上主流的有逆向web端微信&#xff0c…

KY258 日期累加

一、题目 二、代码 #include <iostream> using namespace std; class Date {public:Date(int year 0, int month 0, int day 0) {_year year;_month month;_day day;}Date(const Date& _d);int GetDay(int year, int month);Date& operator(int d);Date o…

this is incompatible with sql_mode=only_full_group_by

查看配置 select global.sql_mode 在sql命令行中输入select sql_mode 能够看到sql_mode配置,如果有ONLY_FULL_GROUP_BY&#xff0c;则需要修改 在mysql5.7.5后&#xff0c;ONLY_FULL_GROUP_BY是默认选项&#xff0c;所以就会导致group by的问题 set sql_mode‘复制去掉ONLY_F…

Python(五十)获取列表中指定的元素

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

嵌入式linux之OLED显示屏SPI驱动实现(SH1106,ssd1306)

周日业余时间太无聊&#xff0c;又不喜欢玩游戏&#xff0c;大家的兴趣爱好都是啥&#xff1f;我觉得敲代码也是一种兴趣爱好。正巧手边有一块儿0.96寸的OLED显示屏&#xff0c;一直在吃灰&#xff0c;何不把玩一把&#xff1f;于是说干就干&#xff0c;最后在我的imax6ul的lin…

BUU [BJDCTF2020]The mystery of ip

BUU [BJDCTF2020]The mystery of ip 再hint的源码里面找到这个东西。 这题一定和IP有关系&#xff0c;试了一下伪造IP还真是。 分析一下&#xff0c;这题可能存在SSTI漏洞&#xff0c;先用模板算式子{{9*‘9’}}测一下 那SSTI稳了&#xff0c;应该是Twig模板。 但是报错测出来是…

Android 面试题 线程间通信 六

&#x1f525; 主线程向子线程发送消息 Threadhandler&#x1f525; 子线程中定义Handler&#xff0c;Handler定义在哪个线程中&#xff0c;就跟那个线程绑定&#xff0c;在线程中绑定Handler需要调用Looper.prepare(); 方法&#xff0c;主线程中不调用是因为主线程默认帮你调用…

编写脚本,使用mysqldump实现分库分表备份。

一、实现分库备份&#xff1a; #!/bin/bash #分库备份 bak_userroot-----------备份用户 bak_password513721ykp--------备份密码 bak_path/backup/db_bak---------备份路径 bak_cmd"-u$bak_user -p$bak_password"-------登录命令&#xff0c;以便后面重复编写 exc_…

分布式锁漫谈

简单解释一下个人理解的分布式锁以及主要的实现手段。 文章目录 什么是分布式锁常用分布式锁实现 什么是分布式锁 以java应用举例&#xff0c;如果是单应用的情况下&#xff0c;我们通常使用synchronized或者lock进行线程锁&#xff0c;主要为了解决多线程或者高并发场景下的共…

3ds MAX绘制摄像机动画

之前&#xff0c;我们已经绘制了山地、山间小路、以及树林&#xff1a; 这里我们添加一个自由摄像机&#xff1a;&#xff08;前视图&#xff09; 在动作窗口&#xff0c;给摄像机添加一个按路径移动的设定&#xff1a; 这样&#xff0c;我们只要把指定的路径绘制出来&#xff…

UE4/5C++多线程插件制作(0.简介)

目录 插件介绍 插件效果 插件使用 English 插件介绍 该插件制作&#xff0c;将从零开始&#xff0c;由一个空白插件一点点的制作&#xff0c;从写一个效果到封装&#xff0c;层层封装插件&#xff0c;简单粗暴的对插件进行了制作&#xff1a; 插件效果 更多的是在cpp中去…

Cpp04 — 默认成员函数

前言&#xff1a;本文章主要用于个人复习&#xff0c;追求简洁&#xff0c;感谢大家的参考、交流和搬运&#xff0c;后续可能会继续修改和完善。 因为是个人复习&#xff0c;会有部分压缩和省略。 一、默认成员函数 当类里面成员函数什么都不写的时候&#xff0c;编译器会自动…

AutoSAR系列讲解(实践篇)10.3-BswM配置

目录 一、ECU State Handing(ESH) 二、Module Initialization 三、Communication Control 说起BswM的配置,其实博主问过很多朋友了,大家基本都只用自动配置;很少有用到手动配置的时候,对于刚刚入门的大家来说,掌握自动配置基 本也就足够了。 一、ECU State Handing(…

【雕爷学编程】MicroPython动手做(12)——掌控板之Hello World

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

内网隧道代理技术(十四)之 Earthworm的使用(一级代理)

Earthworm的使用(一级代理) ew 全称是EarchWorm,是一套轻量便携且功能强大的网络穿透工具,基于标准C开发,具有socks5代理、端口转发和端口映射三大功能,可在复杂网络环境下完成网络穿透,且支持全平台(Windows/Linux/Mac)。该工具能够以“正向”、“反向”、“多级级联”…

谷粒商城第七天-商品服务之分类管理下的删除、新增以及修改商品分类

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 删除功能 2.2 新增功能 2.3 修改功能 三、后端部分 3.1 删除接口 3.2 新增接口 3.3 修改接口 四、总结 一、总述 1.1 前端思路 删除和新增以及修改的前端无非就是点击按钮&#xff0c;就向后端发送请求…

动脑学院Jetpack Compose学习笔记

最近b站学习了一下Compose相关内容&#xff0c;整理了相关笔记&#xff0c;仅供大家参考。 资源链接如下&#xff0c;象征性收取1个积分 https://download.csdn.net/download/juliantem/88125198

C数据结构——无向图(邻接表方式) 创建与基本使用

源码注释 // // Created by Lenovo on 2022-05-17-下午 4:37. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <malloc.h>#define TRUE 1 #define FALSE 0#define MAX_ALVNUMS 100 // 最大顶点数/** 定义链队*/ typedef int QEle…

服务器部署Go项目

最近在研究服务器部署项目&#xff0c;用了好几种办法成功部署。这些方法互有利弊&#xff0c;本文就逐一详细演示说明&#xff1a; 目录 1.服务器下载Go环境&#xff0c;直接将项目代码放到服务器上运行 2.服务器不下载Go环境&#xff0c;本地将项目打包成可执行的二进制…

【小程序】快来开发你的第一个微信小游戏(详细流程)

&#x1f973; 作者&#xff1a;伯子南 &#x1f60e; 坚信&#xff1a; 好记性不如乱笔头&#xff0c;独乐乐不如众乐乐 &#x1f4aa; 个人主页&#xff1a;https://blog.csdn.net/qq_34577234?spm1010.2135.3001.5421 &#x1f46c;&#x1f3fb; 觉得博主文章不错的话&…