# corm **Repository Path**: xshuShan/corm ## Basic Information - **Project Name**: corm - **Description**: 一个基于redis与gorm缓存延迟更新到orm(MySql)的go语言插件 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-28 - **Last Updated**: 2025-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # corm #### 环境要求 使用前请搭配readme仔细阅读sample文件夹 Redis 7.0+ redis数据库版本最好支持RedisJSON模块,lua脚本逻辑有部分使用了json解析 orm数据库使用只要是gorm支持的版本就行 语言版本需要支持go-redis/v9,这个插件没做版本管理(第一次写插件),核心代码并不多,你甚至可以直接复制代码进行魔改 #### 介绍 写在前面:本来是自己写在项目用的插件的,有一天摸鱼想到把插件整理一下发布出来, 一个基于redis与gorm的缓存延迟更新到orm(MySql)的go语言插件 本插件针对:缓存使用redis,持久化使用gorm支持的数据库的 实例已经写在代码内 sample文件夹内 使用前请详细阅读sample代码,如果是工具函数不用过于解读 第一次运行测试时需要把自动创建表的函数取消注释 功能逻辑:使用插件进行标记一个redis_key,使该key在设定的时间后按开发者设定的更新方式更新到持久化数据库中, 标记过的key除非触发更新,否则重复添加标记后的更新间隔只认触发更新前的第一次标记的时间点 适用场景:可接受不需要立即进行持久化又频繁更新的数据, 比如:游戏场景 战力值与角色属性会被多个系统影响 会出现战力值与属性需要频繁计算,可以使用该插件标记战力和属性数据,设定延迟更新时间 容错: 如果出现一直无法更新的情况,插件会将detail_key存入redis的Stream中 所有关键结构均注释好其用途 #### 插件原理 RMUpdateRecordDetail.RedisKey string 首先一定要有一个需要更新到orm的源数据在redis中,以下我们称为redis_key,每一次更新都是对一个redis_key到orm操作,支持一个redis_key对应多行orm数据。 RMUpdateRecordDetail.StructId int 更新方法,用于区分不同的处理逻辑,RMManager.AddUpdater时的id要等于这个RMUpdateRecordDetail.StructId RMUpdateRecordDetail.CustomData any 存储构建更新内容的数据结构,完全由开发者定义,开发者可以根据自己添加的数据构建不同的更新语句,比如只更新某几列或者对某个列调用表达式等等 流程: 第一次添加标记 -> 数据进入双SortSet -> 间隔获取双SortSet到期内容 -> 获取到RMUpdateRecordDetail -> 根据RMUpdateRecordDetail.StructId调用开发者注册的更新方法进行数据更新 对同一个key第二次添加标记时 -> 修改对应的RMUpdateRecordDetail -> 更新到DetailHash(并发安全的) 为什么是 双SortSet? 因为防止在sortA取出数据后服务突然关闭,导致数据取出但没处理的情况,所以使用lua脚本在取出sortA同时也插入到sortB,完成更新后删除