服务器之家

服务器之家 > 正文

SpringBoot Redis批量存取数据的操作

时间:2021-11-05 09:53     来源/作者:张志翔ۤ

SpringBoot Redis批量存取数据

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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() 来做就可以了,过期时间单位是秒,相关代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
 * 合同批量导入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批量写入数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
    * 批量写入数据
    * @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;
           }
       });
   }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://vegetable-chicken.blog.csdn.net/article/details/102553511

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部