main方法中操作 redis

本文详细介绍了如何在SpringBoot项目中配置RedisTemplate,包括使用FastJson进行序列化,以及创建JedisConnectionFactory实例,支持单点、哨兵和集群Redis连接方式。
摘要由CSDN通过智能技术生成


    public static   RedisTemplate<String, Object> redisTemplate() {

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        // fastjson序列化
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
        // key的序列化采用StringRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // value的序列化采用FastJsonRedisSerializer
        redisTemplate.setValueSerializer(fastJsonRedisSerializer);
        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }


    public static RedisConnectionFactory jedisConnectionFactory() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
//        poolConfig.setMaxTotal(maxActive);
//        poolConfig.setMaxIdle(maxIdle);
//        poolConfig.setMaxWaitMillis(maxWait);
//        poolConfig.setMinIdle(minIdle);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(false);
        poolConfig.setTestWhileIdle(true);
        JedisClientConfiguration clientConfig = JedisClientConfiguration.builder()
                .usePooling().poolConfig(poolConfig).and().build();

        // 单点redis
        RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
        // 哨兵redis
        // RedisSentinelConfiguration redisConfig = new RedisSentinelConfiguration();
        // 集群redis
        // RedisClusterConfiguration redisConfig = new RedisClusterConfiguration();
        redisConfig.setHostName("127.0.0.1");
//        redisConfig.setPassword(RedisPassword.of(redisAuth));
        redisConfig.setPort(6379);
        redisConfig.setDatabase(1);

        return new JedisConnectionFactory(redisConfig,clientConfig);
    }


### Java Main 方法Redis 每小时读写 10,000,000 条数据的实现方式与性能优化 为了在 Java 的 `main` 方法中实现对 Redis 进行每小时读写 10,000,000 条数据的操作,需要综合考虑以下几个方面: #### 1. 使用高效的 Redis 客户端库 推荐使用 Jedis 或 Lettuce 等成熟的 Redis 客户端库来连接和操作 Redis。这些库提供了丰富的功能以及良好的性能支持。 ```java import redis.clients.jedis.Jedis; public class RedisBenchmark { public static void main(String[] args) { try (Jedis jedis = new Jedis("localhost", 6379)) { // 初始化 Redis 连接 long startTime = System.currentTimeMillis(); int totalOperations = 10_000_000; String keyPrefix = "benchmark_key"; for (int i = 0; i < totalOperations / 2; i++) { jedis.set(keyPrefix + i, "value_" + i); // 写入操作 } for (int i = 0; i < totalOperations / 2; i++) { jedis.get(keyPrefix + i); // 读取操作 } long endTime = System.currentTimeMillis(); System.out.println("Total time taken: " + (endTime - startTime) + " ms"); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码展示了如何通过循环完成指定数量的数据读写操作,并记录执行时间[^1]。 --- #### 2. 利用批量处理提升效率 为了避免逐条发送命令带来的高延迟开销,应尽可能利用 Redis 提供的管道(Pipeline)机制或事务批处理能力。这能够显著减少网络往返次数并提高吞吐量。 ```java try (Jedis jedis = new Jedis("localhost")) { Pipeline pipeline = jedis.pipelined(); // 开启管道模式 for (int i = 0; i < 5_000_000; i++) { pipeline.set("batch_key_" + i, "value_" + i); } List<Object> results = pipeline.syncAndReturnAll(); // 同步提交所有指令 } catch (Exception e) { e.printStackTrace(); } ``` 此部分代码片段说明了如何借助 Jedis 的 Pipelining 功能一次性向服务端推送大量请求[^4]。 --- #### 3. 控制 BigKey 影响 由于频繁操作大尺寸 Key 可能引发严重的内存占用问题甚至拖垮整个系统运行状态,因此建议预先评估目标数据集大小及其分布特性,在必要情况下拆分超大规模对象为更小单元存储于不同字段之中[^3][^5]。 --- #### 4. 调整 JVM 和 Redis 参数配置 针对如此庞大的并发需求场景下,适当调整相关参数设置有助于进一步挖掘硬件潜力从而达成预期效果: - **Redis 方面**:增大最大可用内存限额(`maxmemory`)至合理范围;启用 AOF 日志持久化策略以便意外断电恢复时保留最新改动成果; - **Java 应用层面**:增加堆空间分配比例(-Xmx,-Xms选项),开启 G1GC 收集器替代默认 CMS 版本以降低长时间 Full GC 发生概率。 --- #### 5. 并发编程加速进程推进速度 引入多线程技术可有效缩短整体耗时时长。例如创建固定规模的工作池(ThreadPoolExecutor),让各成员独立负责一部分子任务集合直至全部结束为止。 ```java ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); CountDownLatch latch = new CountDownLatch(10); for(int t=0;t<10;t++){ final int threadId=t; Runnable worker=new Runnable(){ @Override public void run() { try(Jedis jedis=new Jedis()){ for(long idx=(long)(threadId*1e6);idx<(threadId+1)*1e6;idx++) jedis.incr("counter_"+idx); }finally{ latch.countDown(); } } }; executor.submit(worker); } latch.await();//等待所有工作完成后再继续后续逻辑流程... executor.shutdownNow(); ``` 以上示例演示了一个简单的基于线程池模型的设计思路用于分散负载压力到多个 CPU 核心上共同协作完成既定使命。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值