最近公司数据库内存占用比较高,一直在着手寻找解决方案。虽然大家都知道系统架构有很多不合理的地方,但是我们是金融公司,系统庞大,业务牵扯繁多,大家都不敢轻易对系统动大手术。 最后决定先给数据库中常用的一些静态表先加一层缓存。抛开数据库优化配置不说,数据库访问量下来了,内存肯定也不会高到哪里去。 因为这里缓存以后会存储更多需要精细化控制的表信息,而且结合分布式场景的需要,所以选择redis来存储,而不是简单的选择mybatis的二级缓存。 那么问题来了,怎么将数据库的信息,存到redis且又方便查询呢? id name age date 1zzy182017 因为场景的需求至少是根据表任意字段组合查询的,所以在选redis数据结构的时候就需要支持模糊查询。那么就只有选String数据结构了,用keys()这个函数就可以模糊查询了,这里模糊查询其实只是正则表达式匹配。 user:id:1:name:zzy:age:18:date:2017作为key,value就是你整个数据内容了。keys(user:*age:18*),这样就可以查询user表中age=18的数据了,拿到value就随便你怎么搞了。 redsi的持久化,这里不需要,每次启动程序都重新加在最新的数据到cache。 查询数据时,查询方直接连接redis查,查不到数据时再去查数据库。但是如果你查数据库没有的数据,访问会一直穿透到数据库,redis不起作用。但是别怕,你可以把没查到的数据也记录到redis,给个过期时间,至少可以过滤大量这种操作对数据库的访问。 为了统一管理,数据的增删改都调用服务。前面先加数据库,后面再加cache,至少在调用添加服务失败时,数据库的也会因为异常而回滚。这个操作redis的服务是需要部署多机的,为了避免程序启动时重复的去加载数据库,重复的去和redis数据做对比。这里考虑了用zookeeper选举的这一特性,在zookeeper同一目录上去注册监听,谁先注册上,谁就拥有权利去加在数据库。
推荐阅读
- 数据库面试题|数据库面试题(Redis数据存储在哪里(如何保证数据持久化?))
- Linux|远程访问 Linux 服务器中的 redis 数据库(腾讯云服务器 CentOS 8.0)
- 数据库|dm数据库和mysql数据库之间的时间函数使用区别
- Unity3D|猿创征文|UnitySqlite持久化数据
- 面试题|MySQL高性能实战——part5——查询性能优化
- 杭电计算机考研|数据库面试常见问题
- MySQL|MySQl学习笔记-6.数据库的备份
- mysql|MySQL分页查询
- MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束