SpringBoot Redis批量存取数据的操作

SpringBoot Redis批量存取数据

springboot中的redisTemplate封装了redis批处理数据的接口,我们使用redisTemplate可以直接进行批量数据的get和set。

package com.huateng.applacation.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;

/**
 * @program: applacation
 * @description:
 * @author: daiwenlong
 * @create: 2019-01-24 13:26
 **/
@Component
public class RedisService {
    @Autowired
    @Qualifier("stringRedisTemplate")
    private StringRedisTemplate redisTemplate;
    public void insertKey(List<String> keys, String value){ 

        //批量get数据
        List<Object> list = redisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                for (String key : keys) {
                    connection.get(key.getBytes());
                }
                return null;
            }
        });

        //批量set数据
        redisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                for (int i=0;i<keys.size();i++) {
                    connection.set(keys.get(i).getBytes(),value.getBytes());
                }
                return null;
            }
        });
    }
}

如果要设置 key 的过期时间,通过 setEx() 来做就可以了,过期时间单位是秒,相关代码如下:

/**
 * 合同批量导入redis
 *
 * @param contractBOList
 * @param expire
 * @return com.openailab.oascloud.common.model.ResponseResult
 * @author zxzhang
 * @date 2019/10/14
 */
@Override
public void contractBatchSetRedis(String contractBOList, long expire) {
    List<ContractBO> contracts = JSONObject.parseArray(contractBOList, ContractBO.class);
    if (contracts == null || contracts.size() == 0) {
        return;
    }
    //批量set数据
    redisUtil.getRedisTemplate().executePipelined((RedisCallback<String>) connection -> {
        for (ContractBO contract : contracts) {
            connection.setEx((RedisPrefixConst.CONTRACT_PREFIX + contract.getBusinessCode() + RedisPrefixConst.UNDERLINE_SEPARATOR + contract.getContractNo()).getBytes(), expire, JSONObject.toJSONString(contract).getBytes());
        }
        return null;
    });
}

/**
 * 合同批量获取redis
 *
 * @param contractBOList
 * @return java.lang.String
 * @author zxzhang
 * @date 2019/10/14
 */
@Override
public List<Object> contractBatchGetRedis(String contractBOList) {
    List<ContractBO> contracts = JSONObject.parseArray(contractBOList, ContractBO.class);
    if (contracts == null || contracts.size() == 0) {
        return null;
    }
    List<Object> list = redisUtil.getRedisTemplate().executePipelined((RedisCallback<String>) connection -> {
        for (ContractBO contract : contracts) {
            connection.get((RedisPrefixConst.CONTRACT_PREFIX + contract.getBusinessCode() + RedisPrefixConst.UNDERLINE_SEPARATOR + contract.getContractNo()).getBytes());
        }
        return null;
    });
    return list;
}

SpringBoot对redis批量存取介绍到此结束。

redisTemplate批量写入数据

 /**
     * 批量写入数据
     * @param objectMap
     * @return
     */
    public void saveMap(final Map<String,Object> objectMap) {
        //序列化成字节数组
        final Map<byte[],byte[]> byteMap=new HashMap<>();
        for(Map.Entry<String,Object> objectEntry:objectMap.entrySet()){
            String key=objectEntry.getKey();
            final byte[] keyBytes = redisTemplate.getStringSerializer().serialize(key);
            Object value=objectEntry.getValue();
            final byte[] valueBytes =SerializeUtil.serialize(value);
            byteMap.put(keyBytes,valueBytes);
        }

        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) {
                try{
                    connection.mSet(byteMap);
                }catch (Exception ex){
                    log.error("redis批量写入数据异常:"+ex.getMessage(),ex);
                }
                return null;
            }
        });
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springboot整合redis进行数据操作(推荐)

    redis是一种常见的nosql,日常开发中,我们使用它的频率比较高,因为它的多种数据接口,很多场景中我们都可以用到,并且redis对分布式这块做的非常好. springboot整合redis比较简单,并且使用redistemplate可以让我们更加方便的对数据进行操作. 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

  • Springboot如何操作redis数据

    StringRedisTemplate与RedisTemplate区别点 两者的关系是StringRedisTemplate继承RedisTemplate. 两者的数据是不共通的:也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据. 其实他们两者之间的区别主要在于他们使用的序列化类: RedisTemplate使用的是JdkSerializationRedisSerializ

  • SpringBoot项目中使用redis缓存的方法步骤

    本文介绍了SpringBoot项目中使用redis缓存的方法步骤,分享给大家,具体如下: Spring Data Redis为我们封装了Redis客户端的各种操作,简化使用. - 当Redis当做数据库或者消息队列来操作时,我们一般使用RedisTemplate来操作 - 当Redis作为缓存使用时,我们可以将它作为Spring Cache的实现,直接通过注解使用 1.概述 在应用中有效的利用redis缓存可以很好的提升系统性能,特别是对于查询操作,可以有效的减少数据库压力. 具体的代码参照该

  • SpringBoot Redis批量存取数据的操作

    SpringBoot Redis批量存取数据 springboot中的redisTemplate封装了redis批处理数据的接口,我们使用redisTemplate可以直接进行批量数据的get和set. package com.huateng.applacation.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.ann

  • Redis批量生成数据的实现

    目录 Redis批量生成数据 Redis自带Debug方法 Shell脚本 Redis批量生成数据 从研究Redis开始,一直会有一些Redis键值数量或者键值大小的场景要求,显然我们不可能一条一条记录的插入,那不是人都要没了,下面介绍两种方法. Redis自带Debug方法 redis提供的debug命令可以自己研究下,里面涉及到模拟redis异常场景如oom.宕机.命令执行失败,redis重载rdb文件.aof文件,模拟redis命令耗时等等,我们可以通过DEBUG help查看详情,如下所

  • SpringBoot yaml语法与数据读取操作详解

    目录 yaml yaml语法规则 字面值表示方式: 数组表示方式: 对象数组格式: 对象数组缩略格式: 读取yaml数据 编写yaml文件 读取单一数据 读取二级数据 读取数组数据 读取服务器端口号 读取对象属性 封装全部数据到Environment对象 读取yaml引用类型属性数据 application.yml MyDataSource 读取数据 变量的引用 application.yml 读取数据 context-path @Autowired报错解决方案 yaml YAML是一种数据序列

  • postgres 使用存储过程批量插入数据的操作

    参考官方文档 create or replace function creatData2() returns boolean AS $BODY$ declare ii integer; begin II:=1; FOR ii IN 1..10000000 LOOP INSERT INTO ipm_model_history_data (res_model, res_id) VALUES (116, ii); end loop; return true; end; $BODY$ LANGUAGE

  • SpringBoot Redis缓存数据实现解析

    这篇文章主要介绍了SpringBoot Redis缓存数据实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.启用对缓存的支持 spring对缓存的支持有两种方式: a.注解驱动的缓存 b.XML声明的缓存 本文主要介绍纯Java配置的缓存,那么必须在配置类上添加@EnableCaching,这样的话就能启动注解驱动的缓存. 2.使用Redis缓存 缓存的条目不过是一个键值对(Key-Value),其中key描述了产生value的操作和

  • springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作

    springboot +redis 实现点赞.浏览.收藏.评论等数量的增减操作 前言 第一次写博客,记录一下: 最近做了一个帖子的收藏.点赞数量的功能,其实之前也做过类似的功能,因为之前一直使用的mysql 总是感觉对于这种频繁需要改变的值,不应该给予Mysql过大的压力,本文章采用的是redis 做了持久化.下面贴出关键代码:DataResponse是项目中使用的结果封装实体类:forumDTO是此功能的参数实体,如果有需要请留言. 常量如下: private static final Str

  • Springboot/Springcloud项目集成redis进行存取的过程解析

    目录 一.redis去官网https://redis.io/download下载后解压 二.在项目中添加redis依赖 三.redis的使用 四.字符串类型存取(k,v) 五.存取对象(k,object) 六.List类型(k,list) 七.Hash类型(K,k,value) 八.然后打开redis desktop manager工具可以看到你存储的数据 九.如果想要在单元测试中进行存取 九.实际使用思路 前言:Redis支持五种数据类型:string(字符串),hash(哈希),list(列

  • springboot 注解方式批量插入数据的实现

    目录 一.使用场景 二.实现方法 1.mysql表结构 2.domain 3.mapper 4.测试类 5.测试结果 三.插入效率对比 1.批量插入 2.一条一条插入 一.使用场景 一次请求需要往数据库插入多条数据时,可以节省大量时间,mysql操作在连接和断开时的开销超过本次操作总开销的40%. 二.实现方法 1.mysql表结构 2.domain package com.cxstar.order.domain; import java.util.Date; @lombok.Data publ

  • Springboot 手动分页查询分批批量插入数据的实现流程

    目录 前言 业务场景是什么? 正文 前言 业务场景是什么? 就是数据库的一批数据,量不少,需要执行同步插入到别的地方. 简单点肯定是一次性查出来,然后循环一个个插入,完事. 考虑点: ① 数据量大,一次性查出来操作,很爆炸. ② 循环里面一次一次地去插入,如果非业务场景必要,基本是不会在循环里面使用sql操作的. 所以该篇作为抛砖引玉(还有很多需要考虑的点),给出一种解决上面场景的代码编写方案, 手动分页,查询后批量插入. 正文 实现的流程简图: 看看最终实现的效果,通过代码日志记录了这个实现后

  • 分布式爬虫处理Redis里的数据操作步骤

    存入MongoDB 1.启动MongoDB数据库:sudo mongod 2.执行下面程序:py2 process_youyuan_mongodb.py # process_youyuan_mongodb.py # -*- coding: utf-8 -*- import json import redis import pymongo def main(): # 指定Redis数据库信息 rediscli = redis.StrictRedis(host='192.168.199.108',

随机推荐