我们都晓得,经由过程缓存查询的效果,能够极大的提拔体系的效劳才能,以及下落底层效劳或者是数据库的压力。关于有分页前提的缓存,我们也能够依据差别的分页前提来缓存多个key。


基于SortedSet的分页查询缓存计划

起首想到的处理方法是运用@see ListOperations不再依据分页前提运用多个key,而是运用一个key,也不分页将悉数的数据缓存到redis中,然后依据分页前提运用range(key,start,limit)猎取分页的效果。 (引荐进修:Redis视频教程)

这个会致使一个问题,当缓存失效时,并发的写缓存会致使涌现反复数据,所以想到经由过程运用set来处置惩罚并发时的反复数据,@see ZSetOperations

代码逻辑以下:

range(key,start,limit)依据分页前提猎取缓存,掷中则直接返回

缓存未掷中,查询(没有分页前提)数据库或是挪用(没有分页)底层接口

add(key,valueScoreMap)写入缓存,expire设置缓存时候

当须要清算缓存时,直接删除key,假如是因为数据新增和删除,能够add(key,value,score)或remove(key,value)

redis中会依据score分值升序分列map中的数据,平常的,score分值是sql语句的order by filedA的filedA的值,如许能保证数据一致性

然则这类体式格局也存在肯定问题:

这个key缓存的value确实是热数据,但大概只要少数数据被频仍运用其他的大概根本就未被运用,比方数据有100页,现实大概只会用到前10页,这也会致使缓存空间的糟蹋,假如运用了redis虚拟内存,也会有肯定影响

sql查询由本来的分页查询变成了不分页查询,缓存失效后,体系的处置惩罚才能较之前会有下落,尤其是关于大表