如何分段存储Redis键值对

说明:本文介绍针对一个value过长的键值对,如何分段存储;

场景

当我们需要存入一个String类型的键值对到Redis中,如下:

(缓存接口)

public interface CacheService {/*** 添加一个字符串键值对* @param key 键* @param value 值*/void setString(String key, String value);
}

(Redis实现)

import com.hezy.service.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class RedisServiceImpl implements CacheService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Overridepublic void setString(String key, String value) {redisTemplate.opsForValue().set(key, value);}
}

(使用)

import com.hezy.service.impl.RedisServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class RedisServiceImplTest {@Autowiredprivate RedisServiceImpl redisService;@Testpublic void test1() {String key = "content";String value = "这是一段分非常大非常大的字符串…………………………非常大";redisService.setString(key, value);}
}

(查看Redis)

在这里插入图片描述

有时候,我们存入的字符串可能过长,过大,有可能来自于一个大对象的序列化。这时候存入的key-value,会造成value过大,会触发一些预警。

可以采用我下面这种分段存储的方法。

优化

思路:将字符串分段,每一段生成一个key,然后将这些分段key再用Redis的List类型存储;获取时就先获取这些分段key,再循环去get对应的字符串,拼接起来就是完整的字符串。

如下:分段存,增加一个参数,设置每段字符串的长度

(缓存接口)

    /*** 分段存储* @param key 键* @param value 值* @param chunkSize 每个分段大小*/void setStrSub(String key, String value, int chunkSize);

(Redis实现)

    @Overridepublic void setStrSub(String key, String value, int chunkSize) {// 将value,按照length,分成多个部分int totalChunks = (int) Math.ceil((double) value.length() / chunkSize);// 定义一个分段数据key集合List<String> subKeys = new ArrayList<>(totalChunks);// 将字符串分成多段for (int i = 0; i < totalChunks; i++) {// 计算分段起止位置int startIndex = i * chunkSize;int endIndex = Math.min(startIndex + chunkSize, value.length());// 获取对应分段数据String chunkValue = value.substring(startIndex, endIndex);// 拼接分段keyString subKey = key + "_" + i;// 存储分段数据setString(subKey, chunkValue);// 将分段key添加到集合subKeys.add(subKey);}// 分段key添加到集合setList(key, subKeys);}

(添加一个集合到Redis)

    @Overridepublic void setList(String key, List value) {redisTemplate.opsForList().rightPushAll(key, value);}

启动,测试

    @Testpublic void test2() {String key = "content";String value = "这是一段分非常大非常大的字符串…………………………非常大";redisService.setStrSub(key, value, 5);}

查看Redis

在这里插入图片描述

在这里插入图片描述

然后,要取数据,也很简单;

(缓存接口)

    /*** 获取字符串(分段)* @param key* @return*/String getStrSub(String key);

(Redis实现)

    @Overridepublic String getStrSub(String key) {// 先把分段key获取出来List<String> list = getList(key);// 字符串拼接,用StringBuilder,线程安全StringBuilder stringBuilder = new StringBuilder();for (String subKey : list) {String subValue = getString(subKey);// 这里要跳过null,不然最后输出会把null转为字符串if (subValue == null) {continue;}stringBuilder.append(subValue);}// 如果没有数据,返回nullreturn "".contentEquals(stringBuilder) ? null : stringBuilder.toString();}

(Redis获取一个List)

    @Overridepublic List getList(String key) {return redisTemplate.opsForList().range(key, 0, -1);}

(使用)

    @Testpublic void test3() {String content = redisService.getStrSub("content");System.out.println(content);}

(打印)

在这里插入图片描述

总结

本文介绍了Redis分段存储一个大键值对(String)的一种方式,看下来,实现并不复杂。使用上也可以很方便,可以考虑把分段的存取和普通的存取都兼容起来,这样对于使用者,只需要加一个参数(分段大小)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C-操作符

操作符种类 在C语言中&#xff0c;操作符有以下几种&#xff1a; 算术操作符 移位操作符 位操作符 逻辑操作符 条件操作符 逗号表达式 下标引用&#xff0c;函数调用 拓展&#xff1a;整型提升 我们介绍常用的几个 算术操作符 &#xff08;加&#xff09;&#xff…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务&#xff0c;不是像其他服务器一样&#xff0c;负责逻辑处理&#xff0c;然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息&#xff0c; 第一步&a…

浅析大数据时代下的网络安全

一、大数据时代下网络安全的现状 在全球化进程不断深入发展的情况下&#xff0c;互联网行业发展速度也更加迅猛&#xff0c;人们对网络信息的需求量不断增加&#xff0c;所以目前已经进入了大数据时代。 随着计算机技术的不断发展&#xff0c;我国互联网网络规模、网民数量、…

【SQL常用日期函数(二)】

SQL 常用日期函数-基于 Impala 3.4.0 接之前 SQL常用日期函数&#xff08;一&#xff09;介绍了实现计算上年末、上级末、上月末、上年同期的方法和函数&#xff0c;这次继续分享常用的SQL日期函数及使用场景。包括&#xff1a;DAYOFWEEK 函数、TRUNC 函数、LAST_DAY 函数。 …

计算机基础 原码反码补码问题

整数的二进制的表示形式&#xff1a;其实有三种 原码&#xff1a;直接根据数值写出的二进制序列就是原码 反码&#xff1a;原码的符号位不变&#xff0c;其他位按位取反就是反码 补码&#xff1a;反码1&#xff0c;就是补码 负数&#xff1a;-1 以补码形式存放在内存 写出 -1…

题海拾贝——生成元(Digit Generator,ACM/ICPC SEOUL 2005,UVa1583)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 欢迎点赞关注&#xff01; 1、题目描述 如果x加上x的各个数字之和得到y&#xff0c;就说x是y的生成元。给出(1<n<10…

笑话故事 第十七期

好久不见&#xff0c;以下是为您准备的笑话&#xff0c;希望能让您捧腹大笑&#xff1a; 1. 名字的误会 小明新交了一个女朋友&#xff0c;带回家给父母看。 妈妈问&#xff1a;“姑娘&#xff0c;你叫什么名字啊&#xff1f;” 女朋友&#xff1a;“阿姨&#xff0c;我叫小芳…

Clean Docker Images and Container by Cron Job

1.Cretae a clean_docker_containers.sh to clean containers (status: exited, dead) #!/bin/bash# 找到所有状态不正常的容器 containers$(docker ps -a --filter "statusexited" --filter "statusdead" --format "{{.ID}}")if [ -z "$…

欧科云链研究院:比特币还能“燃”多久?

出品&#xff5c; OKG Research 作者&#xff5c;Hedy Bi 本周二&#xff0c;隔夜“特朗普交易” 的逆转趋势波及到比特币市场。比特币价格一度冲高至约99,000美元后迅速回落至93,000美元以下&#xff0c;最大跌幅超6%。这是由于有关以色列和黎巴嫩有望达成停火协议的传闻引发…

Linux系统管理基础指南--习题

目录 一、基础知识与命令 二、 Linux的用户接口 三、文件权限与目录管理 四、shell相关知识 五、软件安装与网络 六、网络进程管理 一、基础知识与命令 1. (操作题)分别执行下述命令 ls -al cd ~ cd man -f man man –k cd man --help cal --help date --help bc --he…

hint: Updates were rejected because the tip of your current branch is behind!

问题 本地仓库往远段仓库推代码时候提示&#xff1a; error: failed to push some refs to 192.168.2.1:java-base/java-cloud.git hint: Updates were rejected because the tip of your current branch is behind! refs/heads/master:refs/heads/master [rejected] (…

设计模式面试大全:说一下单例模式,及其应用场景?

定义 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一&#xff0c;此模式保证某个类在运行期间&#xff0c;只有一个实例对外提供服务&#xff0c;而这个类被称为单例类。 单例模式也比较好理解&#xff0c;比如一个人一生当中只能有一个真…

go-zero使用自定义模板实现统一格式的 body 响应

前提 go环境的配置、goctl的安装、go-zero的基本使用默认都会 需求 go-zero框架中&#xff0c;默认使用goctl命令生成的代码并没有统一响应格式&#xff0c;现在使用自定义模板实现统一响应格式&#xff1a; {"code": 0,"msg": "OK","d…

【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息

目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉&#xff0c;出现新的请求结果&#xff0c;参数start更新&#xff0c;每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…

java-a+b 开启java语法学习

代码 &#xff08;ab) import java.util.Scanner; //导入 java.util包中的Scanner 类&#xff0c;允许读取键盘输入数据public class Main { // 创建一个公共类 Mainpublic static void main(String[] args) {//程序入口点&#xff0c;main方法Scanner scanner new Scanner(…

spring boot+jpa接入达梦数据库

文章目录 前言依赖配置对应的domain类和repository 前言 最近有一个新项目&#xff0c;由于信息安全等要求只能使用达梦数据库&#xff08;dm8&#xff09;&#xff0c;之前从来没用过&#xff0c;特此开一个笔记记录一下spring bootjpa如何使用达梦数据库完成开发。 依赖 p…

Ardusub源码剖析(1)——AP_Arming_Sub

代码 AP_Arming_Sub.h #pragma once#include <AP_Arming/AP_Arming.h>class AP_Arming_Sub : public AP_Arming { public:AP_Arming_Sub() : AP_Arming() { }/* Do not allow copies */CLASS_NO_COPY(AP_Arming_Sub);bool rc_calibration_checks(bool display_failure)…

玻璃效果和窗户室内效果模拟

一、玻璃效果 首先来讲如何模拟玻璃效果。玻璃的渲染包括三部分&#xff0c;普通场景物体的渲染、反射和折射模拟、毛玻璃模拟。作为场景物体&#xff0c;那么类似其它场景物体Shader一样&#xff0c;可以使用PBR、BlingPhong或者Matcap&#xff0c;甚至三阶色卡通渲染都可以。…

某东图标点选验证码

注意&#xff0c;本文只提供学习的思路&#xff0c;严禁违反法律以及破坏信息系统等行为&#xff0c;本文只提供思路 如有侵犯&#xff0c;请联系作者下架 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

九、Ubuntu Linux操作系统

一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助其官方网站:http…