制作网站域名需要多少钱,网站建设框架都有哪些,建设部网站举报,做网站 想做成宽屏的1、问题 今天在工作中遇到一个问题#xff0c;需要查询表A#xff0c;需要根据每天所处小时所在时段#xff0c;返回不同的记录给前端展示#xff0c;如0-2时是在昨日0到2时生成的记录#xff0c;而2-4时则是在昨日2-4时生成的记录#xff0c;每条记录有一个唯一的id。表…1、问题 今天在工作中遇到一个问题需要查询表A需要根据每天所处小时所在时段返回不同的记录给前端展示如0-2时是在昨日0到2时生成的记录而2-4时则是在昨日2-4时生成的记录每条记录有一个唯一的id。表A记录的数据只读不写但会一一对应关联另外一个表B的数据表B的数据需要读和写。 由于表A的数据只读不写所以会在第一次查询时缓存进redis这样每一天只需要进行一次IO后续就可以只通过缓存读取。而表B的数据需要会涉及到写且每个用户共享这些记录所以并发会比较高。为了减少缓存穿透并没有将表B符合条件的记录作为列表存入redis(因为存入列表,写一条记录就需要删除整个列表缓存)而是先筛选表A的记录收集id列表再查表B再将表B记录的id的作为key单独存入redis。这是一个非常蠢的设计记录单独存入redis中也就意味着根据id循环io查单条和循环写入缓存程序需要与数据库和redis进程频繁交互原本为了提高查询效率的考虑反而大大增加了查询压力直接影响就是查询效率极低压力测试不通过。 由于每个时段需要展示的数据量并不多只有几十条于是便采用list进存入redis但在压力测试高并发的条件下会导致重复添加记录到redis这样会造成两个影响其一是冗余数据在redis中会形成大key占用空间增大且查询减慢其二是程序处理也会增加遍历成本且可能出错。可如果对该查询进行同步加锁这又会影响查询效率达不到性能优化的目的。那么应该如何解决呢
2、解决redis的hash结构 redis中的另一种数据结构hash则可以完美解决这个问题 hash可以类比成Java中的Map在这个业务当中可以将每条记录的id作为key记录本身作为value形成一个会去重的key-value列表在高并发下多个线程的写入相同的key会去重这样不会造成冗余数据