好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot Redis批量存取数据的操作

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测试数据mon.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

查看更多关于SpringBoot Redis批量存取数据的操作的详细内容...

  阅读:38次