使用Redis加快单词的检索速度

Posted cncul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Redis加快单词的检索速度相关的知识,希望对你有一定的参考价值。

使用Redis加快单词的检索速度

业务场景

用户每次检索单词时,需要多次访问数据库,将结果处理包装后传送到前台。
考虑到每个单词的检索结果都相同并且访问数据库和处理的时间过长,于是决定使用Redis缓存来保存每个单词的检索结果。
使用Redis后,用户检索单词的时间由几秒-十几秒降低到平均100ms以下。

安装Redis 5.0.5

下载源码包
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解压源码包
tar -zxvf redis-5.0.5.tar.gz
安装GCC依赖(遇到选择,直接输入y即可)
yum install gcc gcc-c++
进入到redis目录
cd redis-5.0.5/
编译
make
安装
make install

Redis配置

vi redis.conf

bind 127.0.0.1    #只允许本机访问
protected-mode yes    #使bind生效
port 6379    #默认是6379,最好改成别的
daemonize yes    #作为服务运行
loglevel notice    #记录错误日志
logfile "/usr/local/redis.log"
databases 3    #数据库个数,改成需要的数目
#requirepass foobared    #内网访问不需要密码
maxmemory 2gb    #限制使用的最大内存
maxmemory-policy allkeys-lru    #内存达到上限后的置换策略
dir /usr/local    #dump.rdb的保存位置,最好改成绝对路径
save 3600 1    #持久化策略,由于访问量并不大且数据对实时性要求不高,所以每小时持久化一次就足够
# save 900 10
# save 300 30
# save 60 10000

Redis的启动、关闭

启动redis-server /usr/local/redis-5.0.5/redis.conf
关闭redis-cli -h 127.0.0.1 -p 6379 -a pwd shutdown

RDB方式持久化遇到的问题

解决sysctl vm.overcommit_memory=1
参考:连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots

Spring 4.0整合Redis

1.pom.xml
        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.6.2.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
2.RedisClientConfiguration.java
@Configuration
@PropertySource("classpath:properties/redis.properties")
public class RedisClientConfiguration {
    @Autowired
    Environment env;

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        return stringRedisTemplate;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        ZhgRedisSerializer serializer = new ZhgRedisSerializer();
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setDefaultSerializer(stringRedisSerializer);
        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(env.getProperty("redis.maxTotal", Integer.class));
        poolConfig.setMaxIdle(env.getProperty("redis.maxIdle", Integer.class));
        poolConfig.setMinIdle(env.getProperty("redis.minIdle", Integer.class));
        poolConfig.setTestOnBorrow(env.getProperty("redis.testOnBorrow", Boolean.class));
        poolConfig.setMaxWaitMillis(env.getProperty("redis.maxWaitMillis", Integer.class));
        JedisConnectionFactory factory = new JedisConnectionFactory(poolConfig);
        factory.setUsePool(true);
        factory.setHostName(env.getProperty("redis.host"));
        factory.setPort(env.getProperty("redis.port", Integer.class));
        factory.setPassword(env.getProperty("redis.password"));
        return factory;
    }
}
3.redis.properties
#redis setting
redis.host = 127.0.0.1
redis.port = 6379
redis.maxTotal = 100
redis.maxIdle = 20
redis.minIdle = 10
redis.maxWaitMillis = 10000
redis.testOnBorrow = true

以上是关于使用Redis加快单词的检索速度的主要内容,如果未能解决你的问题,请参考以下文章

我在 Node JS 中检索 Git 标签信息的方法很慢,如何加快速度?

Redis跳跃表实现原理(加快在有序链表中的查找速度)

Redis跳跃表实现原理(加快在有序链表中的查找速度)

如何延迟或异步此 WordPress javascript 片段以最后加载以加快页面加载时间?

如何在 Active Record 迁移中为字段添加索引以加快查询速度?

如何加快 OpenGL 中纹理的绘制速度? (3.3+/4.1)