最近忙着搞需求,一直没时间写,刚好遇到了一个问题,记录一下。问题很简单:想要预加载一些数据,但是数据量在一万条左右,使用redis存储会有问题吗?
这里涉及到一个redis的大key的问题,即什么是redis的大key?
所谓的redis大Key(bigKey)是指该Key所对应的value过大。一般来说,对于String类型,超过10KB则认为是大Key,而对于hash、set、等类型来说,数据量超过5000条则可以认为是大Key,当然,以上对Big Key的判断标准并不唯一,只是一个大体的标准。在实际业务开发中,对Big Key的判断是需要根据具体的使用场景做不同的判断。比如操作某个 key 导致请求响应时间变慢,那么这个 key 就可以判定成 Big Key。
然后我们再说一下redis的单线程
这里并不是指redis中的所有操作都是单线程的,例如持久化,数据读写这都是多线程的。当我们执行一个命令时都要经历客户端到服务器的网络连接-->redis读写事件发生-->redis服务端的数据处理(单线程)-->数据返回四个过程。其中服务端执行命令阶段,Redis是单线程来处理命令的,所以每一条到达服务端的命令不会立刻执行,而是会进入一个队列中,然后逐个被执行。因此可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。
理解完上面的东西我们再来看大key的问题
bigKey导致的问题:
- 内存使用率过高:由于redis是基于内存存储,过大的value值会占用更多的内存资源,可能导致redis的内存使用率过高,从而影响redis的性能。
- 读写速度变慢:当redis存储的value值过大时,读写数据的速度也会变慢,从而导致其他命令阻塞等待,从而影响redis的性能。
- OOM:当redis的内存使用率过高时,可能会导致redis崩溃,从而影响业务的正常运行。
那么如何解决Redis大Key呢
- 数据结构优化:优化Redis的数据结构,使用合适的数据结构来存储数据,避免出现Redis大Key的情况
- 数据分片:将大量数据分片存储到多个Key中,避免单个Key的数据量过大(我是这么做的)
- 压缩数据:对于存储的大数据,可以采用压缩算法来减少数据的大小。Redis支持多种压缩算法,如LZF、Snappy等。
- 分布式存储:将数据分散到多个Redis实例中,避免单个Redis实例存储过多数据导致Redis大Key的问题。