• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nnegier
V2EX  ›  程序员

我想询问 Redis 的刚需在哪里呢?

  •  2
     
  •   nnegier · May 9, 2023 · 8599 views
    This topic created in 1275 days ago, the information mentioned may be changed or developed.

    我对 Redis 的看法,它是一个运行在内存中的数据结构数据库服务器,也因此我不知道在什么时候应该用 Redis ,因为既然是数据结构既然是内存,我完全可以自己写一个数据结构如 HashMap 存在自己的进程内部,而我也是这样干的。

    也有人拿它来做磁盘关系型数据库的缓存,但我个人也想过,不过我用了 MyBatis 来做 MySQL 的访问中间层,二级缓存 MyBatis 本身也能做,配置上加个 cache 就好了,甚至还可以自定义缓存实现。

    所以,我比较想知道这个知名工具 Redis 解决的核心痛点是什么?

    yuelang85
    yuelang85
    May 9, 2023
    1
    你可以自己写一个内存数据库,事实上各种语言也都有这样的工具。可是有两个问题:

    1 ,功能,速度,是否能达到你的需求,如果要达到,需要多少工作量?

    2 ,单进程应用还好,多个进程需要共享数据怎么办?
    CaspianJou
    CaspianJou
    May 9, 2023 via iPhone❤️6
    2
    你也可以看作多节点下的共享内存方案。而且还实现了像集群、持久化、消息队列、地理搜索、Lua 等一些功能,缓存单独部署可靠性也高一些。项目想不到哪里有用的话就不要用,本地缓存可以实现的话就没必要增加复杂度引入 Redis
    Jhon11
    Jhon11
    May 9, 2023
    3
    作用类似数据库,本地内存替代不了的
    DonaidTrump
    DonaidTrump
    May 9, 2023
    4
    1. redis 开始流行的时候,PHP 还大行其道,而 php 是单进程模式,没有办法自己写内存缓存。
    2. 大型缓存服务可能不止在一台机器上,假设有 10 台机器用作缓存,直接用 redis 会比自己开发节省时间的。
    Akitora
    Akitora
    May 9, 2023 via Android
    5
    分布式锁
    crysislinux
    crysislinux
    May 9, 2023 via Android
    6
    单进程当然可以进程缓存了。但是多进程甚至多机器进程缓存就会有不一致的问题了。另外单独的缓存服务器可以加大内存,但是你给每个应用服务器搞很大的缓存就比较浪费了。
    Yeen
    Yeen
    May 9, 2023
    7
    那么楼主 memcache 可以了解一下,
    这些技术无非就是数据库上层做更特殊需求用的(性能、非持久化 /半持久化等等),而且也不止 redis 一种技术,轮子太多了
    hhjswf
    hhjswf
    May 9, 2023 via Android
    8
    啊这,如果你一个应用有两个实例呢,你能保证这两个实例各自内存数据一致性吗
    chaleaochexist
    chaleaochexist
    May 9, 2023
    9
    单体应用问题不大.
    考虑分布式场景.
    clusterRedis 是一方面
    还有分布式应用依赖 redis 场景.
    darkengine
    darkengine
    May 9, 2023
    10
    除了楼上说的多进程共享数据问题。如果你用 HashMap 解决缓存问题,每次重启进程都所有“缓存”都会丢失。
    matrix1010
    matrix1010
    May 9, 2023❤️1
    11
    Redis 没有刚需,但这类远程缓存服务有一个刚需场景是 serverless. 其实 Redis 作为纯缓存相比 memcache/keydb/dragonflydb 这些支持多线程的没有优势,Redis 流行是因为数据结构 /功能多。Redis 自己也认识到纯缓存性能问题所以加了 Client-side caching 的功能,但 Client-side caching 是 Redis server 辅助 client ,需要 client 自己实现内存缓存,所以现在用的还不多
    xiaowowo
    xiaowowo
    May 9, 2023
    12
    1.支持多种数据结构和数据查询方式
    2.多进程多实例共享同步
    3.业务和缓存隔离,更新业务不会导致缓存丢失
    4.支持持久化
    5.很多语言无法实现内存缓存或实现性能不佳
    6.支持横向扩容,支持分布式
    Maboroshii
    Maboroshii
    May 9, 2023 via Android
    13
    稳定性。 没那么容易挂
    fox0001
    fox0001
    May 9, 2023 via Android
    14
    楼上都讲清楚了。我觉得是:高性能、数据共享、集群
    lower
    lower
    May 9, 2023
    15
    这类缓存工具核心肯定是给数据库“减负”……
    具体到各种缓存工具的使用,肯定要看实际场景啊,比如虽然我是单体应用,但是只要把会话信息存 redis 里,单体应用就是无状态啦,可以很方便部署多个实例
    性能的话,走网络的 redis 肯定不如进程内缓存

    我甚至觉得 redis 可以作为好多种工具的底层 kv 存储,提供一套统一的插件开发接口,上层开发各种各样工具,除了它已经搞的分布式锁、发布订阅;还可以把服务注册、配置管理、分布式事务之类这种功能全在它上面开发插件实现,搞一个真正的大一统超级缝合怪😂
    wanguorui123
    wanguorui123
    May 9, 2023
    16
    分布式下作为共享内存用
    dayeye2006199
    dayeye2006199
    May 9, 2023 via Android
    17
    缓存很多时候都不是必须的
    mineralsalt
    mineralsalt
    May 9, 2023
    18
    单实例软件确实没必要用, 你以后用到分布式部署就知道了
    dif
    dif
    May 9, 2023❤️1
    19
    第一、免费。
    第二、好用,能适用与绝大部分场景,因为用的公司多也比较成熟,很难遇到 bug 。
    第三、专业的事情由专业的团队去做。我只需要调用 api 就行。节约成本
    第四、可以找借口优化拿钱,其实很多项目做 1-2 期基本上就很难迭代下去了,然后就会进入维护期,维护期很难有成果,那么就可以把一个接口从 5 秒逐渐优化到 100ms (中间会经历 sleep(300),sleep(200),sleep(60)。。。。 上 redis )。搞完了还能写一篇公众号《通过这个小技巧,我把接口的响应时间降低了 3000 倍》,double win -> win win
    raysonlu
    raysonlu
    May 9, 2023
    20
    有生之年我会不会见到类似《我想询问 Mysql 的刚需在哪里呢?》的帖子?
    rockddd
    rockddd
    May 9, 2023❤️1
    21
    你能问出这样的问题,那么说明你接触到的项目小了
    chunworkhard
    chunworkhard
    May 9, 2023
    22
    学习一下
    c3de3f21
    c3de3f21
    May 9, 2023
    23
    - 无状态服务好像没法儿用 session?
    - 大概会出现 cookie 里的 sessionID 拿到后台找不到 session 的情况?
    - 那我们用 sessionID 做 Key ,值做 value 是不是就能解决一部分问题?
    当然我接触的项目有些小,不足以体现 redis 的优势。。。
    RedisMasterNode
    RedisMasterNode
    May 9, 2023
    24
    https://github.com/alibaba/canal
    canal v1.1.5 版本的管理后台组件就是直接使用内存来缓存登录后的 session 的,猜猜会有什么问题?

    对,当部署了多台机器(容器)的时候管理后台登录之后就无法访问了,提示重新登录
    yalin
    yalin
    May 9, 2023
    25
    集中会话管理
    brader
    brader
    May 9, 2023
    26
    为了自己无需重复造轮子,难道我今天需要 k-v 结构数据,我自己可以简单撸一个增删改查,然后明天需要列表,我又自己撸一个增删改查?后天呢?这不管是对于使用的自己,还是接手的同事,带来多少麻烦?
    brader
    brader
    May 9, 2023
    27
    而且你只简单的想到了单应用的使用,如果多应用或者多项目之间合作交互呢?比如你前台有个 redis-key ,有时候需要在管理后台对它提前生成、刷新、删除,你自己写的 HashMap 的话,你另一个后台项目怎么操作它?难道你闲的自己再开个端口服务来操作它?
    ltmst
    ltmst
    May 9, 2023
    28
    如果是单例应用,那的确是。能使用 redis 的场景,几乎都能编码实现。
    业务平台时间长了都会分开
    大部分公司控制不住项目代码腐烂进度,时间长了就分开了
    缓存共享只是基础用法,还有分布式事件订阅推送等
    自己写?当然可以。最后谁写的谁维护就行了。
    你也不想被领导知道,你写的状态维护模块崩了的事情吧😏
    plutome
    plutome
    May 9, 2023
    29
    举一个例子:
    每天有一亿条流水,里面会有重复,需要根据 id 去重后入库。

    a )每次入库之前查询数据库,判断记录是否存在?
    b )维护一个 map 在内存里面,判断 key 是否存在?
    c) 其他方案,redis 等...


    可以简单思考一下这个场景的代码怎么设计。
    Imindzzz
    Imindzzz
    PRO
    May 9, 2023 via Android
    30
    先 hash map 也行,当你需要缓存的数据多了,你会想着封装一套操作 api(自动过期,批量过期等)。
    然后就会想着怎么重启服务不丢失,多机器共享等问题,就可以用 redis 了,
    whh945atsyzx
    whh945atsyzx
    May 9, 2023
    31
    单体应用可以 hashmap ,分布式呢?你可以说你专门开一个服务来做缓存,恭喜你,这就是 redis
    Imindzzz
    Imindzzz
    PRO
    May 9, 2023 via Android
    32
    为什么都是项目开始就直接引入 redis ?因为引入成本非常低
    as5739
    as5739
    May 9, 2023
    33
    因为写内存里 重启会丢,而 redis 作为中间件一般不重启,而且也有持久化机制
    ShuWei
    ShuWei
    May 9, 2023
    34
    我个人理解,有几个比较明显的理由
    1 、性能,尤其是数据量较大时
    2 、跨应用共享
    3 、部分依赖数据可靠性的场景
    4 、部分编程语言,比如 php

    如果是单体部署的应用,大部份时候可能对 redis 的依赖确实不强
    lavvrence
    lavvrence
    May 9, 2023
    35
    尽可能保障服务无状态能让服务本身可以大胆地水平扩缩容。
    cohen121
    cohen121
    May 9, 2023
    36
    分布式场景。还有你有没有考虑过用 hashmap 存在进程内存,如何在扩容时(多进程 /多机器)同步状态。
    zzzmh
    zzzmh
    May 9, 2023
    37
    java 发现爬虫 ip 存 redis ,下次请求 lua+nginx 直接从最前端拦截,以此类推
    另外我个人感觉是相比 java 用 redis 效率更高更省内存
    bugmakerxs
    bugmakerxs
    May 9, 2023
    38
    多实例数据共享
    cyningxu
    cyningxu
    May 9, 2023❤️1
    39
    所以楼主一直开发的都是单机单实例?
    liuxu
    liuxu
    May 9, 2023
    40
    1. 多进程模型语言
    2. 需要超过应用生命周期的缓存
    qsnow6
    qsnow6
    May 9, 2023
    41
    @raysonlu #20 还真有,能 sqlite 为什么要用 MYSQL😋
    hankai17
    hankai17
    May 9, 2023
    42
    集群 就这一条
    quicksand
    quicksand
    May 9, 2023
    43
    @darkengine #10 确实, 我以前也想过自己基于内存写一个能持久化数据的 HashMap 来代替, 后来发现其实实现起来是有些麻烦的, 要考虑的东西很多, 还不如直接用 redis
    dqzcwxb
    dqzcwxb
    May 9, 2023
    44
    其他的上面都说了,我说一个没人说的:保证原子性
    SethShi
    SethShi
    May 9, 2023
    45
    Redis 主要两个作用:
    缓存:
    这个你可以用文件实现, 单机器用 map 比 Reids 性能好多,
    如果部署一百台机器的话, 比如你缓存有 100M, 那 map 就是 100M*100, redis 只用 100M

    分布式锁, session 这些, 队列其他功能:
    这个 map 实现不了
    coyoteer
    coyoteer
    May 9, 2023❤️3
    46
    redis!=缓存。redis 跟 mysql 一样都是数据库,只是一个是非关系型的、一个是关系型的,一个存储在内存中使用磁盘进行备份,一个存储在磁盘中使用内存进行缓存。。。
    sunmlight
    sunmlight
    May 9, 2023
    47
    路走窄了
    daiv
    daiv
    May 9, 2023
    48
    我现在用 Golang, 由于是单机服务运行, 所以直接用 Map 放到内存中去, 每次重启 数据库 > 内存 , 目前使用还好, 速度也比 Redis 快很多
    yule111222
    yule111222
    May 9, 2023
    49
    分布式缓存呀
    unco020511
    unco020511
    May 9, 2023
    50
    多节点
    lshero
    lshero
    May 9, 2023
    51
    多机器共享缓存
    懒得装消息队列临时充当一下消息队列
    协议简单,异构的系统之间好集成不同语言都有客户端。我之前工作过的一个公司用 Redis 协议作为 RPC 的通讯协议开发了一套服务治理系统。
    di94sh
    di94sh
    May 9, 2023
    52
    就一个,你用 HashMap 怎么解决多台机器数据同步问题。a 机器更新了,b 机器还用旧的?
    pkoukk
    pkoukk
    May 9, 2023
    53
    就一条,多机器共享内存
    没错,你可以说干嘛非要共享内存,写数据库又稳又方便
    数据库顶不住可以加配置嘛,搞物理机 mysql ,36C500G 内存的 mysql 强行顶
    daimubai
    daimubai
    May 9, 2023
    54
    分布式
    Lucups
    Lucups
    May 9, 2023
    55
    Redis 的功能远大于 “一个数据结构如 HashMap 存在自己的进程内部”。

    理论上自己实现一个类似 Redis 功能的工具并不难,但是稳定、性能等无法与 Redis 匹敌,更不要说 Redis 还有丰富的生态与社区支持了。

    PS: Redis 的通信协议 RESP 设计的也非常优秀。
    rb6221
    rb6221
    May 9, 2023
    56
    当他从一个单纯的缓存( hashmap )进化成数据库以后,他的功能就复杂多了,随便举例:
    多进程,多节点、集群、分布式,吞吐量、性能,同步、数据恢复……
    roundgis
    roundgis
    May 9, 2023 via Android
    57
    redis 什麼都能做

    消息隊列 cache ipc

    性能也還過得去 接入也容易

    真的成為瓶頸 換掉也不麻煩

    對大多數的系統而言根本就沒機會換掉它
    zhaogaz
    zhaogaz
    May 9, 2023
    58
    现有的问题解决不了,引入 redis 解决了,这就算痛点吧。可以以这个角度分析
    Al0rid4l
    Al0rid4l
    May 10, 2023
    59
    你也说了单进程直接存进程内存, 其实论性能这毫无疑问比 Redis 更好

    但假如你要多线程 /多进程, 你自己实现共享内存, 管理并发安全.

    假如你还要支持各种缓存策略, 又要自己实现

    假如你继续支持分布式和更多需求...

    当你都实现了, 恭喜你, 做了个 low 配 Redis.
    eDeeraiD0thei6Oh
    eDeeraiD0thei6Oh
    May 10, 2023
    60
    分布式啊。说明你的服务都是单机运行??? 量级太小了吧??
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2997 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 212ms · UTC 11:17 · PVG 19:17 · LAX 03:17 · JFK 06:17
    ♥ Do have faith in what you're doing.