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)和时空数据…...
33-47 树
33. 二叉树的中序遍历 class Solution(object):def inorderTraversal(self, root):res []self._inorder(root, res)return resdef _inorder(self, node, res):if node:self._inorder(node.left, res)res.append(node.val)self._inorder(node.right, res) 34. 二叉树的最大深…...
C++面向对象编程核心概念与实践:从封装、继承到多态与设计模式
1. 项目概述:从代码仓库到面向对象思想的内化看到这个仓库标题Ayat-Gamal/Cpp_OOP_Labs,我第一反应是,这大概率是一位计算机科学或软件工程专业的学生(或者是一位自学者)在学习C面向对象编程(OOP࿰…...
【空间计算】【复杂系统】运动几何及运动测量
一、人类运动几何的全息参数体系与依赖关系分析 1.1、空间数学理论基础框架 1. 空间数据结构体系 数据结构 数学表示 参数维度 拓扑性质 计算复杂度 适用场景 点云 P = {p_i ∈ ℝ} 3N 无结构 O(N) 原始数据 网格 M = (V,E,F) V:3N_v, E:2N_e, F:3N_f 二维…...
VoLTE技术解析:4G语音实现原理与优化实践
1. VoLTE技术概述VoLTE(Voice over LTE)作为4G LTE网络上的语音解决方案,从根本上改变了传统移动语音的传输方式。这项技术将语音信号数字化为IP数据包,通过LTE网络的全IP架构进行传输,完全摆脱了2G/3G时代依赖的电路交…...
Java AI集成实战:ai4j项目解析与生产环境应用指南
1. 项目概述与核心价值 最近在开源社区里,一个名为 LnYo-Cly/ai4j 的项目引起了我的注意。乍一看这个标题,你可能会有点懵——“ai4j”?是“AI for Java”的缩写吗?没错,这正是它的核心定位。作为一个在Java生态里摸…...
GBase 8s 之 dbschema 导出数据库对象定义介绍
在数据库管理和开发过程中,经常需要导出数据库对象的定义,以便进行备份、迁移或分析。GBase 8s 提供了 dbschema 工具,能够方便地导出各种数据库对象的定义。本文将详细介绍 dbschema 的使用方法,帮助你快速掌握这一实用工具。…...
Windows APK安装器:告别模拟器,直接在Windows上安装安卓应用
Windows APK安装器:告别模拟器,直接在Windows上安装安卓应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行安…...
MedComm(IF=10.7)中大孙逸仙纪念医院姚和瑞等团队:多模态数据融合AI模型揭示乳腺癌肿瘤微环境免疫分型异质性与增强的风险分层
01文献学习今天分享的文献是由中大孙逸仙纪念医院姚和瑞等团队于2024年12月在《MedComm》(中科院1区top,IF10.7)上发表的研究“Multimodal data fusion AI model uncovers tumor microenvironment immunotyping heterogeneity and enhanced r…...
2230固态硬盘延长安装技巧指南!
2230规格的M.2固态硬盘因体积小巧,广泛应用于掌机、轻薄笔记本和微型PC,但许多主板的M.2插槽默认为2280规格,导致2230硬盘“装不稳”。本文详细讲解2230与2280的尺寸差异、延长安装的核心方法(转接支架、螺丝柱调整、散热适配&…...
光栅散射光与仪器杂散光:成因、测量与系统级抑制策略
1. 项目概述:从“完美”光栅到现实噪声在光谱分析、激光系统乃至精密光学测量的世界里,我们常常把衍射光栅想象成一个完美的“光之指挥家”,它能将不同波长的光精准地分离开来,指向各自该去的方向。然而,任何一位有实际…...
