一口气说出 Redis 16 个常见使用场景

一口气说出 Redis 16 个常见使用场景 !

一口气说出 Redis 16 个常见使用场景 !

1、缓存

String类型

例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。

2、数据共享分布式

String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享

例如:分布式Session

<dependency>
 <groupId>org.springframework.session</groupId>
 <artifactId>spring-session-data-redis</artifactId>
</dependency>

3、分布式锁

String 类型setnx方法,只有不存在时才能添加成功,返回true

publicstaticbooleangetLock(String key) {
    Long flag = jedis.setnx(key, "1");
if (flag == 1) {
        jedis.expire(key, 10);
    }
return flag == 1;
}

publicstaticvoidreleaseLock(String key) {
    jedis.del(key);
}

4、全局ID

int类型,incrby,利用原子性

incrby userid 1000

分库分表的场景,一次性拿一段

5、计数器

int类型,incr方法

例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库

6、限流

int类型,incr方法

以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false

7、位统计

String类型的bitcount(1.6.6的bitmap数据结构介绍)

字符是以8位二进制存储的

set k1 a
setbit k1 6 1
setbit k1 7 0
get k1
/* 6 7 代表的a的二进制位的修改
a 对应的ASCII码是97,转换为二进制数据是01100001
b 对应的ASCII码是98,转换为二进制数据是01100010

因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
*/

例如:在线用户统计,留存用户统计

setbit onlineusers 01
setbit onlineusers 11
setbit onlineusers 20

支持按位与、按位或等等操作

BITOPANDdestkeykey[key...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
BITOPORdestkeykey[key...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
BITOPXORdestkeykey[key...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
BITOPNOTdestkeykey ,对给定 key 求逻辑非,并将结果保存到 destkey 。

计算出7天都在线的用户

BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ...  "day_7_online_users"

8、购物车

String 或hash。所有String可以做的hash都可以做

https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudegdrhbGahVfBv4MHUH1tyVc9ibhMpUHicfuiavU5AoaIquts3VehkRl4LrmsmLvC0jUpGa9UtUFGWA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

  • key:用户id;field:商品id;value:商品数量。
  • +1:hincr。-1:hdecr。删除:hdel。全选:hgetall。商品数:hlen。

9、用户消息时间线timeline

list,双向链表,直接作为timeline就好了。插入有序

10、消息队列

List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间

  • blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
  • brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

上面的操作。其实就是java的阻塞队列。学习的东西越多。学习成本越低

  • 队列:先进先除:rpush blpop,左头右尾,右边进入队列,左边出队列
  • 栈:先进后出:rpush brpop

11、抽奖

自带一个随机获得值

spop myset

12、点赞、签到、打卡

data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

假如上面的微博ID是t1001,用户ID是u3001

用 like:t1001 来维护 t1001 这条微博的所有点赞用户

  • 点赞了这条微博:sadd like:t1001 u3001
  • 取消点赞:srem like:t1001 u3001
  • 是否点赞:sismember like:t1001 u3001
  • 点赞的所有用户:smembers like:t1001
  • 点赞数:scard like:t1001

是不是比数据库简单多了。

13、商品标签

https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudegdrhbGahVfBv4MHUH1tyK5mfibXv8hicMGne13SuicYEYdbYtsBKWQEQ1p4K85W4icpAJDOCdibMoBQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

老规矩,用 tags:i5001 来维护商品所有的标签。

  • sadd tags:i5001 画面清晰细腻
  • sadd tags:i5001 真彩清晰显示屏
  • sadd tags:i5001 流程至极

14、商品筛选

// 获取差集
sdiff set1 set2
// 获取交集(intersection )
sinter set1 set2
// 获取并集
sunion set1 set2

https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudegdrhbGahVfBv4MHUH1tywAUjc9qN73ZmEUiaGhzg1BZD5FXX2v5sVqyI2jrVUmm88MDs34eicmGQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

假如:iPhone11 上市了

sadd brand:apple iPhone11

sadd brand:ios iPhone11

sad screensize:6.0-6.24 iPhone11

sad screentype:lcd iPhone 11

赛选商品,苹果的、ios的、屏幕在6.0-6.24之间的,屏幕材质是LCD屏幕

sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd

15、用户关注、推荐模型

follow 关注 fans 粉丝

相互关注:

  • sadd 1:follow 2
  • sadd 2:fans 1
  • sadd 1:fans 2
  • sadd 2:follow 1

我关注的人也关注了他(取交集):

  • sinter 1:follow 2:fans

可能认识的人:

  • 用户1可能认识的人(差集):sdiff 2:follow 1:follow
  • 用户2可能认识的人:sdiff 1:follow 2:follow

16、排行榜

id 为6001 的新闻点击数加1:

zincrby hotNews:20190926 1 n6001

获取今天点击最多的15条:

zrevrange hotNews:20190926 0 15 withscores

https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudegdrhbGahVfBv4MHUH1tyIa5uyLyUQVEwcAlCz3vRy08eicnDwRRqrIBzRP1urvibwXGYYEI3Davw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

<think>嗯,用户问的是项目应该边写边做,最后完成属于自己的,还是其他方式。他之前已经问过如何找项目,现在可能在进行实际开发时遇到了困惑。需要先明确他的问题核心。 首先,用户可能对项目的开发流程不太清楚,尤其是如何管理进度和代码。作为新手,可能对项目从开始到结束的过程没有概念,不确定是否应该一边写代码一边设计,或者是否有其他方法。比如,是先计划好再动手,还是边做边调整。 接着,用户提到“写完属于自己的”,可能关心项目的所有权或者是否应该完全从头开始。这可能涉及到是否可以使用模板、第三方库,或者参考别人的代码,是否会影响项目的原创性。也可能担心这样做是否符合学习目的,或者是否在简历中算作自己的项目。 然后,需要分析用户可能的背景。之前的回答中,用户询问如何找项目,所以可能处于学习阶段,开始做项目来提升技能或丰富简历。这时候,他可能对如何有效进行项目开发、管理代码、保持动力等方面有疑问。 要回答这个问题,应该解释项目开发的常见方法,比如迭代开发、敏捷方法,同时强调在练习项目中灵活处理,逐步构建。还要说明在学习和实践中,参考他人代码是正常的,但需要理解并转化为自己的知识,确保项目的原创性部分。 另外,用户可能担心项目是否足够“属于自己”,是否需要完全从零开始。需要澄清,使用框架、库或参考教程是正常的,关键是在过程中学习和应用,而不是完全独立创作。同时,提醒在简历中如实说明项目来源,避免抄袭。 可能还需要给出具体步骤或建议,比如如何规划项目、分阶段实现、如何处理需求变更,以及如何维护代码库。这些都能帮助用户理解项目开发的动态过程,减少焦虑。 最后,总结时应该强调,项目的核心是学习和实践,边做边学是常见且有效的方法,同时保持代码的可维护性和扩展性,让项目真正成为自己的成果。</think>项目开发是一个 **动态迭代** 的过程,既不是“一口气写完”,也不是“完全按计划执行”,而是需要根据目标灵活调整策略。以下用 **程序员视角** 分解关键问题: --- ### **一、项目开发的典型流程** 1. **学习型项目**(练手为主) - **常见模式**:边看教程边写 → 理解原理后改造 → 添加新功能 - **案例**: - 教程教“TODO List基础版” → 你实现“分类标签+数据持久化” - 参考GitHub开源项目 → 修改UI并优化性能 - **关键**:**先复现再创新**,重点是通过代码理解设计逻辑 2. **产品型项目**(解决实际问题) - **迭代路线**: ```text 核心功能MVP → 用户反馈 → 优化体验 → 扩展模块 ``` - **典型场景**: - 第一版只能注册/登录 → 第二版添加文章发布 → 第三版增加评论系统 - **技巧**:用Git分支管理不同阶段(如`dev`/`feat-comment`/`fix-bug`) --- ### **二、代码归属的核心原则** 1. **完全自研项目** - 从零设计架构 + 自主实现核心逻辑 - **适合场景**:毕业设计、创业产品、技术验证 - **风险**:容易陷入“重复造轮子”,开发周期长 2. **二次开发项目** - 基于开源框架(如Spring Boot/Vue)扩展功能 - **法律边界**:遵守LICENSE协议(MIT/Apache可商用,GPL需开源) - **简历写法**:注明“基于XX框架改造,新增YY功能” 3. **参考实现项目** - 借鉴教程代码结构,但替换业务逻辑(如电商→医疗系统) - **判断标准**: - 复制粘贴代码 ≤30% → 可视为原创 - 关键算法/架构自主实现 → 算个人项目 --- ### **三、避免“缝合怪”项目的技巧** 1. **架构层面** - 即使使用模板,也要重写路由设计和状态管理 - 案例:用Ant Design Pro脚手架,但自定义数据流方案 2. **数据层面** - 替换默认数据集(如爬取真实电影数据代替Mock数据) - 添加独特功能(如在博客中加入“文章情绪分析”模块) 3. **部署层面** - 组合多服务体现技术深度: ```mermaid graph LR A[前端Vite] --> B[NestJS后端] B --> C[MongoDB] B --> D[Redis缓存] D --> E[阿里云ECS] ``` --- ### **四、给新手的实操建议** 1. **起步阶段** - 使用`create-react-app`/`Spring Initializr`快速生成项目骨架 - 严格区分`src`(自写代码)和`lib`(第三方依赖) 2. **中期开发** - 每天写Commit Message记录进展(例:`feat: 添加JWT鉴权中间件`) - 用Swagger/Postman维护API文档,避免前后端扯皮 3. **项目收尾** - 删除无用依赖包(用`npm depcheck`检测) - 编写README.md说明: - 技术栈选择原因 - 本地运行指南 - 已知待优化项 --- ### **五、回答灵魂问题:这算我的项目吗?** - ✅ **算**: - 你主导了核心模块开发 - 解决了至少3个关键技术难点 - 项目能在你的机器上完整运行 - ❌ **不算**: - 直接提交别人的代码仓库 - 只修改配置文件/静态资源 - 无法解释关键代码逻辑 --- **最终结论**:好项目=70%自主实现+20%框架支持+10%社区方案,重点是通过开发过程形成自己的技术思维,而不是纠结绝对“原创性”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值