SpringBoot 整合 Redis

Java操作Redis(单机)

Jedis方式

  1. pom依赖

            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>
  2. jedis使用

    import redis.clients.jedis.Jedis;
    
    public class JedisApplicationMain {
        public static void main(String[] args) {
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            // jedis.auth("root"); // 默认用户没有密码
            jedis.set("Java", "1");
            String s = jedis.get("Java");
            System.out.println(s);
        }
    }

Lettuce方式

  1. pom依赖

            <dependency>
                <groupId>io.lettuce</groupId>
                <artifactId>lettuce-core</artifactId>
            </dependency>
  2. lettuce使用

    public class LettuceMain {
        public static void main(String[] args) {
            RedisURI uri = RedisURI.builder()
                    .withHost("hadoop001")
                    .withPort(6379)
                    .build();
            RedisClient redisClient = RedisClient.create(uri);
            StatefulRedisConnection<String, String> connect = redisClient.connect();
            RedisCommands<String, String> commands = connect.sync();
    
            // 操作逻辑
            commands.set("root", "18");
            String s = commands.get("root");
            System.out.println(s);
    
            // 释放资源
            connect.close();
            redisClient.shutdown();
        }
    }

###RedisTemplate方式(单机模式)

序列化问题

通过程序期望添加的key和Redis数据库实际保存的key不一致

@SpringBootTest
class RedisApplicationTests {
    public static final String ORDER_KEY = "ord:";
    public static final String JD_ORDER = "京东订单";

    public static final int KEY_ID = 1;

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void addOrder() {
        String serialNo = UUID.randomUUID().toString();

        String key = ORDER_KEY + KEY_ID;
        String value = JD_ORDER + serialNo;

        // 期望保存的key是"ord:1"
        redisTemplate.opsForValue().set(key, value);
    }

    @Test
    public void getOrderById() {
        // 在程序中通过"ord:1"也可以将结果查找出来
        String s = (String) redisTemplate.opsForValue().get(ORDER_KEY + KEY_ID);
        System.out.println(s);
    }

}

Redis中实际保存的key

image-20230222102151356

image-20230222100636611

解决方案

方式一:使用StrngRedisTemplate来替换RedisTemplate

image-20230222103238600

方式二:自定义RedisTemplate对象的创建过程
@Configuration
public class RedisTemplateConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        // 原来的RedisTemplate对象的创建过程:空参构造器 -> 属性赋值(无) -> 初始化
        // 现在手动实现一个RedisTemplate对象的创建过程,用来替换原来的过程
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);

        // 在完成自定义属性配置之后, 需要调用原来的初始化方法
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

Java操作Redis(集群)

JedisCluster方式

public class RedisClusterMain {
    public static void main(String[] args) {
        //host选择集群中的任意一台redis服务器的ip地址即可, 因为任意一台服务器都可以作为集群的入口
        String host = "hadoop001";
        int port = 6379;
        HostAndPort hostAndPort = new HostAndPort(host, port);
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);

        //设置值
        jedisCluster.set("name", "root");

        //获取值
        System.out.println(jedisCluster.get("name"));
    }
}

RedisTemplate方式

Spring客户端没有动态感知到Redis集群的最新集群信息


   转载规则


《》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
旧版复制功能同步 同步是指让从服务器更新至主服务器的数据库状态 命令传播 命令传播是指让主从服务器的数据库状态变为一致
2023-02-23
下一篇 
Nacos下载与启动 服务注册 添加依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-
2023-02-21
  目录