前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式内存缓存(解决分布式系统一致性问题)

分布式内存缓存(解决分布式系统一致性问题)

作者头像
西柚dzh
发布2022-06-09 17:34:24
1K0
发布2022-06-09 17:34:24
举报
文章被收录于专栏:dcmickey小站dcmickey小站

背景

​ 由于某些设计,系统不得不频繁读取整个用户表的数据做统计过滤使用,包括但不限于按部门找匹配员工、按项目找匹配员工等等等,直接查询表,sql优化的情况下查询倒是很快也不过是几百毫秒,But但是由于这些需求本身是服务于底层的比如权限功能,所以是特别高频的调用。直接读取数据库势必会造成数据库的连接暴增,很难保证DB的稳定性,说不定哪天就扛不住挂了。因此前人将他放到Redis的String结构上了,形成了一个大Value。Redis就不用多说了,单线程的,每秒读写都是上万的,但是这种大Value以及大Key都是很容易阻塞Redis的。

​ 实测过Redis读取这样一个9000条(7~8M大小)且不含大文本的表数据表时==getstring获取7~8M左右的大value耗时还可以接受==,只是set进去耗时长点2s多点

改进方案是改成hash(key -field-value,分别是表名-用户id-用户实体),但是hash结构适合查询单个用户id ,想要查询全部fields对应的value就不靠谱了, 用getvalues官方都不推荐,影响性能阻塞Redis,推荐使用HScan用游标分段遍历,我封装过也不适合没有性能,只是用HScan目的是保证Redis高可用不阻塞。适合用于批量的异步删除掉hash中的fields。

那么如何才能设计出一个适合以上场景的高可用方案呢?引出下文,哈哈~

==如果有幸正在阅读的你有过这个思考,并且有更好的方案,欢迎指教~==

目的

解决负载均衡中的服务器内存缓存同步更新问题,保存各服务器内存始终最新且一致

思想:

​ 数据每发生改变时,就通过reids设置版本号(incrby),

​ 每个服务器尝试写入ip到这个版本号的set集合中,

​ 写入成功表示没有被同步过,执行同步动作更新本地的内存缓存。

​ 否则跳过直接取内存缓存用

小缺点

但是可以改进

变化频率高的时候, redis存的数量也多,不过可以优化,版本号自增后就删掉旧版本的缓存

封装了一个内存全局协助同步辅助类

==三部曲==

  1. 通过这个GlobleAssistMemoryHelper.SetVersion来设置每次改动后的自增型版本
  2. 再配合GlobleAssistMemoryHelper.SetLocalReceivedTag来写入这次新改动的版本号改动所在的服务器的ip到Set集合中
  3. 获取内存缓存时调用GlobleAssistMemoryHelper.SetLocalReceivedTag写入当前服务器ip,如果写入失败说明已同步过最新的,直接读内存缓存,否则刷新最新数据到内存缓存

以上三步,如此便保证了每个服务器获取内存时始终是最新的那份!

食用方法:

代码语言:javascript
复制
// 设置缓存,只需要10毫秒
<List<RedisUser>> DistributeAssistMemoryCacheHelper.SetCache(key, usrslist, 24 * 60 * 60 - 500, isfromChange); 
代码语言:javascript
复制
// 读取缓存,几乎不耗时
result = ()DistributeAssistMemoryCacheHelper.GetCache(key);
代码语言:javascript
复制
// 删除缓存
DistributeAssistMemoryCacheHelper.DelCache(key);

附上源码


版权属于:dingzhenhua

本文链接:https://cloud.tencent.com/developer/article/2019362

转载时须注明出处及本声明

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 目的
  • 思想:
    • 小缺点
      • 封装了一个内存全局协助同步辅助类
        • 食用方法:
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档