11
回答
实现一个基于内存的缓存,数据从数据库查出放入内存中,怎么对 查询出数据做索引提高查询速度呢,请给个解决方案。。谢谢!!
华为云实践训练营,热门技术免费实践!>>>   

<无详细内容>

<无标签>
举报
sea_blue
发帖于1年前 11回/469阅
共有11个答案 最后回答: 1年前
看你怎么存的缓存了,如果是针对一个查询有一个唯一的缓存key,每次查的时候去查这个key,缓存中存在数据就返回缓存中的数据了,缓存不命中就查数据库了,不晓得你说的索引是啥意思呢
--- 共有 2 条评论 ---
螃蟹大叔回复 @sea_blue : 索引的方式常用的hash或btree,比如hashmap用的hash索引 1年前 回复
sea_blue我说的索引就是key值,查询的时候,先去内存缓存中去找key,不知道这个key怎么实现,能说具体点吗 1年前 回复
用现有的KV内存数据库就差不多了吧,比如redis、memcache等,KV数据库建索引就要合理设计key,能让key充分表达这些索引
--- 共有 3 条评论 ---
BoXuan回复 @sea_blue : 数据数据量比较小,数据表结构简单,完全可以用ConcurrentHashMap存储数据,这个key也要合理设计,跟KV内存数据库差不多,KV内存数据库实际上也是个可存储海量数据的hashtable 1年前 回复
BoXuan回复 @sea_blue : 用list基本没法做索引,如果是java,你又不想额外的使用其它内存数据库,建议你使用ehcache,这个还有缓存对象的超时处理策略,防止随着数据量的增加,导致内存暴增,服务器奔溃 1年前 回复
sea_blue不使用内存数据库,使用的是内存,过程就是通过sql从数据库查出来,用list接收, 1年前 回复
MySQL有个内存表的存储引擎(ENGINE=MEMORY),它的键的索引默认用的是Hash,对比InnoDB引擎的表则用的是Btree.

比如可以用MySQL内存表实现K/V存储也可以,设置3个字段,分别为键/值/时间,比如:
CREATE TABLE IF NOT EXISTS mem (
    k varchar(40) NOT NULL,
    v text NOT NULL,
    t bigint(20) unsigned NOT NULL,
    PRIMARY KEY (k) USING HASH,
    KEY (t) USING HASH
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO mem (k, v, t) VALUES ('key1', 'value1', 20160906173140);
INSERT INTO mem (k, v, t) VALUES ('key2', 'value2', 20160906173140);
时间格式时date('YmdHis'),添加索引,用于检索.
8个字节的bigint(20)比14*3个字节的char(14)省空间.
键最长为40个字符,超过大小可以编码为sha1后存储.
值最长为floor((65535-2)/3)=21844个utf8字符,
这是因为text类型最多存储65535字节的文本字段,
存储时在内容前使用2字节表示内容的字节数.
除以3是因为一个utf8字符占用3个字节.
floor为向下取整.

同理,Linux内存文件系统/dev/shm上的SQLite也能K/V:
CREATE TABLE IF NOT EXISTS mem (
    k VARCHAR(40) NOT NULL PRIMARY KEY,
    v TEXT NOT NULL,
    t INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS mem_t_idx ON mem(t);
INSERT INTO mem (k, v, t) VALUES ('key1', 'value1', 20160906173140);
INSERT INTO mem (k, v, t) VALUES ('key2', 'value2', 20160906173140);
EXPLAIN QUERY PLAN SELECT * FROM mem WHERE t = 20160906173140;
--输出:SEARCH TABLE mem USING INDEX mem_t_idx (t=?)

这个很简单啊,主要还是要看你的,数据结构是怎样的,也就是你说的key和value值怎么拼装,另外还要看你的具体使用情况,服务器的部署情况,对了,我有过一篇博客,你可以先看一下,写的不好,欢迎指正

https://my.oschina.net/u/2965145/blog/776508

自己实现个btree,不过你数据放内存本身就很快,有必要再加索引吗?而且你把数据大量放在内存,你不怕影响性能和内存溢出吗
--- 共有 2 条评论 ---
尚浩宇回复 @sea_blue : 100M,完全没必要建立索引,查询速度不会成为你的性能瓶颈 1年前 回复
sea_blue没放太大的数据100M左右 1年前 回复
顶部