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

1. Redis的其他功能

在这里插入图片描述

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

2. 发布与订阅

2.1. 基本概念

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

**加粗样式**

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

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)

相关推荐

  1. 评论功能设计实现

    2024-04-14 18:34:02       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 18:34:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 18:34:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 18:34:02       87 阅读
  4. Python语言-面向对象

    2024-04-14 18:34:02       96 阅读

热门阅读

  1. Linux Shell Pattern 正则表达式详解

    2024-04-14 18:34:02       36 阅读
  2. LWIP2.1.3+UCOSIII3.08的系统接口arch.c修改

    2024-04-14 18:34:02       37 阅读
  3. docker 修改镜像文件

    2024-04-14 18:34:02       34 阅读
  4. Qt窗口的闪烁QWebEngineView

    2024-04-14 18:34:02       44 阅读
  5. docker 容器指定utf-8编码

    2024-04-14 18:34:02       39 阅读
  6. centos7.9 系统初始化(自用)

    2024-04-14 18:34:02       40 阅读
  7. 在Qt平台上的网络应用编程原理

    2024-04-14 18:34:02       36 阅读
  8. Redis 是如何实现消息队列的?

    2024-04-14 18:34:02       35 阅读
  9. 贪吃蛇web小游戏

    2024-04-14 18:34:02       27 阅读
  10. 使用 Web Workers 作为setInterval的替代方案

    2024-04-14 18:34:02       39 阅读
  11. 01-shell基础入门

    2024-04-14 18:34:02       38 阅读