Redis的Java客户端

SpringDataRedis

SpringData是Spring中数据操作的模块,包括对各种数据库的集成,其中对Redis的集成模块叫做SpringDataRedis

那么我们该如何使用SpringData来操作Redis呢?其提供了RedisTemplate统一API来操作Redis;并且将不同数据类型的操作API封装到不同类型中;

RedisTemplate

快速入手

1.新建Springboot项目,引入依赖

第一个依赖有了,建立完项目后还需要自己手动引入第二个依赖

XML 复制代码
        <!--common-pool -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

2.在yml配置文件的信息

XML 复制代码
spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379
      password:         # 没有设置密码就留空
      database: 0       # 使用 DB0
      timeout: 3000ms
      lettuce:
        pool:
          max-active: 8
          max-wait: -1ms
          max-idle: 8
          min-idle: 0

3.注入RedisTemplate

4.编写测试

java 复制代码
@SpringBootTest
class RedistemplatedemoApplicationTests {
    @Autowired
    RedisTemplate redisTemplate;

    @Test
    void testString() {
        redisTemplate.opsForValue().set("add", "张三");
        System.out.println(redisTemplate.opsForValue().get("add"));
    }

}

但是此时发现存储到Redis中为下述,而非add:

这是因为 RedisTemplate 默认存键的时候会自动加前缀和序列化 ,实际存进去的 key 不是纯粹的 add,而是类似这样的:

复制代码
\xac\xed\x00\x05t\x00\x03add

所以你在工具里直接搜 add 当然找不到。解决办法有两个,都是RedisTemplate的两种序列化实践方案:

RedisTemplate序列化

  • 方式一:用 StringRedisTemplate代替 RedisTemplate(推荐)
java 复制代码
@Autowired
StringRedisTemplate stringRedisTemplate;

@Test
void testString() {
    stringRedisTemplate.opsForValue().set("add", "张三");
    System.out.println(stringRedisTemplate.opsForValue().get("add"));
}

StringRedisTemplate 存的 key 和 value 都是纯字符串,在工具里直接 get add 就能看到。

  • 方式二:自定义 RedisTemplate 的序列化方式

新建一个配置类,这样存的 key 就是正常字符串了,工具里也能直接看到。

java 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 创建 RedisTemplate 对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置 RedisConnectionFactory
        template.setConnectionFactory(factory);

        // key 使用 String 序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());

        // value 使用 Java 原生序列化(无需 Jackson)
        template.setValueSerializer(RedisSerializer.java());
        template.setHashValueSerializer(RedisSerializer.java());

        return template;
    }
}

RedisTemplate的两种序列化实践方案:

方案一:

  1. 自定义RedisTemplate

  2. 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二:

  1. 使用StringRedisTemplate

2.写入Redis时,手动把对象序列化为JSON

3.读取Redis时,手动把读取到的JSON反序列化为对象

相关推荐
码智社35 分钟前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖2 小时前
JDK 26 新特性详解
java·开发语言
Database_Cool_2 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森2 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
马优晨2 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
Database_Cool_2 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白3 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面4 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧4 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh