redis的设计与实现(五)——独立功能

1. Redis的其他功能

redis 除了简单对对象的增删改查的功能之外,其实还有其他高级功能,了解这些内容有利于我们更灵活的使用 redis 完成我们的业务功能。

2. 发布与订阅

2.1. 基本概念

很多中间件都有发布与订阅功能,但是,作为一个数据库,redis 是如何实现发布与订阅功能呢,在 java (具体语言)里如何使用呢?

  • 订阅频道:SUBSCRIBE "news.it"
  • 发送消息: PUBLISH "news.it" "hello"
  • 订阅模式消息:PSUBSCRIBE news.iet ,通过匹配符匹配对应的频道。相当于对频道匹配的扩展。

pattern:一个或多个模式,可以包含特殊字符 *(匹配任意数量的字符)、?(匹配单个字符)、abc(匹配括号内的任意一个字符)等。

2.2. 数据结构

  1. 频道:
    在字典 pubsub_channels 中保存力扣所有频道,key 是频道名,value 是订阅的客户端列表。

订阅频道订阅或者退订的过程就是在字典里塞值或者删除值

  1. 模式:

    每增加一个模式订阅,都会添加一个pubsubPattern 数据结构在链表中,因为这个一般不会太大,通常也不需要和并处理。

退订和频道退订思路一致。

发消息的时候会首先发送频道里的单个订阅者,然后再遍历所有模式订阅者,查看是否匹配当前模式。

通常模式不能太多,因为这种遍历并不高效

3. 事务

3.1. 基本概念

事务就是提供了一层性顺序执行多条命令的功能,由于 redis 是单线程应用,所以,事务实现非常简单。

3.2 实现思路

单线程嘛,只要通知redis现在进入事务状态,这时候阻塞其他请求,执行一条条事务命令,end后再退出事务状态。

不过 redis 做了一些优化,没有在输入命令的时候就阻塞所有请求,而是在完全提交后再阻塞请求。不过大致思路和上面单线程阻塞思路一致。

3.3 watch 的监视乐观锁

watched_keys 字典里保存监视信息,key 是被监视的键,value 是监视该键的客户端。

redis 修改键值有个修改标识的动作,可以给被修改的监视键打上标识。 如果在exec的时候,发现 监视的键的标识被修改了,返回执行错误。

Redis 事务具有,原子性(一起执行或者不执行),隔离性(单线程阻塞),持久性(rdb,aof),一致性。
redis 没有回滚机制,一旦开始执行事务,执行失败也不会影响后续命令的执行。

4. Lua 脚本

Redis 从 2.6版本开始引人对Lua脚本的支持,通过在服务器中嵌入 Lua 环境,Redis 客户端可以使用

Lua脚本,直接在服务器端原子地执行多个Redis 命令。

如果你认为 redis 提供的默认的乐观锁无法正确满足你灵活的需求,可以通过 Lua 脚本实现你的原子操作。

LUA 脚本不太会,不做过多阐述(dog)

相关推荐
白远山24 分钟前
货运跑腿搬家平台开发实战:从需求分析到落地部署指南
数据库·数据挖掘·需求分析
geovindu36 分钟前
sql: Data Modeling Patterns
数据库·sql·设计模式·sqlserver
上海蓝色星球43 分钟前
蓝色星球NG-AIOS新型AI工业操作系统重磅发布——以本体智能为内核,重构“AI+制造“新范式
大数据·数据库·人工智能·机器人
名字还没想好☜1 小时前
Python 的 __call__ 实战:让实例像函数一样被调用,做带状态计数器、缓存器与可配置策略
开发语言·后端·python·缓存·编程语言
瀚高PG实验室1 小时前
瀚高数据库如何克隆表
数据库·sql·postgresql·瀚高数据库
雨辰AI1 小时前
信创多租户项目 9 大踩坑|数据隔离失效、权限越权终极解决(金仓 / 达梦 / 高斯全库适配)
java·大数据·数据库·后端
suweijie7681 小时前
Redis 7.0.2 Docker Compose 部署
redis·docker
严同学正在努力1 小时前
认识 SQL Server 的 T-SQL 语法
数据库·人工智能·ai·oracle·dba
EatFan1 小时前
我为什么把患者与病例从 1:1 改成 1:N?一次真实数据库模型重构记录
数据库·后端·重构·健康医疗·全栈
爱和冰阔落2 小时前
【Linux】手写日志与固定线程池:任务队列、工作线程和安全退出
linux·运维·c++·redis·安卓