软件编程
位置:首页>> 软件编程>> java编程>> Spring Boot中使用Redis实战案例

Spring Boot中使用Redis实战案例

作者:_BugMan  发布时间:2021-06-03 04:17:04 

标签:springboot,redis

1.依赖

maven依赖如下,需要说明的是,spring-boot-starter-data-redis里默认是使用lettuce作为redis客户端的驱动,但是lettuce其实用的比较少,我们常用的还是jedis作为客户端的驱动,所以这里排除掉lettuce,引入jedis:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <exclusions>
       <exclusion>
           <groupId>io.lettuce</groupId>
           <artifactId>lettuce-core</artifactId>
       </exclusion>
   </exclusions>
</dependency>

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

2.依赖关系

spring data redis中依赖的关系:

Spring Boot中使用Redis实战案例

这个依赖关系想表达的是,Spring 是通过 RedisConnection操作Redis的,RedisConnection 则对原生的 Jedis 行封装。要获取RedisConnection接口对象是通过RedisConnectionFactory 生成的 。

3.配置

配置文件进行配置:

# Redis 连接配置
# 单机 Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
# 连接池配置
spring.redis.jedis.pool.max-idle=30
spring.redis.jedis.pool.max-total=50
spring.redis.jedis.pool.max-wait=2000ms

代码进行配置:

@Configuration
public class RedisConfig {
   private RedisConnectionFactory connectionFactory = null;

@Bean
   public RedisConnectionFactory initRedisConnectionFactory(){
       if(connectionFactory!=null){
           return connectionFactory;
       }
       JedisPoolConfig poolConfig =new JedisPoolConfig();
       //最大空闲数
       poolConfig.setMaxIdle(30);
       //最大连接数
       poolConfig.setMaxTotal(50);
       //最大等待毫秒数
       poolConfig.setMaxWaitMillis(2000);
       //创建Jedis连接工厂
       JedisConnectionFactory connectionFactory=new JedisConnectionFactory(poolConfig);
       //获取单机的redis配置,如果是集群的话用集群配置类
       RedisStandaloneConfiguration rscfg=connectionFactory.getStandaloneConfiguration();
       connectionFactory.setHostName("127.0.0.1");
       connectionFactory.setPort(6379);
       return connectionFactory;
   }
}

4.RedisTemplate

这里要说明的是如果是直接使用RedisConnection来操作redis就需要我们手动去找RedisConnectionFactory拿RedisConnection,并且需要每次手动关闭RedisConnection。所以Spring Data Redis里面提供了RedisTemplate来方便操作,其封装自jedis,屏蔽了资源获取和释放的步骤。

使用RedisTemplate的时候要注意的核心是它的序列化器,RedisTemplate有多种序列化器,不同的序列化器在键值写入、读出redis的过程中使用的序列化方式会不同,序列化出来的结果也会不同。比如处理字符就需要用字符串专用的序列化器、处理对象需要使用对象专用的序列化器。

目前有的序列化器如下:

Spring Boot中使用Redis实战案例

StringRedisSerializer:

StringRedisSerializer 是 RedisTemplate 默认使用的 Key 和 Value 的序列化器,它将字符串序列化为字节数组,使用 UTF-8 编码。由于 Redis 中 Key 和 Value 都是字符串,因此默认的 StringRedisSerializer 序列化器已经可以满足大部分情况的需要。

Jackson2JsonRedisSerializer:

Jackson2JsonRedisSerializer 是一个基于 Jackson 的 Redis Key 和 Value 的序列化器,它可以将对象序列化为 JSON 格式的字符串,并存储到 Redis 中。使用 Jackson2JsonRedisSerializer 序列化器需要添加 Jackson 的依赖,可以将对象转换为 JSON 格式的字符串,也可以将 JSON 格式的字符串转换为对象。

JdkSerializationRedisSerializer:

JdkSerializationRedisSerializer 是一种基于 Java 自带的序列化方式的序列化器,它可以将对象序列化为字节数组进行存储。虽然 JdkSerializationRedisSerializer 简单易用,但是它的效率比较低,序列化后的字节数组也比较大,不适合存储大量的数据。

GenericJackson2JsonRedisSerializer:

GenericJackson2JsonRedisSerializer 是一个支持泛型的 Jackson2JsonRedisSerializer,它可以序列化任意类型的对象,并将对象序列化为 JSON 格式的字符串。它在序列化和反序列化时都需要指定目标类型。

OxmSerializer:

OxmSerializer 是一种基于 Spring 的 O/X 映射框架的序列化器,它支持将对象序列化为 XML 格式的字符串。虽然 OxmSerializer 灵活性较高,但是序列化和反序列化的性能比较低,不适合存储大量的数据。

总之,在选择序列化器时需要根据实际情况进行选择,根据数据类型和性能要求选择合适的序列化器。

使用的时候直接set进去即可,set的时候给了很多生效粒度选择,是对所有redis类型的数据结构都生效,还是对某一类redis的数据结构类型生效:

Spring Boot中使用Redis实战案例

比如我想使用String序列化器,在全局都生效:

@Bean
public RedisTemplate<Object,Object> initRedisTemplate(){
 RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
 redisTemplate.setDefaultSerializer(new StringRedisSerializer());
 return redisTemplate;
}

5.基础操作

以下是使用RedisTemplate操作redis基本数据类型的代码示例:

要注意的是@Bean定义RedisTemplate的时候泛型要和使用时的泛型对齐。

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RedisService {

@Autowired
   private RedisTemplate<String, Object> redisTemplate;

@Autowired
   private StringRedisTemplate stringRedisTemplate;

public void setString(String key, String value) {
       stringRedisTemplate.opsForValue().set(key, value);
   }

public String getString(String key) {
       return stringRedisTemplate.opsForValue().get(key);
   }

public void setHash(String key, String hashKey, Object value) {
       HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();
       hashOps.put(key, hashKey, value);
   }

public Object getHash(String key, String hashKey) {
       HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();
       return hashOps.get(key, hashKey);
   }

public void setList(String key, Object value) {
       ListOperations<String, Object> listOps = redisTemplate.opsForList();
       listOps.rightPush(key, value);
   }

public Object getList(String key, long index) {
       ListOperations<String, Object> listOps = redisTemplate.opsForList();
       return listOps.index(key, index);
   }

public void setSet(String key, Object value) {
       SetOperations<String, Object> setOps = redisTemplate.opsForSet();
       setOps.add(key, value);
   }

public Object getSet(String key) {
       SetOperations<String, Object> setOps = redisTemplate.opsForSet();
       return setOps.members(key);
   }

public void setZSet(String key, Object value, double score) {
       ZSetOperations<String, Object> zsetOps = redisTemplate.opsForZSet();
       zsetOps.add(key, value, score);
   }

public Object getZSet(String key, long start, long end) {
       ZSetOperations<String, Object> zsetOps = redisTemplate.opsForZSet();
       return zsetOps.range(key, start, end);
   }

}

6.事务

以下是使用事务的代码示例:

@Autowired
private RedisTemplate<String, String> redisTemplate;

public void transactionalOperation() {
   // 开启 Redis 事务
   redisTemplate.multi();

try {
       // 执行多个 Redis 命令
       redisTemplate.opsForValue().set("key1", "value1");
       redisTemplate.opsForValue().set("key2", "value2");

// 提交事务
       redisTemplate.exec();
   } catch (Exception e) {
       // 回滚事务
       redisTemplate.discard();
   }
}

来源:https://blog.csdn.net/Joker_ZJN/article/details/130028360

0
投稿

猜你喜欢

  • 本文实例为大家分享了android实现简易计算器展示的具体代码,供大家参考,具体内容如下效果图:一、如图,首先布局计算器主页显示activi
  • C#串口模块的使用。使用VS .net框架下WinForm程序应用开发。C#开发的串口通信小工具。相比于QT添加的串口类,WinForm是通
  • 下截JNative组件jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2解压JNati
  • 最近在做项目的时候,一直用一个叫做API的东西,controller注解我会写,这个东西我也会用,但是我确实不知道这个东西是个什么,有点神奇
  • 环境JDK 1.8Spring Boot 2.3.0.RELEASEMaven 3.6.1H2 数据库用户名密码登录首先,我们用 Sprin
  • 相信大家都经常使用String 的split方法,但是大家有没有遇到下面的这种情况:大家想想下面的代码执行结果是什么public stati
  • 记录一下微信第三方实现登录的方法。还是比较简单。一、必要的准备工作1.首先需要注册并被审核通过的微信开放平台帐号,然后创建一个移动应用,也需
  • HTTP请求:如果需要Json格式的自己转下,度娘上N种姿势…//处理http请求 requestUrl为请求地址 requestMetho
  • 在实践中,项目的某些配置信息是需要进行加密处理的,以减少敏感信息泄露的风险。比如,在使用Druid时,就可以基于它提供的公私钥加密方式对数据
  • 线程状态NEW:刚创建未启动的线程RUNNABLE:正在执行状态BLOCKED:处于阻塞状态的线程WAITING:正在等待另一个线程执行特定
  • Android 应用签名的两种方法一、使用pem签名    (一) apk签名命令java –jar sign
  • 这篇文章主要介绍了Java ForkJoin框架的原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
  • 谈到多线程就不得不谈到Synchronized,重要性不言而喻,今天主要谈谈Synchronized的实现原理。Synchronizedsy
  • 在java.lang.Runtime.exec的使用中,我们经常会用到将重定向命令执行的输入/结果或者将错误信息读取出来.那么,在使用过程中
  • 一、非配置文件注入1、注入普通字符串直接附在属性名上,在 Bean 初始化时,会赋初始值。@Value("admin")
  • 成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的。下面就让我们来看看代码编写的30条建议吧。(1) 类名首字母应该大写。字段
  • 有时候编译器、处理器的优化会导致runtime与我们设想的不一样,为此Java对编译器和处理器做了一些限制,JAVA内存模型(JMM)将这些
  • 提到java里的注解,和我们平时的注释还是有很大的区别,主要是作为java特性来使用的,跟我们常见的类是同一个使用的层面。关于java注解的
  • 1、profiles是什么?有什么作用在maven构建的项目都存在一个pom.xml的项目对象模型配置文件,用于约束项目(如:jar包管理、
  • 概述在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何
手机版 软件编程 asp之家 www.aspxhome.com