以前在公司的时候遇到了一个需求,要求将原本存储在结构化数据库中的数据部分使用Redis进行存取,用来提高服务的响应速度。
而且还要求后端模块中的更新要有新旧两份,大意就是说当用户请求这部分数据的时候,若这部分数据正在更新,那么数据库应该返回旧版本的数据以保证服务能正常进行。当新数据更新完毕的时候,下一次用户请求的时候就是新数据。
因为Redis中是k-v形式,hash存储,所以当时的设计就是根据 模块名-表名-新/旧标识符-字段名 来作为key的前缀,在数据库存储新旧两份数据,启动的时候通过初始化确定当前使用的前缀,当更新的时候,使用新前缀插入数据,当插入结束后切换用户访问表名。(当然很可能会出现用户两次请求的数据会不一样,或者前后读取的数据一部分是新数据一部分是旧数据,导致计算结果错误)
这其中就遇到了一个问题,Redis大数据的存取,因为业务数据有数十万条,所以普通的存取方法会导致阻塞。
redis中的存原本是使用nodejs,使用set命令进行存的,但是后来发现有个更好的方法。
使用redis客户端的pipeline 。具体的可以看一下这个->https://www.cnblogs.com/huangxincheng/p/6212406.html
读取的时候也不可以使用 key * 来进行匹配前缀,因为这样会有很多的数据一起发回来,会造成阻塞。Redis提供了scan命令来解决这个问题。命令如:
scan (返回值) match (匹配前缀/形式) count (一次返回的记录条数)
然后通过迭代获取所有数据