经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
SpringBoot Redis批量存取数据的操作
来源:jb51  时间:2021/8/4 13:35:02  对本文有异议

SpringBoot Redis批量存取数据

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

  1. package com.huateng.applacation.service;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.dao.DataAccessException;
  5. import org.springframework.data.redis.connection.RedisConnection;
  6. import org.springframework.data.redis.core.RedisCallback;
  7. import org.springframework.data.redis.core.StringRedisTemplate;
  8. import org.springframework.stereotype.Component;
  9. import java.util.List;
  10. /**
  11. * @program: applacation
  12. * @description:
  13. * @author: daiwenlong
  14. * @create: 2019-01-24 13:26
  15. **/
  16. @Component
  17. public class RedisService {
  18. @Autowired
  19. @Qualifier("stringRedisTemplate")
  20. private StringRedisTemplate redisTemplate;
  21. public void insertKey(List<String> keys, String value){
  22. //批量get数据
  23. List<Object> list = redisTemplate.executePipelined(new RedisCallback<String>() {
  24. @Override
  25. public String doInRedis(RedisConnection connection) throws DataAccessException {
  26. for (String key : keys) {
  27. connection.get(key.getBytes());
  28. }
  29. return null;
  30. }
  31. });
  32. //批量set数据
  33. redisTemplate.executePipelined(new RedisCallback<String>() {
  34. @Override
  35. public String doInRedis(RedisConnection connection) throws DataAccessException {
  36. for (int i=0;i<keys.size();i++) {
  37. connection.set(keys.get(i).getBytes(),value.getBytes());
  38. }
  39. return null;
  40. }
  41. });
  42. }
  43. }

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

  1. /**
  2. * 合同批量导入redis
  3. *
  4. * @param contractBOList
  5. * @param expire
  6. * @return com.openailab.oascloud.common.model.ResponseResult
  7. * @author zxzhang
  8. * @date 2019/10/14
  9. */
  10. @Override
  11. public void contractBatchSetRedis(String contractBOList, long expire) {
  12. List<ContractBO> contracts = JSONObject.parseArray(contractBOList, ContractBO.class);
  13. if (contracts == null || contracts.size() == 0) {
  14. return;
  15. }
  16. //批量set数据
  17. redisUtil.getRedisTemplate().executePipelined((RedisCallback<String>) connection -> {
  18. for (ContractBO contract : contracts) {
  19. connection.setEx((RedisPrefixConst.CONTRACT_PREFIX + contract.getBusinessCode() + RedisPrefixConst.UNDERLINE_SEPARATOR + contract.getContractNo()).getBytes(), expire, JSONObject.toJSONString(contract).getBytes());
  20. }
  21. return null;
  22. });
  23. }
  24. /**
  25. * 合同批量获取redis
  26. *
  27. * @param contractBOList
  28. * @return java.lang.String
  29. * @author zxzhang
  30. * @date 2019/10/14
  31. */
  32. @Override
  33. public List<Object> contractBatchGetRedis(String contractBOList) {
  34. List<ContractBO> contracts = JSONObject.parseArray(contractBOList, ContractBO.class);
  35. if (contracts == null || contracts.size() == 0) {
  36. return null;
  37. }
  38. List<Object> list = redisUtil.getRedisTemplate().executePipelined((RedisCallback<String>) connection -> {
  39. for (ContractBO contract : contracts) {
  40. connection.get((RedisPrefixConst.CONTRACT_PREFIX + contract.getBusinessCode() + RedisPrefixConst.UNDERLINE_SEPARATOR + contract.getContractNo()).getBytes());
  41. }
  42. return null;
  43. });
  44. return list;
  45. }

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

redisTemplate批量写入数据

  1. /**
  2. * 批量写入数据
  3. * @param objectMap
  4. * @return
  5. */
  6. public void saveMap(final Map<String,Object> objectMap) {
  7. //序列化成字节数组
  8. final Map<byte[],byte[]> byteMap=new HashMap<>();
  9. for(Map.Entry<String,Object> objectEntry:objectMap.entrySet()){
  10. String key=objectEntry.getKey();
  11. final byte[] keyBytes = redisTemplate.getStringSerializer().serialize(key);
  12. Object value=objectEntry.getValue();
  13. final byte[] valueBytes =SerializeUtil.serialize(value);
  14. byteMap.put(keyBytes,valueBytes);
  15. }
  16. redisTemplate.execute(new RedisCallback<Object>() {
  17. @Override
  18. public Object doInRedis(RedisConnection connection) {
  19. try{
  20. connection.mSet(byteMap);
  21. }catch (Exception ex){
  22. log.error("redis批量写入数据异常:"+ex.getMessage(),ex);
  23. }
  24. return null;
  25. }
  26. });
  27. }

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号