我们都晓得,经由过程缓存查询的效果,能够极大的提拔体系的效劳才能,以及下落底层效劳或者是数据库的压力。关于有分页前提的缓存,我们也能够依据差别的分页前提来缓存多个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查询由本来的分页查询变成了不分页查询,缓存失效后,体系的处置惩罚才能较之前会有下落,尤其是关于大表