时间:2021-05-19
存储value为"0",比较小。如果value较大,则存储内存会增多
redis key数量为一千万时,使用了865M的内存。
# Keyspacedb0:keys=11100111,expires=0,avg_ttl=0内存使用情况# Memoryused_memory:907730088used_memory_human:865.68Mused_memory_rss:979476480used_memory_rss_human:934.10Mused_memory_peak:1258244232used_memory_peak_human:1.17Gused_memory_peak_perc:72.14%used_memory_overhead:580102896used_memory_startup:765664used_memory_dataset:327627192used_memory_dataset_perc:36.12%total_system_memory:8365256704total_system_memory_human:7.79Gused_memory_lua:37888used_memory_lua_human:37.00Kredis key数量为一千五百万时,使用了1.13G的内存。
# Keyspacedb0:keys=15100031,expires=0,avg_ttl=0# Memoryused_memory:1211733288used_memory_human:1.13Gused_memory_rss:1247817728used_memory_rss_human:1.16Gused_memory_peak:1258244232used_memory_peak_human:1.17Gused_memory_peak_perc:96.30%used_memory_overhead:740104496used_memory_startup:765664used_memory_dataset:471628792used_memory_dataset_perc:38.95%total_system_memory:8365256704total_system_memory_human:7.79Gused_memory_lua:37888used_memory_lua_human:37.00K使用hset存储打散为1024个key时,存储大小为921M,比直接存储节省了200M。
# Memoryused_memory:966758968used_memory_human:921.97Mused_memory_rss:1002913792used_memory_rss_human:956.45Mused_memory_peak:1749456304used_memory_peak_human:1.63Gused_memory_peak_perc:55.26%used_memory_overhead:1929880used_memory_startup:765664used_memory_dataset:964829088used_memory_dataset_perc:99.88%total_system_memory:8365256704total_system_memory_human:7.79Gused_memory_lua:37888used_memory_lua_human:37.00K # Keyspacedb0:keys=1024,expires=0,avg_ttl=0存储大小为1.09G,比直接存储小了80M。
used_memory:1170356864used_memory_human:1.09Gused_memory_rss:1190223872used_memory_rss_human:1.11Gused_memory_peak:1749456304used_memory_peak_human:1.63Gused_memory_peak_perc:66.90%used_memory_overhead:33759246used_memory_startup:765664used_memory_dataset:1136597618used_memory_dataset_perc:97.18%total_system_memory:8365256704total_system_memory_human:7.79G可见,当存储量特别大的时候,可以将key进行hash分散处理,可以减少存储内存。
并且当key的数量很大的时候,redis取值性能还是很高的。
补充:Redis 单key值过大 优化方式
Redis使用过程中经常会有各种大key的情况, 比如:
1: 单个简单的key存储的value很大
2: hash, set,zset,list 中存储过多的元素(以万为单位)
由于redis是单线程运行的,如果一次操作的value很大会对整个redis的响应时间造成负面影响,所以,业务上能拆则拆,下面举几个典型的分拆方案。
可以尝试将对象分拆成几个key-value, 使用multiGet获取值,这样分拆的意义在于分拆单次操作的压力,将操作压力平摊到多个redis实例中,降低对单个redis的IO影响;
可以像第一种做法一样,分拆成几个key-value, 也可以将这个存储在一个hash中,每个field代表一个具体的属性,使用hget,hmget来获取部分的value,使用hset,hmset来更新部分属性
类似于场景一种的第一个做法,可以将这些元素分拆。
以hash为例,原先的正常存取流程是 hget(hashKey, field) ; hset(hashKey, field, value)
现在,固定一个桶的数量,比如 10000, 每次存取的时候,先在本地计算field的hash值,模除 10000, 确定了该field落在哪个key上。
newHashKey = hashKey + (*hash*(field) % 10000); hset (newHashKey, field, value) ; hget(newHashKey, field)set, zset, list 也可以类似上述做法.
但有些不适合的场景,比如,要保证 lpop 的数据的确是最早push到list中去的,这个就需要一些附加的属性,或者是在 key的拼接上做一些工作(比如list按照时间来分拆)。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
redis是一个基于内存的高性能key-value数据库,具有极高的读写速度。本文介绍SpringBoot和Redis的整合,以及如何在项目中具体应用配置文件属
前言Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很
redis缓存服务器笔记redis是一个高性能的key-value存储系统,能够作为缓存框架和队列但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的作
redis简介Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库Redis与其他key-value缓存产品有以下三个特点:Red
Redis是一款开源的、高性能的键-值存储(key-valuestore)。它常被称作是一款数据结构服务器(datastructureserver)。一:Red