热点数据的存放

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

  • 设置过期策略:
        maxmemory-policy volatile-lru

实际场景:

redis用作缓存

提供一种简单实现缓存失效的思路: LRU(最近少用的淘汰)
redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟).
一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的ttl就马上失效了.

统计过去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之前,加入一行代码进行数据统计

高频访问热key的解决方案

如何解决?
目前业内的方案有两种.

利用二级缓存

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

备份热key

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐