RedisTemplate 的基本使用手把手教

1、引入 spring-boot-starter-data-redis 依赖

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

2、在 application.yml 配置 Redis 的信息

spring: redis:  host: 127.0.0.1  port: 6379  password: 123456  database: 0 # 几号库  lettuce:   pool:    max-active: 8 # 最大连接    max-idle: 8 # 最大空闲连接    min-idle: 0 # 最小空闲连接    max-wait: 100ms # 连接等待时间

3、注入 RedisTemplate

@Autowiredprivate RedisTemplate redisTemplate;

Demo1

package com.test;

import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.DefaultTypedTuple;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ZSetOperations;import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;
@RunWith(SpringRunner.class)@SpringBootTestpublic class RedisDemoApplicationTest {
// 注入 RedisTemplate @Autowired private RedisTemplate redisTemplate;
// String 类型 @Test public void testString () { redisTemplate.opsForValue().set("name", "xiaobai"); Object name = redisTemplate.opsForValue().get("name"); System.out.println(name); }
// Hash 类型 @Test public void testHash () { redisTemplate.opsForHash().put("user1", "name", "clarence"); redisTemplate.opsForHash().put("user1", "age", "25"); Map map = redisTemplate.opsForHash().entries("user1"); System.out.println(map); }
// List 类型 @Test public void testList () { redisTemplate.opsForList().leftPushAll("names", "xiaobai", "xiaohei", "xiaolan"); List<String> names = redisTemplate.opsForList().range("names", 0, 3); System.out.println(names); }
// Set 类型 @Test public void testSet () { redisTemplate.opsForSet().add("set", "a", "b", "c"); Set<String> set = redisTemplate.opsForSet().members("set"); System.out.println(set); }
// SortedSet 类型 @Test public void testSortedSet () { redisTemplate.opsForZSet().add("class", "xiaobai", 90); Set aClass = redisTemplate.opsForZSet().rangeByScore("class", 90, 100); System.out.println(aClass); Set<ZSetOperations.TypedTuple<String>> set = new HashSet<>(); set.add(new DefaultTypedTuple<>("xiaohei", 88.0)); set.add(new DefaultTypedTuple<>("xiaohui", 94.0)); set.add(new DefaultTypedTuple<>("xiaolan", 84.0)); set.add(new DefaultTypedTuple<>("xiaolv", 82.0)); set.add(new DefaultTypedTuple<>("xiaohong", 99.0)); redisTemplate.opsForZSet().add("class", set); Set aClass1 = redisTemplate.opsForZSet().range("class", 0, 6); System.out.println(aClass1); }}

序列化

1、默认是 JdkSerializationRedisSerializer

RedisTemplate 可以接收任意 Object 作为值写入 Redis,不过在写入前会把 Object 序列化为字节形式,默认是采用 JDK 序列化,上面的 demo 运行后得到的结果如下缺点:可读性差;内存占用较大

2、添加配置文件,使用 String 序列化、Json 序列化

Redis 配置文件

package com.test.config;
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.RedisSerializer;
@Configurationpublic class RedisConfig {
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { // 创建 RedisTemplate 对象 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // 设置连接工厂 redisTemplate.setConnectionFactory(connectionFactory); // 设置 Key 的序列化 - String 序列化 RedisSerializer.string() => StringRedisSerializer.UTF_8 redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setHashKeySerializer(RedisSerializer.string()); // 设置 Value 的序列化 - JSON 序列化 RedisSerializer.json() => GenericJackson2JsonRedisSerializer redisTemplate.setValueSerializer(RedisSerializer.json()); redisTemplate.setHashValueSerializer(RedisSerializer.json()); // 返回 return redisTemplate; }}

引入 Jackson 依赖

<!--Jackson依赖--><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.4</version></dependency>

添加 User 实体类

package com.test.entity;
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;
@Data@NoArgsConstructor@AllArgsConstructorpublic class User { private String name; private Integer age;}

注意这里要安装lombok插件,同时引入lombok依赖

Demo2

package com.test;

import com.test.entity.User;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.DefaultTypedTuple;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ZSetOperations;import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;
@RunWith(SpringRunner.class)@SpringBootTestpublic class RedisDemoApplicationTest2 {
// 注入 RedisTemplate @Autowired private RedisTemplate redisTemplate;
// String 类型 @Test public void testString () { redisTemplate.opsForValue().set("name", "xiaobai"); Object name = redisTemplate.opsForValue().get("name"); System.out.println(name); } @Test public void testSaveUser() { redisTemplate.opsForValue().set("user", new User("小白", 23)); User user = (User) redisTemplate.opsForValue().get("user"); System.out.println(user); }}

运行结果

从上述 Demo 的运行结果可以看到,为了在反序列化时知道对象的类型,Json 序列化会将类的 class 类型写入 json 结果中存入 Redis,会带来额外的内存开销 为了节省内存空间,我们并不会使用 json 序列化器来处理 value,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value。当需要存储 Java 对象时,手动完成对象的序列化和反序列化 spring 提供了一个 StringRedisTemplate 类,其 key 和 value 的序列化方式默认为 String 方式

引入 fastjson 依赖

<!--fastjson依赖--><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version></dependency>

运行结果

相关推荐

  • GPT-5已开工!奥特曼:月入7亿不够烧,希望微软再投点
  • 大模型手机,3999起
  • 最强大模型训练芯片H200发布!141G大内存,AI推理最高提升90%,还兼容H100
  • 中国AIGC数据标注全景报告:百亿市场规模,百万就业缺口
  • 线下报名开启!年度科技盛会MEET2024首批嘉宾公布!
  • 14个超有趣的数据分析项目,数据集都给你整理好啦(建议收藏)
  • 云原生大数据的不同选择
  • 淘宝推荐场景的利器:融合复杂目标且支持实时调控的重排模型
  • 齐了!Data+AI的技术大佬
  • 免费使用 GPT-4,无广告,还不是套路满满!
  • 奖学金18万/年!香港科技大学(广州)数据科学与分析方向招收全奖博士生
  • TPAMI 2023 | 图神经网络在分布外图上的泛化
  • 港大联合百度 WSDM 2024 | 如何让LLMs助力推荐系统?图数据增强
  • 公司业务,全线爆发!
  • 【NLP】大模型最全八股和答案(下)
  • 【Python】如何使用Python自动运行你的代码?
  • 2023人工智能教育与产教融合高峰论坛(11月24-25日,海口)
  • 清华特奖答辩,一年一度的神仙打架来了!
  • 也看更省显存的大模型微调方法:可调参数比LoRA小10倍的VeRA实现思路
  • 深度学习attention机制中的Q,K,V分别是从哪来的?