当前位置: 首页 > article >正文

redis的数据类型及java调用案例

Redis 的丰富数据类型是它能够适应多种场景的核心原因。下面我会结合JavaJedis 客户端的代码示例为你展示每种类型的典型用法和应用场景。1. 准备工作Java 连接 Redisxml!-- Maven 依赖 -- dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version4.3.0/version /dependencyjavaimport redis.clients.jedis.Jedis; public class RedisDemo { public static void main(String[] args) { // 连接本地 Redis 服务 Jedis jedis new Jedis(localhost, 6379); // 如果有密码 // jedis.auth(password); System.out.println(连接成功: jedis.ping()); // 返回 PONG } }2. 各数据类型 Java 使用案例2.1 String字符串场景缓存、计数器、分布式锁、分布式 ID 生成。java// 缓存 jedis.set(user:1000:name, 张三); String name jedis.get(user:1000:name); // 计数器文章阅读量 jedis.incr(article:1001:views); long views Long.parseLong(jedis.get(article:1001:views)); // 分布式锁仅示例实际需考虑释放原子性 String lockKey lock:order:100; String requestId UUID.randomUUID().toString(); String result jedis.set(lockKey, requestId, NX, EX, 10); // 10秒过期 if (OK.equals(result)) { try { // 执行业务逻辑 } finally { // 释放锁使用 Lua 脚本保证原子性 String script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end; jedis.eval(script, 1, lockKey, requestId); } }2.2 Hash哈希场景对象存储、购物车、动态统计。java// 存储用户对象 jedis.hset(user:1000, name, 张三); jedis.hset(user:1000, age, 25); jedis.hset(user:1000, email, zhangsanexample.com); // 批量获取 MapString, String user jedis.hgetAll(user:1000); System.out.println(user.get(name)); // 张三 // 购物车用户 1000 的商品 2001 数量 1 jedis.hincrBy(cart:1000, 2001, 1); Long quantity Long.parseLong(jedis.hget(cart:1000, 2001));2.3 List列表场景消息队列、最新列表、栈/队列。java// 最新评论列表左侧插入 jedis.lpush(comments:article:1001, 评论1, 评论2, 评论3); // 获取最新 5 条 ListString latestComments jedis.lrange(comments:article:1001, 0, 4); // 简单消息队列生产者 jedis.lpush(queue:task, task1, task2); // 消费者阻塞式 ListString tasks jedis.brpop(0, queue:task); // 0 表示永久阻塞 String task tasks.get(1);2.4 Set集合场景去重、标签系统、共同好友、抽奖。java// 抽奖将用户 ID 加入集合 jedis.sadd(lottery:20231001, user1, user2, user3, user1); // 重复添加无效 // 随机抽取 1 名中奖者 String winner jedis.srandmember(lottery:20231001); // 或抽中后移除 String winner2 jedis.spop(lottery:20231001); // 共同好友 jedis.sadd(user:1000:friends, 1001, 1002, 1003); jedis.sadd(user:1001:friends, 1000, 1002, 1004); SetString commonFriends jedis.sinter(user:1000:friends, user:1001:friends); // 输出 [1002]2.5 Sorted Set有序集合场景排行榜、延迟队列、带权重的任务调度。java// 游戏积分榜 jedis.zadd(game:rank, 100, player1); jedis.zadd(game:rank, 95, player2); jedis.zadd(game:rank, 110, player3); // 获取前三名按分数降序 SetString top3 jedis.zrevrange(game:rank, 0, 2); // 获取玩家 1 的排名0 开始 Long rank jedis.zrevrank(game:rank, player1); // 延迟队列将任务按执行时间戳作为分数存入 long executeTime System.currentTimeMillis() 60000; // 1分钟后 jedis.zadd(delay:queue, executeTime, task:100); // 定时任务获取到期任务 SetString tasks jedis.zrangeByScore(delay:queue, 0, System.currentTimeMillis()); for (String task : tasks) { // 处理任务 jedis.zrem(delay:queue, task); // 处理完移除 }2.6 Bitmap位图场景用户签到、活跃用户统计、布隆过滤器。java// 用户 1000 在 2023-10-01 签到偏移量 0 表示第一天 jedis.setbit(sign:1000:202310, 0, true); // 检查是否签到 Boolean signed jedis.getbit(sign:1000:202310, 0); // 统计当月签到次数 Long count jedis.bitcount(sign:1000:202310); // 日活统计用户 ID 作为偏移量限制 ID 连续 jedis.setbit(active:20231001, 1000, true); jedis.setbit(active:20231001, 1001, true); Long dau jedis.bitcount(active:20231001);2.7 HyperLogLog场景UV 统计允许误差。java// 添加访问用户 jedis.pfadd(uv:article:1001, user1, user2, user3, user1); // user1 重复只计一次 // 获取 UV long uv jedis.pfcount(uv:article:1001); // 合并多个页面的 UV jedis.pfmerge(uv:total, uv:article:1001, uv:article:1002);2.8 Geo地理空间场景附近的人、位置服务、配送范围判断。java// 添加位置经度纬度成员名 jedis.geoadd(locations, 116.404, 39.915, 北京); jedis.geoadd(locations, 121.480, 31.235, 上海); jedis.geoadd(locations, 113.264, 23.129, 广州); // 计算北京到上海的距离单位km Double dist jedis.geodist(locations, 北京, 上海, GeoUnit.KM); System.out.println(dist); // 约 1067 km // 查找半径 1000km 内的城市 ListGeoRadiusResponse cities jedis.georadiusByMember(locations, 北京, 1000, GeoUnit.KM); for (GeoRadiusResponse city : cities) { System.out.println(city.getMemberByString()); // 北京、上海 }2.9 Stream流场景可靠消息队列、事件溯源、日志管道。java// 添加消息每个消息有唯一 ID MapString, String msg new HashMap(); msg.put(orderId, 1001); msg.put(amount, 199); String messageId jedis.xadd(orders, StreamEntryID.NEW_ENTRY, msg, 10000, false); System.out.println(Message ID: messageId); // 消费者读取最新消息阻塞 ListMap.EntryString, ListStreamEntry entries jedis.xread(1, 0, orders); for (Map.EntryString, ListStreamEntry entry : entries) { for (StreamEntry se : entry.getValue()) { System.out.println(se.getFields()); // {orderId1001, amount199} } } // 消费者组需 Redis 5.0Jedis 支持 jedis.xgroupCreate(orders, group1, new StreamEntryID(0), true); // 消费者读取并确认 ListMap.EntryString, ListStreamEntry groupEntries jedis.xreadGroup(group1, consumer1, 1, 0, false, orders); for (Map.EntryString, ListStreamEntry entry : groupEntries) { for (StreamEntry se : entry.getValue()) { // 处理消息 jedis.xack(orders, group1, se.getID()); } }3. 综合案例用户会话管理与商品浏览历史结合多种类型实现一个小功能java// 1. 用户登录String 存 TokenHash 存用户信息 String token UUID.randomUUID().toString(); jedis.setex(token: token, 7200, 1000); // 2小时过期 MapString, String userInfo new HashMap(); userInfo.put(name, 张三); userInfo.put(level, vip); jedis.hset(user:1000, userInfo); // 2. 浏览商品List 记录历史保留最近 10 条 String historyKey history:1000; jedis.lpush(historyKey, 2001, 2002, 2003); jedis.ltrim(historyKey, 0, 9); // 只保留 10 条 ListString recent jedis.lrange(historyKey, 0, 4); // 最近 5 条 // 3. 商品详情缓存String 存 JSON String productJson {id:2001,name:手机,price:2999}; jedis.setex(product:2001, 3600, productJson); // 4. 排行榜Sorted Set 记录热销商品 jedis.zincrby(hot:products, 1, 2001); // 商品 2001 热度1 // 5. 防重复下单Set 记录已购买用户 if (!jedis.sismember(order:2001:buyers, 1000)) { // 执行下单逻辑 jedis.sadd(order:2001:buyers, 1000); }4. 最佳实践提示连接池生产环境使用JedisPool避免频繁创建连接。序列化存储 Java 对象时建议用 JSONJackson或 Protobuf避免 JDK 原生序列化体积大、不安全。管道Pipeline批量操作时用管道减少 RTT。Lua 脚本保证多个操作的原子性如分布式锁释放。过期时间缓存数据必须设置合理的 TTL防止内存耗尽。BigKey 规避避免存储过大或元素过多的 key使用UNLINK异步删除。

相关文章:

redis的数据类型及java调用案例

Redis 的丰富数据类型是它能够适应多种场景的核心原因。下面我会结合 Java&#xff08;Jedis 客户端&#xff09; 的代码示例&#xff0c;为你展示每种类型的典型用法和应用场景。1. 准备工作&#xff1a;Java 连接 Redisxml<!-- Maven 依赖 --> <dependency> <…...

Nanbeige 4.1-3B清爽WebUI效果展示:支持语音输入转文字+AI回复一体化

Nanbeige 4.1-3B清爽WebUI效果展示&#xff1a;支持语音输入转文字AI回复一体化 1. 引言&#xff1a;当AI对话遇见极简美学 想象一下&#xff0c;你打开一个AI对话界面&#xff0c;看到的不是拥挤的侧边栏、死板的方形头像和密密麻麻的按钮&#xff0c;而是一个像手机短信应用…...

A*算法是路径规划领域的经典算法,但在实际应用中可能存在一些不足。为了提高效率和效果,我们可以对其进行改进

改进A*算法 算法对比 数据详细 路径规划算法 Matlab 传统A*算法 先来看传统A*算法的基本框架&#xff1a; function path aStarSearch(grid, start, goal)% 初始化优先队列priorityQueue [];% 评估函数值g zeros(size(grid));h ones(size(grid));% 父节点记录parent ze…...

保姆级教程:用Android Studio CPU Profiler分析视频播放卡顿问题(含火焰图解读技巧)

深度解析Android视频播放卡顿&#xff1a;CPU Profiler实战与火焰图精读指南 当你在开发一款视频类应用时&#xff0c;是否遇到过这样的场景&#xff1a;用户反馈播放高清视频时频繁卡顿&#xff0c;评论区充斥着"一卡一卡的"、"看着头晕"的差评&#xff1…...

Linux下frp内网穿透实战:从零搭建安全高效的远程访问通道

1. 为什么你需要frp内网穿透&#xff1f; 想象一下这个场景&#xff1a;你在家里搭建了一个NAS存储服务器&#xff0c;存满了珍贵的家庭照片和工作文档&#xff1b;或者你在办公室的Linux服务器上部署了一个内部使用的Web应用。这些服务运行得非常好&#xff0c;但有个致命问题…...

CUDA编程避坑指南:共享内存Bank Conflict的实战排查与优化(附NVIDIA Nsight工具使用)

CUDA共享内存性能调优实战&#xff1a;从Bank Conflict诊断到Nsight工具链深度解析 当你的CUDA Kernel性能提升陷入瓶颈时&#xff0c;共享内存可能是那个既熟悉又陌生的关键因素。作为GPU编程中最接近寄存器速度的内存资源&#xff0c;共享内存理论上能带来数量级的加速&…...

微信小程序滚动加载实战:如何避免列表卡顿(附完整代码)

微信小程序滚动加载实战&#xff1a;如何避免列表卡顿&#xff08;附完整代码&#xff09; 在移动互联网时代&#xff0c;用户体验的流畅度直接决定了产品的留存率。对于微信小程序开发者而言&#xff0c;列表滚动卡顿是一个常见但棘手的问题&#xff0c;尤其是在电商商品列表、…...

Mininet与OpenFlow控制器集成指南:从Floodlight到OpenDaylight

Mininet与OpenFlow控制器集成指南&#xff1a;从Floodlight到OpenDaylight 引言 在软件定义网络&#xff08;SDN&#xff09;的研究与开发中&#xff0c;Mininet作为轻量级网络仿真工具已成为不可或缺的利器。它能在单台机器上快速构建包含虚拟主机、交换机和控制器的完整网络环…...

Python新手必看:如何快速解决‘str‘ object has no attribute ‘to‘错误(附真实案例)

Python新手必看&#xff1a;如何快速解决str object has no attribute to错误&#xff08;附真实案例&#xff09; 刚接触Python编程时&#xff0c;遇到各种报错信息总是让人头疼不已。其中AttributeError: str object has no attribute to这类错误尤为常见&#xff0c;它看似简…...

YOLOv8实战:从检测框到中心坐标的精准提取与应用

1. 为什么需要提取物体中心坐标&#xff1f; 在目标检测任务中&#xff0c;我们通常使用边界框&#xff08;bounding box&#xff09;来标识物体的位置。但很多时候&#xff0c;仅仅知道物体的边界框是不够的。比如在做物体追踪时&#xff0c;我们需要一个更简洁的表示方式——…...

GME-Qwen2-VL-2B软件重构指南:识别并改善代码中的耦合过度问题

GME-Qwen2-VL-2B软件重构指南&#xff1a;识别并改善代码中的耦合过度问题 你是不是也遇到过这样的场景&#xff1f;接手一个老项目&#xff0c;想改一个功能&#xff0c;结果发现牵一发而动全身&#xff0c;改A模块的代码&#xff0c;B、C、D模块都跟着报错。或者&#xff0c…...

信号与系统实战:5个拉普拉斯变换典型例题解析(附MATLAB验证代码)

信号与系统实战&#xff1a;5个拉普拉斯变换典型例题解析&#xff08;附MATLAB验证代码&#xff09; 拉普拉斯变换作为信号与系统课程的核心工具&#xff0c;其工程价值往往被理论教学的抽象性所掩盖。许多电子信息工程专业的学生能够熟练背诵变换公式&#xff0c;却在面对实际…...

保姆级教程:用OpenVINO在Intel显卡上跑通PP-OCRv5文字识别(附环境配置避坑指南)

保姆级教程&#xff1a;用OpenVINO在Intel显卡上跑通PP-OCRv5文字识别&#xff08;附环境配置避坑指南&#xff09; 在数字化转型浪潮中&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术已成为企业文档处理、票据识别和自动化办公的核心工具。飞桨推出的PP-OCRv5以其…...

【C#避坑实战系列文章08】C#并行处理资源瓶颈诊断:用PerformanceCounter定位CPU/内存热点,优化并行度与算法

1. 从监控到诊断&#xff1a;PerformanceCounter的进阶玩法 很多C#开发者都遇到过这样的场景&#xff1a;你的并行处理程序在服务器上跑得风生水起&#xff0c;突然某天运维同事怒气冲冲地找上门——"你们的服务又把服务器CPU吃满了&#xff01;"。你打开任务管理器&…...

病理图像处理新手必看:SVS和TIFF格式转换的5个实用技巧(附代码示例)

病理图像处理新手必看&#xff1a;SVS和TIFF格式转换的5个实用技巧&#xff08;附代码示例&#xff09; 在医学研究和人工智能开发领域&#xff0c;病理图像处理已成为不可或缺的关键环节。对于刚接触这一领域的研究人员和开发者来说&#xff0c;如何高效处理SVS和TIFF这两种主…...

HFSS仿真教程:用Ansys还原AirPods蓝牙天线设计(含LDS工艺参数)

HFSS仿真教程&#xff1a;用Ansys还原AirPods蓝牙天线设计&#xff08;含LDS工艺参数&#xff09; 当拆解AirPods时&#xff0c;最令人惊叹的莫过于其内部精密的天线设计——如何在如此紧凑的空间内实现稳定的蓝牙连接&#xff1f;这正是射频工程师需要掌握的三维电磁场仿真技术…...

信创实战:在麒麟V10上构建.NET 6与金仓数据库的完整应用栈

1. 环境准备&#xff1a;从零搭建国产化开发平台 第一次在麒麟V10上折腾.NET 6和金仓数据库时&#xff0c;我踩了不少坑。记得当时为了找个靠谱的安装指南&#xff0c;翻遍了各种论坛和技术文档。现在把完整流程梳理出来&#xff0c;希望能帮你少走弯路。 硬件配置建议&#xf…...

计算机组成原理实验避坑指南:原码乘法运算器的寄存器级联问题详解

计算机组成原理实验避坑指南&#xff1a;原码乘法运算器的寄存器级联问题详解 在计算机组成原理的实验课程中&#xff0c;原码乘法运算器的设计是一个经典而富有挑战性的项目。许多学生在完成这个实验时&#xff0c;往往会遇到各种意想不到的问题&#xff0c;尤其是在A寄存器和…...

Confluence数据安全指南:手动备份+定时任务全流程(附30天自动清理脚本)

Confluence数据安全实战&#xff1a;从手动备份到智能清理的完整方案 在数字化协作时代&#xff0c;Confluence作为企业知识管理的核心平台&#xff0c;承载着大量关键业务数据。一次意外的数据丢失可能导致数月的工作成果付诸东流&#xff0c;而合理的备份策略则是抵御这类风险…...

Solidworks装配体Toolbox标准件修改全攻略:从尺寸调整到材质替换

Solidworks装配体Toolbox标准件修改全攻略&#xff1a;从尺寸调整到材质替换 在机械设计领域&#xff0c;Solidworks的Toolbox标准件库堪称效率神器。但许多设计师在使用过程中都遇到过这样的困扰&#xff1a;为什么修改后的螺栓尺寸会自动还原&#xff1f;如何快速调整标准件…...

Druid连接池配置避坑指南:如何避免getConnection()无限等待导致服务崩溃

Druid连接池配置避坑指南&#xff1a;如何避免getConnection()无限等待导致服务崩溃 在微服务架构中&#xff0c;数据库连接池的配置不当往往是系统稳定性的隐形杀手。最近遇到一个典型案例&#xff1a;某电商平台的订单服务在高峰期频繁出现服务不可用&#xff0c;但日志中却没…...

ESP32+ENC28J60以太网Web服务器兼容库

1. 项目概述WebServer_ESP32_ENC 是一个专为 ESP32 平台设计的、面向 ENC28J60 以太网控制器的轻量级 Web 服务封装库。其核心定位并非从零构建 TCP/IP 协议栈&#xff0c;而是深度集成 ESP32 官方 SDK 中成熟的 LwIP 协议栈与硬件抽象层&#xff08;HAL&#xff09;&#xff0…...

VisionMaster 4.2.0新功能体验:图形化编程如何简化工业视觉项目开发

VisionMaster 4.2.0新功能深度解析&#xff1a;图形化编程如何重塑工业视觉开发效率 工业视觉系统开发正经历一场静默革命——传统需要数百行代码实现的检测逻辑&#xff0c;如今通过拖拽模块和连线就能完成。VisionMaster 4.2.0的图形化编程界面将这一变革推向新高度&#xff…...

突破视觉局限:多光谱AI检测技术全栈实践

突破视觉局限&#xff1a;多光谱AI检测技术全栈实践 【免费下载链接】multispectral-object-detection Multispectral Object Detection with Yolov5 and Transformer 项目地址: https://gitcode.com/gh_mirrors/mu/multispectral-object-detection 传统计算机视觉系统如…...

MCP与VS Code深度协同实战:从环境搭建到实时双向调试,7步完成企业级开发闭环

第一章&#xff1a;MCP与VS Code深度协同的核心价值与适用场景MCP&#xff08;Microsoft Cloud Platform&#xff09;工具链与 VS Code 的深度协同&#xff0c;本质上是将云原生开发范式无缝嵌入开发者日常编码环境的关键实践。这种集成并非简单插件叠加&#xff0c;而是通过语…...

Asian Beauty Z-Image Turbo 开发环境搭建:Ubuntu 20.04系统配置全攻略

Asian Beauty Z-Image Turbo 开发环境搭建&#xff1a;Ubuntu 20.04系统配置全攻略 最近有不少朋友在问&#xff0c;想在自己的服务器上跑一些AI图像生成的应用&#xff0c;比如这个挺火的Asian Beauty Z-Image Turbo镜像&#xff0c;但第一步就被环境搭建给卡住了。确实&…...

实测Face Analysis WebUI:3步完成人脸检测+年龄预测+性别识别,效果惊艳

实测Face Analysis WebUI&#xff1a;3步完成人脸检测年龄预测性别识别&#xff0c;效果惊艳 1. 开箱即用&#xff1a;一个能“看懂”人脸的智能工具 你有没有想过&#xff0c;让电脑像人一样“看”懂一张照片里的人物信息&#xff1f;不是简单地识别出这是个人&#xff0c;而…...

Phi-3 Forest Laboratory 在STM32嵌入式开发中的应用猜想:代码注释与协议解析

Phi-3 Forest Laboratory&#xff1a;让STM32嵌入式开发更“聪明”的桌面助手 每次面对STM32那密密麻麻的寄存器手册&#xff0c;或者是一段十年前、注释寥寥无几的祖传代码时&#xff0c;你是不是也感到一阵头大&#xff1f;尤其是当你手头只有一块像STM32F103C8T6这样的最小…...

Fast Video Cutter Joiner7.0.4:多格式免费视频编辑

Fast Video Cutter Joiner7.0.4 汉化版是主打视频剪切与视频合并的专业免费无损视频编辑工具&#xff0c;软件兼容多主流视频格式&#xff0c;支持极速无损处理&#xff0c;搭配多样化编辑选项&#xff0c;操作简单且全程无广告&#xff0c;能全方位满足个人与专业人士的各类视…...

源码编译:在现代化环境中部署PostgreSQL 11的实战指南

1. 为什么需要源码编译PostgreSQL 11&#xff1f; 在当前的数据库运维实践中&#xff0c;我们经常会遇到一个尴尬的情况&#xff1a;项目需要使用某个特定版本的数据库&#xff0c;但官方已经停止提供该版本的二进制安装包。就像我去年遇到的一个金融项目&#xff0c;他们的核心…...