redis - [01] 概述
题记部分
001 || 什么是redis
是一个由Salvastore Sanfilippo使用ANSI C语言编写的key-value
存储系统,遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的跨平台的非关系型数据库,并提供多种语言的API。Redis通常被称为数据结构服务器,因为值可以是字符串、哈希、列表、集合和有序集合等类型。(基于内存,单线程)
002 || Redis的特点
Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守BSD协议,提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。
性能极高:Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作。这使得Redis成为处理高并发请求的理想选择,尤其是在需要快速响应的场景中,如缓存、会话管理、排行榜等。
丰富的数据类型:Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。这些数据类型为开发者提供了灵活的数据操作能力,使得Redis可以适应各种不同的应用场景。
原子性操作:Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
持久化:Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
支持发布/订阅模式:Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。这使得 Redis 可以作为消息队列和实时数据传输的平台。
单线程模型:尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。
主从复制:Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。
应用场景广泛:Redis 被广泛应用于各种场景,包括但不限于缓存系统、会话存储、排行榜、实时分析、地理空间数据索引等。
社区支持:Redis 拥有一个活跃的开发者社区,提供了大量的文档、教程和第三方库,这为开发者提供了强大的支持和丰富的资源。
跨平台兼容性:Redis 可以在多种操作系统上运行,包括 Linux、macOS 和 Windows,这使得它能够在不同的技术栈中灵活部署。
003 || Redis VS 其他key-value
Redis 与其他 key-value 存储系统的主要区别在于其提供了丰富的数据类型、高性能的读写能力、原子性操作、持久化机制、以及丰富的特性集。
以下是 Redis 的一些独特之处:
丰富的数据类型:Redis 不仅仅支持简单的 key-value
类型的数据,还提供了 list
、set
、zset
(有序集合)、hash
等数据结构的存储。这些数据类型可以更好地满足特定的业务需求,使得 Redis 可以用于更广泛的应用场景。
高性能的读写能力:Redis 能读的速度是 110000
次/s,写的速度是 81000
次/s。这种高性能主要得益于 Redis 将数据存储在内存中,从而显著提高了数据的访问速度。
原子性操作:Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性非常重要。
持久化机制:Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,以便在系统重启后能够再次加载使用。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
丰富的特性集:Redis 还支持 publish/subscribe
(发布/订阅)模式、通知、key 过期等高级特性。这些特性使得 Redis 可以用于消息队列、实时数据分析等复杂的应用场景。
主从复制和高可用性:Redis 支持 master-slave
模式的数据备份,提供了数据的备份和主从复制功能,增强了数据的可用性和容错性。
支持 Lua 脚本:Redis 支持使用 Lua 脚本来编写复杂的操作,这些脚本可以在服务器端执行,提供了更多的灵活性和强大的功能。
单线程模型:尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。
004 || Redis的使用场景&特性
使用场景
(1)内存存储、持久化(RDB、AOF),内存中是断电即失。
(2)效率高,可以用于高速缓存
(3)发布订阅系统
(4)地图信息分析
(5)计时器、计数器(浏览量)
特性
(1)多样的数据类型
(2)持久化
(3)集群
(4)事务
005 || 事务
Redis事务没有隔离级别的概念。
Redis单条命令是保证原子性的,但是事务不会保证原子性。
Redis的事务
开启事务:multi
命令入队:(...)
执行事务:exec
取消事务:discard
006 || 乐观锁
悲观锁
很悲观,无论什么时候都会出现问题,无论做什么都会加锁
乐观锁
- 很乐观,认为什么时候都不会出现问题,所以不会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据。
- 获取version
- 更新的时候比较version
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money # 监视money对象
OK
127.0.0.1:6379> multi # 事务正常结束,数据期间没有发生变动,这个时候就正常执行成功
OK
127.0.0.1:6379(TX)> decrby money 20 # 消费20元
QUEUED
127.0.0.1:6379(TX)> incrby out 20 # 支出20元
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 80
2) (integer) 20
127.0.0.1:6379>
watch
测试多线程修改值,使用watch可以当做redis的乐观锁操作
# 线程1
127.0.0.1:6379>
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 10
QUEUED
127.0.0.1:6379(TX)> incrby out 10
QUEUED
# 线程2
127.0.0.1:6379>
127.0.0.1:6379> get money
"70"
127.0.0.1:6379> set money 1000
OK
127.0.0.1:6379>
# 线程1
127.0.0.1:6379(TX)> exec
(nil)
127.0.0.1:6379>
如果修改失败,获取最新的值就好
127.0.0.1:6379> unwatch # 如果发现事务执行失败,就先解锁
OK
127.0.0.1:6379> watch money # 获取最新的值,再次监视,select version
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 10
QUEUED
127.0.0.1:6379(TX)> incrby money 10
QUEUED
127.0.0.1:6379(TX)> exec # 比对监视的值是否发生了变化,如果没有变化,可以执行成功。如果发生变化,即执行失败。
1) (integer) 990
2) (integer) 1000
127.0.0.1:6379>
— 业精于勤荒于嬉,行成于思毁于随 —
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南