Redis不同数据类型代码场景实践

news/2025/10/13 0:42:15/文章来源:https://www.cnblogs.com/chucz/p/19137562

string

博客不好的实现

jedis.set("key1", "value1");
jedis.get("key1");
jedis.del("lock_test");
jedis.incr("blog_id_counter");
Long key = jedis.incrBy("key", 1);
jedis.set("lock_test", "value_test", SetParams.setParams().nx());
Long publishBlogResult = jedis.msetnx("article:1:title", "学习Redis","article:1:content", "如何学好redis的使用","article:1:author", "deltaqin","article:1:time", "2020-01-01 00:00:00");
List<String> blog = jedis.mget("article:1:title", "article:1:content","article:1:author", "article:1:time");
String updateBlogResult = jedis.mset("article:1:title", "修改后的学习redis","article:1:content", "修改后的如何学好redis的使用");
jedis.strlen("article:1:content");
jedis.getrange("article:1:content", 0, 5);
jedis.append("operation_log_2020_01_01", "今天的第" + (i + 1) + "条操作日志\n");

hash

hash就是一个hashmap,还自带变量名

jedis.hset("short_url_access_count", shortUrl, "0");
jedis.hset("url_mapping", shortUrl, url);
jedis.hget("short_url_access_count", shortUrl);

博客好

一篇文章的所有属性在一个hash里面,key是一篇文章,field是不同属性,val是不同值


jedis.hexists("article::" + id, "title");
jedis.hmset("article::" + id, blog);  # blog 是 hashmap
Map<String, String> blog = jedis.hgetAll("article::" + id);
jedis.hincrBy("article::" + id, "like_count", 1);

session

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置24小时过期
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.HOUR, 24);
Date expireTime = calendar.getTime();jedis.hset("sessions","session::" + token, String.valueOf(userId));
jedis.hset("sessions::expire_time","session::" + token, dateFormat.format(expireTime));jedis.hget("sessions", "session::" + token);// 检测过期
jedis.hget("sessions::expire_time",  "session::" + token);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date expireTimeDate = dateFormat.parse(expireTime);Date now = new Date();if(now.after(expireTimeDate)) {return false;
}

list

博客分页

jedis.hmset("article::" + id, blog);
jedis.lpush("blog_list", String.valueOf(id));// 分页查询
//  pageNo * pageSize - 1; 计数是从0开始的
int startIndex = (pageNo - 1) * pageSize;
int endIndex = pageNo * pageSize - 1;
return jedis.lrange("blog_list", startIndex, endIndex);

队列FIFO

  • 秒杀请求。邮件服务器
jedis.lpush("sec_kill_request_queue", secKillRequest);
jedis.rpop("sec_kill_request_queue");

阻塞式获取发送邮件任务

// 第一个是阻塞时间
jedis.brpop(5, "send_mail_task_queue");

待办

// 插入待办事项
// 在 targetTodoEvent 前面  "插入的待办事项"
linsert(String key, ListPosition where, String pivot, String value);
jedis.linsert("todo_event::" + userId,  ListPosition.BEFORE, targetTodoEvent, "插入的待办事项");// 修改一个待办事项
jedis.lset("todo_event::" + userId, index, updatedTodoEvent);
// 完成一个待办事项
jedis.lrem("todo_event::" + userId, 0, todoEvent);

set

博客标签

jedis.sadd("article::" + id + "::tags", tags);
Set<String> tags = jedis.smembers("article::" + id + "::tags");

抽奖

jedis.sadd("lottery_draw_event::" + lotteryDrawEventId +"::candidates", String.valueOf(userId));
jedis.srandmember("lottery_draw_event::" + lotteryDrawEventId +"::candidates", count);

微博案例

// 关注
jedis.sadd("user::" + followUserId + "::followers", String.valueOf(userId));
jedis.sadd("user::" + userId + "::follow_users", String.valueOf(followUserId));// 取消关注
jedis.srem("user::" + followUserId + "::followers", String.valueOf(userId));
jedis.srem("user::" + userId + "::follow_users", String.valueOf(followUserId));jedis.smembers("user::" + userId + "::followers");
jedis.smembers("user::" + userId + "::follow_users");// 查看个数
jedis.scard("user::" + userId + "::followers");
jedis.scard("user::" + userId + "::follow_users");// 获取用户跟其他用户之间共同关注的人有哪些,注意都是follow_users
jedis.sinter("user::" + userId + "::follow_users","user::" + otherUserId + "::follow_users");// 获取给我推荐的可关注人
// 我关注的某个好友关注的一些人,我没关注那些人,此时推荐那些人给我
jedis.sdiff("user::" + otherUserId + "::follow_users","user::" + userId + "::follow_users");

朋友圈点赞

// 点赞和取消点赞
jedis.sadd("moment_like_users::" + momentId, String.valueOf(userId));
jedis.srem("moment_like_users::" + momentId, String.valueOf(userId));// 查看自己是否对某条朋友圈点赞过
jedis.sismember("moment_like_users::" + momentId, String.valueOf(userId));// 获取你的一条朋友圈有哪些人点赞了
jedis.smembers("moment_like_users::" + momentId);// 获取你的一条朋友圈被几个人点赞了
jedis.scard("moment_like_users::" + momentId);

商品搜索案例

//添加商品的时候附带一些关键词
// 一个关键词就加一个,某个关键词下面可能有多个商品
jedis.sadd("keyword::" + keyword + "::products", String.valueOf(productId));// 根据多个关键词搜索商品()
keywordSetKeys.add("keyword::" + keyword + "::products");
String[] keywordArray = keywordSetKeys.toArray(new String[keywordSetKeys.size()]);
jedis.sinter(keywordArray);

网站UV统计

jedis.sadd("user_access::" + today, String.valueOf(userId));
jedis.scard("user_access::" + today);

投票统计

// 投票
jedis.sadd("vote_item_users::" + voteItemId, String.valueOf(userId));
// 检查用户对投票项是否投过票
jedis.sismember("vote_item_users::" + voteItemId, String.valueOf(userId));
// 获取一个投票项被哪些人投票了
jedis.smembers("vote_item_users::" + voteItemId);
// 获取一个投票项被多少人投票了
jedis.scard("vote_item_users::" + voteItemId);

zset

推荐商品

// 继续购买商品
jedis.zincrby("continue_purchase_products::" + productId, 1, String.valueOf(otherProductId));// 推荐其他人购买过的其他商品.3个
Set<Tuple> jedis.zrevrangeWithScores("continue_purchase_products::" + productId, 0, 2);

新闻

jedis.zadd("news", timestamp, String.valueOf(newsId));
jedis.zrevrangeByScoreWithScores("news", maxTimestamp, minTimestamp, index, count);

排行榜

// 0 s是初始分数
jedis.zadd("music_ranking_list", 0, String.valueOf(songId));
jedis.zincrby("music_ranking_list", score, String.valueOf(songId));// 获取排名
jedis.zrevrank("music_ranking_list", String.valueOf(songId));
// 排行榜
jedis.zrevrangeWithScores("music_ranking_list", 0, 2);

自动补全

将字符的每一个追加之后作为key,value就是整句话,分数是当前日期

使用的时候直接获取对应的key即可

public void add(String keyword) {char[] keywordCharArray = keyword.toCharArray();StringBuffer potentialKeyword = new StringBuffer("");// 我喜欢学习// 我:时间+我喜欢学习// 我喜:时间+我喜欢学习// 我爱大家// 我:时间+我爱大家for(char keywordChar : keywordCharArray) {potentialKeyword.append(keywordChar);jedis.zincrby("potential_Keyword::" + potentialKeyword.toString() + "::keywords",new Date().getTime(),keyword);}
}/*** 获取自动补全列表* @param potentialKeyword* @return*/
public Set<String> getAutoCompleteList(String potentialKeyword) {return jedis.zrevrange("potential_Keyword::" + potentialKeyword + "::keywords",0, 2);
}

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

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

相关文章

上下文与this指向

var name = window​​ const person1 = { ​ name: person1,​foo1: function() {​console.log(this.name) ​ }, ​ foo2: () => {console.log(this.name) ​ },​foo3: function() { ​ return function…

[数据库] Microsoft SQL Server 数据库

1 概述: Microsoft SQL Server SQL Server 数据库SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的【主要功能】就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,…

02 | 在环境中使用Airsim插件

02 | 在环境中使用Airsim插件参考 https://zhuanlan.zhihu.com/p/619214564 中 我们只需要随意下载一个小一点的场景工程就可以然后按照文章中的内容进行。注意需要用到我们上一个文章中介绍的 plugins 文件夹

01 | UE5.3+Airsim+VS2022+Windows10(无人机仿真环境)

01 | UE5.3+Airsim+VS2022+Windows10(无人机仿真环境)配置步骤 vs2022 的安装和配置可以多装;少装也没事后面打开 vs2022 配置项目会进行提示桌面开发套件NET 桌面开发游戏开发单个组件安装 UE5.3不要下载在 C 盘,…

对于使用ant design组件库的疑问

用ant design 的tag来制作组件封装然后实现应该筛选功能的话,我得考虑什么,具体筛选是点击tag之后会得到对应的筛选后的信息,我的后端接口应该是放在主页面没问题,然后传类别和该类别的tag,但是tag是能选择了,那…

阅读《构建之法》提出的5个问题

问题1:科技公司应如何应对“颠覆式”的创新 书中上下文:16.1.2迷思之⼆:⼤家都喜欢创新 第348页“如果这位年轻⼈提的想法是改进电报技术,⼀定会受到欢迎,这⼀类创新是改良式的(Incremental Innovation),但是,…

提示工程介绍

什么是提示工程? 提示工程(Prompt Engineering)是“设计、优化输入给大语言模型的提示词,使其生成准确、有用且符合预期的输出”的技术与方法集合。它不改变模型本身,只通过调整“问法”来引导 AI 的表现。 定义看…

DshanPI-A1 RK3576 gstreamer播放16路视频与硬件加速

演示视频 一、实验环境类别 具体配置板卡 DshanPI-A1主控芯片 RK3576操作系统 Armbian桌面系统 GNOME窗口系统 WaylandGPU 驱动 Panfrost核心硬件加速单元说明 RK3576 芯片集成三类关键硬件加速单元,分别负责不同环节…

全面适配iOS 26液态玻璃,基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.2发布

全面适配iOS 26液态玻璃,基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.2发布基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v10.2发布,全面适配iOS 26 Liquid Glass(液态玻璃)。1、MobileIMS…

freertos的调度过程

一.Preface 理解Freertos的任务调度对理解整个实时操作系统是非常有帮助的,最近抽空又复习了一遍源码,所以在此记录一下。二.freertos的3各任务链表 2.1ready list(array) a.这是一个链表组,定义了最高优先级为10,…

「2025 高一上学期笔记 / 日记」

「2025 高一上学期笔记 / 日记」 9.1 上午 P10449 费解的开关25 盏灯排成一个 55 的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反…

「2025 暑假日记 / 笔记」

「2025 暑假日记 / 笔记」 7.1 - 7.2目前鸽了一部分题没时间写/太难的,后期补出来并查集简单并查集 并查集是一种用于管理元素所属集合的数据结构,支持查询和合并的操作。查询int find(int x){return (f[x] == x) ?…

2025羊城杯初赛Misc-writeup

别笑,你试你也过不了第二关 构造变量 hilogo 使其值等于指定的 ASCII 艺术图案,代码长度必须小于 285 字符 第一关通过尝试,发现题目存在沙箱,禁了import,print,base64等,同时禁用使用字符串格式化 我们采用Code…

将 GPU 级性能带到企业级 Java:CUDA 集成实用指南

引言 在企业软件世界中,Java 依靠其可靠性、可移植性与丰富生态持续占据主导地位。 然而,一旦涉及高性能计算(HPC)或数据密集型作业,Java 的托管运行时与垃圾回收开销会在满足现代应用的低延迟与高吞吐需求上带来…

我的个人空间

Hero BannerMCPAPPMovie H5浏览器插件微信

2025.10.12总结

今天继续学习软考相关知识,目前过完数据结构和算法相关知识,在看操作系统,看的课程讲的云里雾里的听不懂。 目前任务 1.软考 2.继续学苍穹外卖 软考下个月就开始考试很紧急 苍穹外卖对找工作有帮助,而这仅仅是一个…

Windows 文件管理器中重复的 OneDrive 图标原因与解决方案

最近发现 Windows 文件管理器左侧出现了两个 OneDrive 图标。 检查注册表后发现,它们分别对应两个不同的命名空间(CLSID): {018D5C66-4533-4307-9B53-224DE2ED1FE6} → 系统版 OneDrive(个人) {04271989-C4D2-F…

10.12总结

1.今天啥都没干 2.明天学习组建模板

【Python】pandas的向量化操作

dict_nb={[1,2,3]:[4,5]}#多层循环效率不高 for i in range(0, df2.shape[0]): #循环,如果df2的列表中,每行第1列等于GOOD,且第4列等于字典键的第二个值(此处为2),第5列等于字典键的第三个值(此处为3)if df2.v…

docker部署doris

拉取镜像 docker pull apache/doris:fe-3.0.4 docker pull apache/doris:be-3.0.4docker-compose.yamlversion: "3" services: fe: image: apache/doris:fe-3.0.4 hostname: fe environment: - FE_SERVERS=f…