SpringBoot 学习(九)Redis

news/2024/9/22 16:40:50/

11. 集成 Redis

11.1 说明

  • SpringBoot 操作数据:sping-data、jpa、jdbc、mongodb、redis

  • SpringBoot 2.× 后,jedis 被替换为 lettuce

    jedis:采用直连,多线程操作不安全,增强安全性需使用 jedis pool 连接池!更像 BIO 模式。

    lettuce:采用 netty,实例可在多个线程中共享,不存在线程不安全的情况!更像 NIO 模式。

11.2 源码分析

@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 默认的 RedisTemplate 没有过多的设置,redis 对象都需要序列化// 两个泛型都是 Object,需要强制转换为 <String, Object>RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);return template;
}@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
// 由于 String 是常用类型所以单独提出一个 bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;
}

11.3 测试

(1) 导入依赖

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

(2) 配置 redis

# application.properties
spring.redis.host=127.0.0.1
spring.redis.port=6379

(3) 测试

● 传输字符串
@SpringBootTest
class RedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid contextLoads() {/*** redisTemplate 可操作不同的数据类型,可完成基本的操作,如 CRUD* opsForValue 字符串* opsForList* opsForSet* opsForHash* opsForZSet* opsForGeo* opsForHyperLogLog** 获取 redis 连接对象* RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();* connection.flushDb();* connection.flushAll() ;*/redisTemplate.opsForValue().set("myKey", "why");System.out.println("myKey: " + redisTemplate.opsForValue().get("myKey"));}
}

在这里插入图片描述

在这里插入图片描述

● 传输对象
// 实体类
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String name;private String password;
}
@Test
void test() throws JsonProcessingException {User user = new User("why", "123");redisTemplate.opsForValue().set("user", user);System.out.println(redisTemplate.opsForValue().get("user"));
}

在这里插入图片描述

● 传输 JSON
@Test
void test() throws JsonProcessingException {User user = new User("why", "123");// 将 Object 转换为 JsonString jsonUser = new ObjectMapper().writeValueAsString(user);redisTemplate.opsForValue().set("user", jsonUser);System.out.println(redisTemplate.opsForValue().get("user"));
}

在这里插入图片描述

在这里插入图片描述

● 传输序列化对象
// 序列化的实体类
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private String name;private String password;
}
@Test
void test() throws JsonProcessingException {User user = new User("why", "123");redisTemplate.opsForValue().set("user", user);System.out.println(redisTemplate.opsForValue().get("user"));
}

在这里插入图片描述

在这里插入图片描述

● Redis 用户端乱码问题

在这里插入图片描述

在这里插入图片描述

(4) 自定义配置类

@Configuration
public class RedisConfig {// 自定义 redisTemplate, 修改 RedisAutoConfiguration 中的 Bean@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {// <String, Object> 类型便于开发RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 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;}
}
@Test
void test() throws JsonProcessingException {User user = new User("why", "123");redisTemplate.opsForValue().set("user", user);System.out.println(redisTemplate.opsForValue().get("user"));
}

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/1124573.html

相关文章

如何编写测试用例,一篇搞定

前言 说到测试用例&#xff0c;但凡是软件测试从业人员&#xff0c;都不会陌生。但对于测试新手来说&#xff0c;测试用例仍旧有遗漏&#xff0c;或者写不好的时候。那么&#xff0c;究竟应该如何写好测试用例呢&#xff1f;今天就来针对性的聊聊这个话题。 在分析如何写测试…

event.stopPropagation()

现在有如下 当点击子按钮的时候会触发子事件&#xff0c;同时也会触发父事件&#xff0c; 如何阻止呢 handleDownload(event) { event.stopPropagation(); 。。。。。。。。。。 },

算法 分糖果-(贪心)

牛客网: BM95 题目: 每个孩子至少一个糖果&#xff0c;相邻孩子中得分高的至少多一些&#xff0c;最少多少糖果。 思路: 初始化candy数组元素全为1&#xff0c;从1往右遍历&#xff0c;arr[i]>arr[i-1], 需要candy[i]candy[i-1]1&#xff1b;total candy[n-1], 从右往左遍…

【每日一题】658. 找到 K 个最接近的元素

658. 找到 K 个最接近的元素 - 力扣&#xff08;LeetCode&#xff09; 给定一个 排序好 的数组 arr &#xff0c;两个整数 k 和 x &#xff0c;从数组中找到最靠近 x&#xff08;两数之差最小&#xff09;的 k 个数。返回的结果必须要是按升序排好的。 整数 a 比整数 b 更接近 …

分享53个Python源码源代码总有一个是你想要的

分享53个Python源码源代码总有一个是你想要的 链接&#xff1a;https://pan.baidu.com/s/1ew3w2_DXlSBrK7Mybx3Ttg?pwd8888 提取码&#xff1a;8888 项目名称 100-Python ControlXiaomiDevices DRF-ADMIN 后台管理系统 FishC-Python3小甲鱼 Flask框架的api项目脚手架 …

Cookie 和 Session机制

Cookie HTTP 协议自身是属于 "无状态" 协议. "无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后, 第二次访…

【计算机视觉】2.图像特征提取

图像特征提取 一、颜色特征量化颜色直方图聚类颜色直方图 二、边缘特征边缘边缘定义边缘提取边缘精细 三、特征点的特征描述子Harris角点FAST角点斑点SIFTHaar-like特征SURFORBLBPGabor 一、颜色特征 量化颜色直方图 HSV空间 优势&#xff1a;计算高效 劣势&#xff1a;量化问…

杂谈(2023.9.25)

1.面向对象 对象方法&#xff1a;就是我们面向对象的时候编写的普通的方法&#xff0c;第一个参数默认是self 对象方法可以通过 self 来获取 对象上的所有属性和方法类方法&#xff1a;通过 classmethod 来装饰的方法&#xff0c;第一个参数是cls …