redis心得

news/2024/11/25 19:45:01/

部署模式

主从

一主多从,主节点负责写入,从节点负责复制。但并非高可用,主节点挂了,要人工切换。

哨兵

Redis 的哨兵模式是为了解决主从模式的高可用方案。

其引入了一个 Sentinel 系统去监视主节点及其从节点。一旦发现有主节点宕机后,会自动选举其中的一个从节点升级为新的主节点以达到故障转移的目的。

同样的, Sentinel 系统也需要达到高可用,所以一般也是集群,互相之间也会监控。

cluster

哨兵模式实现了高可用,读写分离,但是其主节点仍然只有一个,即写入操作都是在主节点中,这也成为了性能瓶颈。

cluster会由多个主节点组成,每个节点都是互相连接的,会保存自己与其他节点的信息。节点之间通过 gossip 协议交换互相的状态,以及新加入的节点信息。

Redis Cluster 的整个数据库将会被分为 16384个哈希slot,数据库中的每个键都属于这 16384 个slot中的其中一个,集群中的每个节点可以保存部分slot。其实就是sharding。

Redis cluster的一些要点:

  • Redis Cluster中节点负责存储数据,记录集群状态,集群节点能自动发现其他节点,检测出节点的状态,并在需要时剔除故障节点,选举新的主节点
  • 客户端和集群中的节点直连,不需要中间的Proxy层。理论上而言,客户端可以自由地向集群中的所有节点发送请求,但是每次不需要连接集群中的所有节点,只需要连接集群中任何一个可用节点即可。当客户端发起请求后,接收到重定向(MOVED\ASK)错误,会自动重定向到其他节点,所以客户端无需保存集群状态。不过客户端可以缓存键值和节点之间的映射关系,这样能明显提高命令执行的效率。
  • Redis Cluster中节点之间使用异步复制,在分区过程中存在窗口,容易导致丢失写入的数据
  • Redis Cluster中所有节点通过PING-PONG机制彼此互联,使用一个二级制协议(Cluster Bus) 进行通信,优化传输速度和带宽。发现新的节点、发送PING包、特定情况下发送集群消息,集群连接能够发布与订阅消息。
  • 每个主节点可以有一个到N个从节点(Slave),当主节点出现宕机或网络断线等不可用时,从节点能自动提升为主节点进行处理

pub/sub

发布消息:

publish channel msg

订阅消息

subscribe channel1 channel2 …

模式匹配的方式订阅

psubscribe pattern1 pattern2 …

实时性

redis的pubsub实现很高效,似乎是实时的:

Redis effectively implements the Pub/Sub model allowing throughput of up to 1 million messages per second

阻塞问题

基于jedis connection的subscribe 会阻塞住调用线程,而基于lettuce connection的则不会。这点差异在编码时要特别注意。

key变更事件

notify-keyspace-events

notify-keyspace-events 的参数为 “Ex”。x 代表了过期事件

所有配置:

K:Keyspace事件,将会以__keyspace@<db>__作为事件的前缀
E:Keyevent事件,将会以__keyevent@<db>__作为事件的前缀g:非特定类型的通用命令,例如DEL、EXPIRE、RENAME等
$:字符串命令,例如SET、INCR等
l:列表命令,例如LPUSH、LPOP等
s:集合命令,例如SADD、SREM等
h:哈希表命令,例如HSET、HINCRBY等
z:有序集合命令,例如ZSET、ZREM等
t:流命令,例如XADD、XDEL等
x:过期事件(在每个键过期的时侯产生)
e:淘汰事件(在每个键被淘汰的时候产生)
m:未命中事件(在访问某个不存在的键使产生)
A:配置g$lshztxe的别名,但不包括未命中事件m

集群里的keyspace事件

Every node of a Redis cluster generates events about its own subset of the keyspace as described above. However, unlike regular Pub/Sub communication in a cluster, events' notifications are not broadcasted to all nodes(这里的言外之意,pubsub会广播到所有节点,事件则不会). Put differently, keyspace events are node-specific. This means that to receive all keyspace events of a cluster, clients need to subscribe to each of the nodes.

来源参考:

https://redis.io/docs/manual/keyspace-notifications/

使用lettuce的Cluster API也可以处理集群事件:

redis Cluster also makes a distinction between user-space and key-space messages. Key-space notifications (Pub/Sub messages for key-activity) stay node-local and are not broadcasted across the Redis Cluster. A notification about, e.g. an expiring key, stays local to the node on which the key expired.Clients that are interested in keyspace notifications must subscribe to the appropriate node (or nodes) to receive these notifications. You can either use RedisClient.connectPubSub() to establish Pub/Sub connections to the individual nodes or use RedisClusterClient's message propagation and NodeSelection API to get a managed set of connections.

参见:
https://blog.csdn.net/iverson2010112228/article/details/115873264

key过期事件的实时性问题

redis的key过期机制在时间上很不准,因为它要么访问key时检查超时,要么后台定期抽样检查超时,一旦超时key很多,处理不过来,超时时间很大概率是不准的。

对于需要精确超时的场景(例如心跳),redis的key过期机制不能用的。

pipeline

注意:Pipeline 是非原子的 ,且每次只能作用在一个 Redis 节点上。

cluster要支持pipeline,需自己写代码支持,参考:

https://www.jianshu.com/p/8f53ac71a552

cluster下lua脚本的执行

如果lua脚本操作多个key,可能会报crossslot错误,导致lua脚本无法执行。
但可以通过在key中设置{},强行把key放一个slot里,再用lua执行。


http://www.ppmy.cn/news/101671.html

相关文章

人工智能电话客服机器人-提升效率节约人力成本

随着科技的不断发展&#xff0c;人工智能技术已经开始广泛应用于各个领域。其中&#xff0c;人工智能电话客服机器人已经成为企业提升效率、节约人力成本的重要工具。本文将从以下几个方面探讨人工智能电话客服机器人的优势和应用。 一、人工智能电话客服机器人的优势 1.24小时…

智能照明“暗潮涌动”

在技术持续升级、消费者观念发生转变等多方因素的共同影响下&#xff0c;与智能相关的设备销量逐渐走俏。能够为人们带来便捷、舒适的智能家居产品也逐渐走进千家万户&#xff0c;深入到人们的日常生活中。在此背景下&#xff0c;智能家居行业日渐火热&#xff0c;实现了飞速发…

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

Zookeeper学习---3、服务器动态上下线监听案例、ZooKeeper 分布式锁案例、企业面试真题

1、服务器动态上下线监听案例 1、需求 某分布式系统中&#xff0c;主节点可以有多台&#xff0c;可以动态上下线&#xff0c;任意一台客户端都能实时感知到主节点服务器的上下线。 2、需求分析 3、具体实现 &#xff08;1&#xff09;先在集群上创建/servers 节点 &#xff…

注册小程序开发者账号(上)

本章主要介绍 开发者账号的注册方法注册成功后如何完成认证开发者账号的效应和注意事项 开发者账号的注册方法 注册微信小程序开发者账号是开发者进行小程序开发和发布的第一步。以下是微信小程序开发者账号的注册方法的详细步骤&#xff1a; 访问官方网站&#xff1a;打开浏…

记一次处理Spring-boot使用dubbo类型转换失败的问题

第一步、使用父类接收子类&#xff0c;类型转换失败&#xff0c;猜测是不是父子类不能接收&#xff0c;&#xff08;应该不可能&#xff0c;但还是试下&#xff09;&#xff1b; 第二步、使用同一个类接收&#xff0c;还是类型转换失败&#xff1b; com.book.common.result.Res…

Rust每日一练(Leetday0014) 组合总和II、缺失正数、接雨水

目录 40. 组合总和 II Combination Sum II &#x1f31f;&#x1f31f; 41. 缺失的第一个正数 First Missing Positive &#x1f31f;&#x1f31f;&#x1f31f; 42. 接雨水 Trapping Rain Water &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题…

【阿里巴巴国际站API接口】商品详情接口,代码封装系列

为了进行电商平台 alibaba 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载 alibaba API的SDK并掌握基本的API基础知识和调用 4&#xf…