理论上讲redis可以存储2的32次方个key,每个实例至少存2亿5千万个key,但因为Redis是基于内存的数据库所以也就意味着它不可能存储特别多的数据,应该说redis的存储极限是系统的可用内存。
我在本机上通过jedis生成100万个key实际占用内存108M
# Memory
used_memory:104730792
used_memory_human:99.88M
used_memory_rss:123080704
used_memory_peak:113668232
used_memory_peak_human:108.40M
used_memory_lua:35840
mem_fragmentation_ratio:1.18
mem_allocator:jemalloc-3.6.0
# Keyspace
db0:keys=1000000,expires=0,avg_ttl=0
内存设置
maxmemory和maxmemory_policy参数
在redis.conf中通过这两个参数配置redis的内存使用情况。Redis的可用内存与系统的内存有关,一般我们需要设置它的最大可用内存,除非你确定你的业务中redis的内存不会很大且有足够的系统内存。
maxmemory参数
不设置
1:不设置或为0,64位系统不限制使用,32位最多使用3G
2:如果不设置最大内存系统有多少内存redis就会用多少一旦开始写入swap虚拟内存则后期查询速度反而会慢。
设置
如果开启了RDB持久化方式,因为子进程在复制所有数据时内存使用量会增加一倍,所以最大设置为系统内存的45%。如果没有开启最大设置为系统内存的95%。
maxmemory_policy参数
1:设置最大内存后需要设置删除策略否则当内存不足时再添加数据就会报错。
2:有六种删除策略。
volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据。
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰。
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰。
allkeys-lru:使用LRU算法从所有数据集合中淘汰数据,淘汰使用频率最少的key。
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据。
优化原则:
1:key的名称尽量使用简单明了的关键字,比如stu代表学生不要太长。
2:如果只是使用redis充当缓存就请关闭持久化功能。
3:redis为每种数据类型都提供了两种内部编码方式,生成时redis自己会自动根据数据类型调整使用那种编码方式。
4:slowlog慢日志查询
当我们发现redis命令执行慢时可以通过slowlog来找出这些命令。在redis.conf中有两个参数slowlog-log-slower-than10000和slowlog-max-len 128。
slowlog-log-slower-than10000表示当命令执行时间大于10000时此命令会被保存
slowlog-max-len128表示redis会保存最多128条命令。
slowlog get可以查看当前所有执行慢的命令
slowlog len可以查看目前一共记录了多少条命令
slowlog reset可以执行重置
我们可以根据项目的实际情况修改redis.conf中的这两个参数