Redis架构篇 - 热点数据

热点数据的存放

场景:
数据库中有2000w数据,而redis中只有100w数据,如何保证redis中存放的都是热点数据?
方案:
限定redis占用的内存,redis会根据自身数据淘汰策略,留下热数据到内存。所以可以计算100w数据大约占用的内存,然后设置一下redis内存限制即可,并将淘汰策略设置为allkeys-lru或者volatile-lru.
设置redis最大占用内存:maxmemory 268435456
设置过期策略:maxmemory-policy volatile-lru

统计过去24h活跃用户(zset)

比如用户数据。数据库有2000w条。使用 redis sortSet里 放两天内(为方便取一天内活跃用户)登录过的用户,登录一次ZADD一次,如set已存在则覆盖其分数(登录时间)。键:login:users,值:分数 时间戳、value userid。设置一个周期任务,比如每天03:00:00点删除sort set中前一天3点前的数据(保证set不无序增长、留近一天内活跃用户)。
取时,拿到当前时间戳(int 10位),再减1天就可按分数范围取过去24h活跃用户。

怎么发现热key

方法一:凭借业务经验,进行预估哪些是热key
其实这个方法还是挺有可行性的。比如某商品在做秒杀,那这个商品的key就可以判断出是热key。缺点很明显,并非所有业务都能预估出哪些key是热key。
方法二:在客户端进行收集
这个方式就是在操作redis之前,加入一行代码进行数据统计
方法三: redis-cli
对于淘汰策略设置为 volatile-lfu 或者 allkeys-lfu 的,可以使用如下命令统计热点key

./redis-cli --hotkeys

–bigkeys 用来查询大key

高频访问热key的解决方案

目前业内的方案有两种.

利用二级缓存

利用guavacache作为二级缓存。
存在问题,guavacache二级缓存可能撑爆了,此时也可以对guavacache设置淘汰策略,
1.基于存储数目,最大能存储多少条值。超过后按照LRU算法清楚
2.基于数据访问,设置过期时间,多久没访问就过期
3.基于数据更新,设置过期时间,多久没更新就过期
4.将key设置为软引用,当内存不足,发生gc的时候,会回收

备份热key

将数据存储在多个redis节点,查询之后从多个redis节点查询。比如当我采用redis cluster集群时候,在代码层面,将key后面加上机器的ip,然后经过hash,对16384取模运算之后,再加入到redis的槽中,就比较均匀,此时可以再次取数据。

猜你喜欢

转载自blog.csdn.net/qq_34561892/article/details/129144867