Redis的数据类型Hash使用场景实战
Redis的数据类型Hash使用场景
常见面试题:redis在你们项目中是怎么用的,除了String数据类型还使用什么数据类型?
怎么保证缓存和数据一致性等问题…
Hash模型使用场景
知识回顾:
redisTemplate.opsForHash() 方法是 Redis 的 Hash(哈希)数据结构的操作模板方法。它返回一个 HashOperations 实例,可以使用该实例执行对哈希数据结构的各种操作,如添加、删除、获取元素、获取全部元素等。
使用 redisTemplate.opsForHash() 方法进行哈希操作的示例如下:
// 添加元素到哈希
redisTemplate.opsForHash().put("myhash", "key1", "value1");
redisTemplate.opsForHash().put("myhash", "key2", "value2");// 获取哈希中指定的元素
String value1 = (String) redisTemplate.opsForHash().get("myhash", "key1");// 获取哈希中所有元素
Map<Object, Object> allEntries = redisTemplate.opsForHash().entries("myhash");// 删除哈希中指定的元素
redisTemplate.opsForHash().delete("myhash", "key1");// 判断哈希中是否存在指定的元素
boolean exist = redisTemplate.opsForHash().hasKey("myhash", "key1");
场景使用场景
1,对象缓存 比如存储用户信息 一个字段对应多个属性
id:1 、name:老许 、 age:18 、 sex:0 、 hobby:java …
2、同一个用户在不同所属系统的待办个数统计

代码实现
应用场景一:保存用户的信息 h:user_key_prefix + account hk:acount hv:user
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
项目启动时候自动将数据库用户信息保存到redis中
package com.xx.xx.xx.config;import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;import javax.annotation.PostConstruct;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;/*** @author psd*/
@Slf4j
@Configuration
public class SysUserConfig {@Autowiredprivate SysUserService sysUserService;@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate RedisOperationUtils redisOperationUtils;@PostConstructpublic void init() {// 查询所有的用户信息List<SysUserEntity> userEntityList = sysUserService.queryAllSysUser();List<String> accountList = userEntityList.stream().map(SysUserEntity::getAccount).collect(Collectors.toList());// 清除缓存中的数据 accountList.stream().forEach(account -> redisTemplate.delete(redisOperationUtils.USER_KEY_PREFIX + account));// 重新新增缓存中的数据userEntityList.stream().forEach(userEntity -> {// 设置一个随机过期时间 4 ~ 8小时redisTemplate.opsForHash().put(redisOperationUtils.USER_KEY_PREFIX + userEntity.getAccount(), userEntity.getAccount(),JSON.toJSONString(userEntity));redisTemplate.expire(redisOperationUtils.USER_KEY_PREFIX + userEntity.getAccount(), 3600 + redisOperationUtils.random.nextInt(4 * 3600),TimeUnit.SECONDS);});}}
配置类
@Component
public class RedisOperationUtils {/*** 用户信息redis中的key*/public final String USER_KEY_PREFIX = "rbac:user:";public final Random random = new SecureRandom();
}
项目中任意获取的可以
@Testpublic void test03(){Object o = redisTemplate.opsForHash().get(redisOperationUtils.USER_KEY_PREFIX + "Lin" , "Lin");SysUserEntity entity = JSON.parseObject((String) o, SysUserEntity.class);System.out.println("entity = " + entity);}
可能存在疑问点:
1、为啥没有用String类型 同样可以满足,这个是考虑到有些字段可能会改动,项目在初期阶段可能某些字段会修改,添加新增,包括删除, 总和优先考虑Hash模型,利于维护,不用单个字段进行修改 删除等操作
2、如果数据有修改的情况下,你是怎么保证数据类型一致性
先删除redis中的数据,再写数据到mysql 再删除redis中数据
优点细节有以下几处:
1、设置过期时间时候,没有采用 每次new Random();而是放到一个工具类里面,节约内存
2、使用Random random = new SecureRandom(); 是安全的,
3、采用随机过期时间,随机性比较好 减少redis的内存使用
应用场景二:保存用户的信息 h:phoneNum hk:typeStr hv:count
// h:phoneNum hk:typeStr hv:count // 对应唯一标识手机号: 139xxxxxxxx hk:数据来源类型 hv:个数 @Overridepublic void insertTask() {redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX + "18900001111", "xj", "10");redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX + "18900001111", "kd", "8");redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX + "18900001111", "yh", "6");redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX + "15665440000", "xj", "2");redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX + "15665440000", "kd", "3");redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX + "15665440000", "yh", "12");}
再获取时候
// 获取的taskCountStr 注意是个字符串,需要做类型转换,封装成vo给前端,用于渲染 具体业务具体分析String taskCountStr = (String) redisTemplate.opsForHash().get(redisOperationUtils.KEY_PREFIX + "153xxxxxxxx", taskEnum.getOwningSystemCode());
喜欢我的文章的话,点个阅读或者点个点赞,是我编写博客的动力,持续更新中
相关文章:
Redis的数据类型Hash使用场景实战
Redis的数据类型Hash使用场景 常见面试题:redis在你们项目中是怎么用的,除了String数据类型还使用什么数据类型? 怎么保证缓存和数据一致性等问题… Hash模型使用场景 知识回顾: redisTemplate.opsForHash() 方法是 Redis 的 …...
HttpClient | 支持 HTTP 协议的客户端编程工具包
目录 1、简介 2、应用场景 3、导入 4、API 5、示例 5.1、GET请求 5.2、POST请求 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初…...
DP第一天:力扣● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
● 理论基础 DP大约五种问题: 动规基础(斐波那契数列、爬楼梯);背包问题;股票问题;打家劫舍;子序列问题。 要搞清楚: DP数组及其下标的含义;DP数组如何初始化&#x…...
Android Studio 安装Flutter插件但是没法创建项目
Android Studio 安装Flutter插件但是没法创建项目 如果你在Android Studio已经安装了Dart、Flutter插件,但是不能创建Flutter项目。 原因是因为Android Studio的版本更新,Android APK Support这个插件没被选中。 一旦勾选这个插件之后,就能…...
新春快乐(烟花、春联)【附源码】
新春快乐 一: C语言 -- 烟花二:Python -- 春联三:Python -- 烟花四:HTML -- 烟花 一: C语言 – 烟花 运行效果: #include <graphics.h> #include <math.h> #include <time.h> #include…...
nextcloud 优化扩展
cd /config vi config.php #ONLYOFFICE allow_local_remote_servers > true, #应用商店加速 appstoreenabled > true, appstoreurl > https://www.orcy.net/ncapps/v2/, #nginx配置调优 add_header Strict-Transport-Security max-age15552000; add…...
【CSS】css如何实现字体大小小于12px?
【CSS】css如何实现字体大小小于12px? 问题解决方案transform: scale(0.5)(常用)SVG 矢量图设置text 问题 文字需要显示为12px,但是小于12px的,浏览器是显示不来的 解决方案 transform: scale(0.5)(常用࿰…...
【Langchain+Streamlit】旅游聊天机器人
【LangchainStreamlit】打造一个旅游问答AI-CSDN博客 项目线上地址,无需openai秘钥可直接体验:http://101.33.225.241:8502/ github地址:GitHub - jerry1900/langchain_chatbot: langchainstreamlit打造的一个有memory的旅游聊天机器人&…...
〖大前端 - ES6篇②〗- let和const
说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…...
JAVA设计模式之代理模式详解
代理模式 1 代理模式介绍 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是:让你能够提供对象的替代…...
vivo发布2023 年度科技创新;阿里全新AI代理,可模拟人类操作手机
vivo 发布 2023 年度十大产品技术创新 近日,vivo 发布了「2023 年度科技创新」十大产品技术创新榜单,并将这些技术分为了 4 个板块。 「四大蓝科技」为 vivo 在去年推出的全新技术品牌,涵盖蓝晶芯片技术栈、蓝海续航系统、蓝心大模型、蓝河操…...
【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏15(附项目源码)
本节最终效果演示 文章目录 本节最终效果演示系列目录前言实现树倒下的效果拾取圆木砍树消耗卡路里斧头手臂穿模问题处理源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&…...
python巧用定理判断素数
目录 判断一个数n是否是素数 求一个数的素因数个数 求大于等于指定数的最小素数 在数论中有三个非常重要的关于素数的定理 1、任何数都可以表示成若干个素数的乘积 2、任意数的素因子一个大于根号n的自然数,另一个与其对应的因子则必小于根号n。 3、除了2和3以…...
2023年总结
人们总说时间会改变一切,但事实上你得自己来。 今年开始给自己的时间读书、工作、生活都加上一个2.0的release版本号,相比过去的一年还是有很多进步的。 就跟git commit一样,一步一步提交优化,年底了发个版本。用李笑来的话说&am…...
Git中为常用指令配置别名
目录 1 前言 2 具体操作 2.1 创建.bashrc文件 2.2 添加指令 2.3 使其生效 2.4 测试 1 前言 在Git中有一些常用指令比较长,当我们直接输入,不仅费时费力,还容易出错。这时候,如果能给其取个简短的别名,那么事情就…...
STM32内部Flash
目录 一、内部Flash简介 二、内部Flash构成 1. 主存储器 2. 系统存储区 3. 选项字节 三、内部Flash写入过程 1. 解锁 2. 页擦除 3. 写入数据 四、工程空间分布 某工程的ROM存储器分布映像: 1. 程序ROM的加载与执行空间 2. ROM空间分布表 一、内部Flash…...
html5 audio video
DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用: 可用: Google Chrome Close AutoUpdate-CSDN博客...
LoveWall v2.0Pro社区型校园表白墙源码
校园表白墙,一个接近于社区类型的表白墙,LoveWall。 源码特色; 点赞, 发评论, 发弹幕, 多校区, 分享页, 涉及违禁物等名词进行检测! 安装教程: 环境要求;…...
Flink cdc3.0动态变更表结构——源码解析
文章目录 前言源码解析1. 接收schema变更事件2. 发起schema变更请求3. schema变更请求具体处理4. 广播刷新事件并阻塞5. 处理FlushEvent6. 修改sink端schema 结尾 前言 上一篇Flink cdc3.0同步实例 介绍了最新的一些功能和问题,本篇来看下新功能之一的动态变更表结…...
WWW 2024 | 时间序列(Time Series)和时空数据(Spatial-Temporal)论文总结
WWW 2024已经放榜,本次会议共提交了2008篇文章,research tracks共录用约400多篇论文,录用率为20.2%。本次会议将于2024年5月13日-17日在新加坡举办。 本文总结了WWW 2024有关时间序列(Time Series)和时空数据…...
实时交易系统架构设计:从事件驱动到向量化框架的终极指南
实时交易系统架构设计:从事件驱动到向量化框架的终极指南 【免费下载链接】awesome-systematic-trading A curated list of insanely awesome libraries, packages and resources for systematic trading. Crypto, Stock, Futures, Options, CFDs, FX, and more | 量…...
深入解析BUCK、BOOST与Charge Pump电路的设计与应用
1. 开关电源基础:为什么需要BUCK、BOOST和Charge Pump? 刚入行那会儿,我总觉得电源设计就是个"变压器加整流桥"的事,直到某次项目里把12V电池直接怼到3.3V的MCU上——随着一缕青烟升起,我才明白电压转换这门…...
【Polars 2.0数据清洗成本控制白皮书】:20年ETL专家亲授5大降本增效实战模式,92%企业忽略的内存泄漏陷阱
第一章:Polars 2.0数据清洗成本控制全景认知在现代数据工程实践中,数据清洗不再仅关乎逻辑正确性,更深度绑定计算资源消耗、内存占用与执行延迟。Polars 2.0 通过零拷贝语义、惰性执行引擎重构与 Arrow-native 内存布局优化,将清洗…...
工业相机+Python视觉系统崩溃频发?(产线停机损失超¥8600/小时的5个隐藏代码陷阱)
第一章:工业相机视觉系统崩溃的根源诊断工业相机视觉系统在产线部署中一旦突发崩溃,往往表现为图像丢失、帧率归零、设备离线或软件进程异常终止。此类故障表面随机,实则多由底层软硬件协同失配引发,需从驱动层、通信协议、资源调…...
nRF51822 RTC1深度睡眠唤醒与80μA低功耗优化
1. nRF51822低功耗唤醒系统深度解析:RTC1驱动的深度睡眠唤醒机制与80μA电流优化实践1.1 项目背景与工程痛点定位nRF51_WakeUp项目聚焦于nRF51822 SoC在超低功耗场景下的精准唤醒能力构建,其核心目标是通过RTC1(Real-Time Counter 1ÿ…...
4大核心优势解决人脸处理难题:设计师与创作者的AI增强工具
4大核心优势解决人脸处理难题:设计师与创作者的AI增强工具 【免费下载链接】DZ-FaceDetailer a node for comfyui for restore/edit/enchance faces utilizing face recognition 项目地址: https://gitcode.com/gh_mirrors/dz/DZ-FaceDetailer 【问题诊断】为…...
LangChain4j vs Spring AI:Java AI 框架技术选型深度对比与生产落地指南
LangChain4j vs Spring AI:Java AI 框架技术选型深度对比与生产落地指南 摘要:当 Java 团队建设 AI 应用时,真正困难的通常不是“能否调通模型”,而是“如何把 Prompt、RAG、工具调用、可观测性、限流熔断、灰度发布、权限隔离与业务系统稳定地耦合起来”。本文不再停留在 …...
IntelliJ Conf:JetBrains Koog Java原生AI Agent框架实战
文章目录前言:Java程序员的"Agent焦虑"终于有解了认识Koog:不是又一个LangChain的Java版环境准备:5分钟让项目跑起来实战:从Hello World到智能客服第一步:定义工具(Tool)第二步&#…...
douyin-downloader:让每个人都能轻松获取无水印视频的技术利器
douyin-downloader:让每个人都能轻松获取无水印视频的技术利器 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 一、问题破局:揭开抖音内容获取的神秘面纱 1.1 内容获取的三大拦路虎 …...
