Spring Boot中操作使用Redis实现详解
作者:_BugMan 发布时间:2023-11-24 02:39:29
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 是通过 RedisConnection操作Redis的,RedisConnection 则对原生的 Jedis 行封装。要获取RedisConnection接口对象是通过RedisConnectionFactory 生成的 。
3.配置
配置文件进行配置:
# Redis 连接配置
# 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的过程中使用的序列化方式会不同,序列化出来的结果也会不同。比如处理字符就需要用字符串专用的序列化器、处理对象需要使用对象专用的序列化器。
目前有的序列化器如下:
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的数据结构类型生效:
比如我想使用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
猜你喜欢
- Java 判断字符串是否为IP地址,供大家参考,具体内容如下1、代码主要就是这么几个条件非空长度符合 0.0.0.0 - 255.255.2
- 1,带Tomcat的打包方式1.1, 在pom.xml文件添加以下配置(目的:自定main入口和跳过Junit代码)<build>
- Application.Idle()方法表示:当应用程序处于空闲状态时执行相应代码。示例程序1、界面设计:一个简单的Lable控件2、代码u
- Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象。 序列化是
- 关于链表链表是有序的列表链表是以节点的方式来存储每个节点包含data域,next域(指向下一个节点)分带头节点的链表和没有头节点的链表定义一
- 我在做毕设的时候采用shiro进行登录认证和权限管理的实现。其中需求涉及使用三个角色分别是:学生、教师、管理员。现在要三者实现分开登录。即需
- 单例模式是23种设计模式之一,是比较简单的一种设计模式,它的目的是无论调用多少次,都返回同一个对象,它的特点是构造器私有化。它分为两种结构,
- 简介 相信很多人都接触spring框架很长时间了,每次搭建spring框架的时候都需要配置好多的jar、xml,做很多繁琐重复的配置,稍微不
- 引言在Broker中,事务消息的初始化是通过BrokerController.initialTransaction()方法执行的。priva
- java控制台输出图书馆管理系统(只用java代码不用数据库和GUI,java入门的新手秒懂)在个项目中,我只用数组保存数据,和只用for循
- 最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了:1. 
- 本文实例讲述了java统计字符串中重复字符出现次数的方法。分享给大家供大家参考,具体如下:package com;import org.ju
- 关于Maven的使用就不再啰嗦了,网上很多,并且这么多年变化也不大,这里仅介绍怎么搭建Hadoop的开发环境。1. 首先创建工程mvn ar
- 1、抽象类 vs 接口 方法类型: 接口只能有抽象方法。抽象类可以有抽象和非抽象方法。从 Java 8 开始,它也可以有默认和静态
- 摘要:vs2019新鲜出炉,配置opencv又有哪些不一样呢,这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目
- 如有错误,望指正;SpringBoot可以有三种方式定义初始化器,来为容器中增加自定义的对象,具体如下:1、定义在spring.factor
- Java泛型映射不同的值类型详解前言:一般来说,开发人员偶尔会遇到这样的情形: 在一个特定容器中映射任意类型的值。然而Java 集合API只
- 本文实例为大家分享了java实现加减乘除计算器的具体代码,供大家参考,具体内容如下代码import java.awt.*;import ja
- 本文实例讲述了C#使用ToUpper()与ToLower()方法将字符串进行大小写转换的方法。分享给大家供大家参考。具体分析如下:C#通过T
- 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理