Redis性能不尽如人意访问时间变长问题调查(redis访问时间变长)

随着公司业务的发展,我们的在线系统越来越大,处理数据的量也在持续增长。由于数据量大,我们开始使用Redis,一种以内存为核心的非关系型数据库。它性能强悍,读写效率很高。但把数据存储到Redis上,访问速度却慢了很多,而且随着数据量的增加,访问速度变得更慢,访问时间变长了。

为了排查访问时间变长的问题,我们进行了相关的调查。经过调查后,我们发现性能不足的根源在于Redis的数据库索引结构的设计。

每条数据存储在一条Redis索引中,由一对键和值组成,当有一个新的记录插入Redis时,索引表需要更新,必须为新键建立一个索引并加入到索引表中,以便搜索该条记录。当记录较多时,Redis的索引表将变得越来越大,搜索时间也会随之增加,即使满足某个查询条件也会受到索引表的影响,甚至会影响到全表查询的性能。

为了解决此问题,我们继续对Redis做出相应的完善。采用hash算法建立索引,将Redis的索引表进行均匀分布,使所查询的记录分散在多个索引表中,减少索引表的大小;把剩余的大记录分发拆分,把索引表中保存的大记录 拆分成子记录,以便更快地搜索;我们增加了一些缓存,把Redis中频繁读取的记录放到缓存中,这样可以减少索引的搜索时间。

改善后,Redis的性能比之前有明显提升,访问时间也大大减少。其代码如下:

public static void createIndex(String key, Map indexedValues){
// 创建hashtable 并设置key-value
HashTable ht = new HashTable();
Iterator it = indexedValues.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
ht.put(entry.getKey, entry.getValue());
}

// 为key建立索引
Jedis jedis = getJedis();
jedis.select(1);
jedis.hmset(key, ht);
jedis.close();
}

通过以上修改,Redis的性能得到了大幅提升,我们也受益良多。


数据运维技术 » Redis性能不尽如人意访问时间变长问题调查(redis访问时间变长)