Redis是运行在Linux服务器上的开源内存数据库,本质是一个key-value存储系统,用作缓存、消息队列和持久化存储,以每秒十万级请求的处理能力为业务提供加速。
很多人第一次接触服务器,总会在配置文件或者进程列表里看到redis-server这个进程,它不像MySQL那样有密密麻麻的表结构,也不像Nginx那样负责转发请求,Redis更像一个住在内存里的快递驿站所有数据到了就先卸在内存里,需要的时候再以最快的速度取走。
Redis在服务器上到底扮演什么角色
严格来说它不是数据库
行业共识认为,Redis通常被归为NoSQL数据库的一种,但大多数生产环境中,它承担的是“缓存层”的角色,业务数据的主存储仍然是MySQL或PostgreSQL,Redis放在数据库前面,挡住绝大部分读请求。
举个例子:用户打开电商首页,后端要查几十个商品的库存、标题、价格,如果每次都查MySQL,数据库的压力会非常大,Redis把这些热点商品提前缓存在内存中,用户请求进来后直接读Redis,速度是磁盘数据库的十到一百倍,业内专家指出,Redis能支撑起QPS十万级的读请求,而普通MySQL单机通常在几千左右。
五种常用数据结构决定它的用途
Redis的价值不在于“快”,而在于“数据结构丰富”,它不是一个只会存字符串的柜子,而是提供了五种核心类型:
- String:最基础,能存任何内容,常用于计数、缓存。
- Hash:适合存储对象,比如用户信息、商品详情。
- List:双向链表,天生适合做最新消息列表、时间线。
- Set:去重集合,可以算交集并集,比如共同好友。
- ZSet:有序集合,自带权重排序,常见于排行榜。

选对类型能省大量代码,比如排行榜功能,不用在业务层排序,ZSet的ZREVRANGE命令一步搞定。
服务器上部署Redis能解决什么实际问题
缓存加速
这是Redis上服务器最基本的用途,把热点数据放进Redis,设置过期时间,后端先查Redis再查数据库。
有一个细节值得注意:为了避免服务器上的Redis崩溃时请求全部打到数据库,一定要加缓存穿透和缓存雪崩的防护,穿透是指查一个不存在的key,Redis没有,每次都绕过Redis直击数据库,解决办法是布隆过滤器,或者把空结果也缓存几十秒,雪崩是指大量key在同一时间过期,导致瞬间所有请求砸向数据库,解决办法是给过期时间加一个随机值,比如5分钟+随机1-3分钟。
分布式锁与秒杀
服务器上的Redis常被用来做分布式锁,用SETNX命令加锁,设置过期时间防止死锁,业务处理完再DEL释放锁,电商秒杀场景中,Redis凭借单线程模型天然防并发超卖所有请求排队执行,先到先得,扣减库存就是一条DECR命令的事。
对比一下MySQL行锁方案,Redis的响应时间在微秒级,MySQL的锁等待常常要毫秒级以上,业务高峰相差几万倍体感。
会话共享与消息推送
多台服务器组成集群时,用户的登录状态不能存在各自的Tomcat里,否则负载均衡一转发,用户就被要求重新登录,把Session放进Redis即可解决,所有服务器共享同一份会话数据。
Redis还支持PUBLISH/SUBSCRIBE发布订阅,能秒级推送消息,适合做简易的实时通知、站内信推送,注意它不像Kafka那样支持消息持久化和回溯,真正要求高可靠的消息队列,Redis不是首选。
Redis持久化配置不做好,服务器一重启数据全丢
Redis默认将数据放在内存中,服务器断电或进程崩溃,数据就消失了,生产环境中必须开启持久化,主要有两种方式。

- RDB快照:按时间策略将内存数据存成二进制文件,比如每5分钟或每60秒检查一次变更频率,优点是文件紧凑,重启恢复快,缺点是两次快照之间的数据会丢。
- AOF日志:每次写命令追加到日志文件,类似MySQL的binlog,数据丢失少,但文件体积大,重启恢复慢。
绝大多数场景用AOF + 每秒钟写一次的配置即可,最坏情况丢失1秒数据,纯缓存业务可以不开持久化,反正重启后数据库会把缓存回填。
redis缓存和数据库的区别在哪里
拿Redis和MySQL对比,核心差异在于存储介质和访问模型。
| 对比项 | Redis | MySQL |
|---|---|---|
| 存储位置 | 内存为主 | 磁盘为主 |
| 读写速度 | 微秒级 | 毫秒级 |
| 数据结构 | 丰富原生类型 | 表、行、列 |
| 数据容量 | 受内存限制 | 可达TB级别 |
| 持久化 | 快照或日志 | 事务日志 |
| 适用场景 | 缓存、队列、计数 | 业务主数据存储 |
一句话总结:Redis负责快,MySQL负责稳,两者搭配,才能支撑起高并发业务。
服务器Redis内存占用太高怎么办
很多站长会遇到Redis内存打满的问题,排查步骤很简单:
- 执行
redis-cli info memory,查看used_memory和maxmemory配置。 - 执行
redis-cli --bigkeys,找出占用最大的key是哪些类型。 - 执行
redis-cli monitor
,实时观察哪些key被频繁读写。
最直接的解决办法是配置内存淘汰策略,在redis.conf中设置maxmemory-policy:
allkeys-lru:淘汰最久没访问的key,适合缓存场景。volatile-ttl:优先淘汰即将过期的key。noeviction:内存满了直接报错,不淘汰任何数据,适合数据绝不能丢的队列场景。
同时设置maxmemory 1gb之类的上限,防止Redis把服务器内存吃光导致操作系统OOM。
关于服务器上的Redis常见问题
Redis到底算不算数据库?
算,但属于内存数据库范畴,Redis官方定位是“数据结构和存储系统”,它的数据持久化能力偏弱,主要定位是缓存层,不是主数据存储,中小型项目里完全可以把Redis当数据库用,比如排行榜、计数器这类数据量不大且允许少量丢失的场景。
服务器上Redis可以用默认端口吗?
生产环境建议不要用默认的6379端口,大量自动化攻击脚本会扫6379端口,如果Redis没有设置密码,攻击者可以直接写入SSH公钥或者计划任务,拿到服务器权限,至少做三件事:改端口、设置requirepass强密码、绑定内网IP不要暴露公网。
Redis和Memcached选哪个?
Memcached只支持String类型,且不支持持久化,Redis支持五种数据结构、持久化、发布订阅、Lua脚本,功能全面得多,除非你的业务只需要极简缓存且内存极度紧张,否则直接选Redis更省心。
Redis不是银弹,它解决的是高并发读的压力,服务器资源有限,把它用在合适的场景,才能真正发挥价值,最关键的是理解它的数据模型和持久化边界,用对了,它是数据库前面的加速器;用错了,它是进内存的黑洞。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/841676.html


评论列表(3条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是执行部分,给了我很多新的思路。感谢分享这么好的内容!
@幻smart861:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是执行部分,给了我很多新的思路。感谢分享这么好的内容!
读了这篇文章,我深有感触。作者对执行的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!