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)和时空数据…...
如何将图片上的中文翻译成西班牙语?一键搞定电商详情页,低成本出海拉美市场(实战教程)
前言 在跨境电商越来越卷的今天,很多卖家开始把目光从欧美市场转向一个被低估的区域——拉丁美洲(LATAM)和西班牙市场。 但真正做起来你会发现,第一个拦路虎不是物流、不是选品,而是: ❗ 图片语言问题 尤…...
嬴姓有多罕见?全国不到1000人的姓氏,即将成为一个啤酒品牌
嬴姓,中国最古老的姓氏之一。全国不到1000人姓嬴。这个罕见的姓氏,即将成为一个啤酒品牌的名字。你身边有姓“嬴”的人吗?大概率没有。因为嬴姓太罕见了。据统计,全国姓“嬴”的人不到1000人。主要分布在江苏、山东、河北等地。嬴…...
计算机毕业设计Hadoop+Spark+AI大模型Steam游戏推荐系统 游戏可视化 机器学习 深度学习 大 数据毕业设计
温馨提示:本人主页置顶文章开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章开头有 CSDN 平台官方提供的学长联系…...
Agent 工具调用决策链的治理框架:从意图识别到执行回滚的长期演进策略
问题现象 生产环境中,智能体系统在面对用户请求时频繁出现“该调工具却直接回复”或“不该调工具却强行调用”的误判行为。典型表现为:用户询问“帮我查一下昨天的订单”,系统返回一段通用话术而非调用订单查询接口;而当用户明确说…...
TFT:一个可解释的变换器
原文:towardsdatascience.com/tft-an-interpretable-transformer-70147bcf6212 简介 世界上每家公司都需要预测来规划其运营,无论它们在哪个行业运营。公司中有几个预测用例需要解决,例如,年度计划的销售,每月计划的语…...
Unity UI实战:从零构建高效Dropdown下拉菜单系统
1. Dropdown组件基础解析 下拉菜单是游戏UI中最常用的交互控件之一,Unity内置的Dropdown组件让开发者能够快速实现选择功能。我第一次在项目中用到Dropdown时,发现它比想象中要复杂得多——表面上看只是个简单的选择框,但实际包含Label文本、…...
打卡信奥刷题(3259)用C++实现信奥题 P8652 [蓝桥杯 2017 国 C] 小数第 n 位
P8652 [蓝桥杯 2017 国 C] 小数第 n 位 题目描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 000,它们就有了统一的形式。 本题的任务是:在上面的约定下&a…...
LLM长序列服务优化:LServe的块稀疏注意力技术
1. 长序列LLM服务的核心挑战在当今AI领域,大型语言模型(LLM)已成为处理长文本、复杂推理和多轮对话的关键工具。然而,随着上下文窗口的不断扩展(从最初的2k到现在的512k甚至更长),传统的服务系统…...
终极指南:如何让Photoshop支持AVIF格式并实现图像体积减半
终极指南:如何让Photoshop支持AVIF格式并实现图像体积减半 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 想让你的Photoshop支持最新的AVIF图像格式…...
电子发票格式兼容难题?开源Ofd2Pdf三步实现高效自动化转换
电子发票格式兼容难题?开源Ofd2Pdf三步实现高效自动化转换 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf OFD转PDF是处理电子发票、政府公文和电子证照的核心需求,Ofd2Pdf作为…...
