使用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

猜你喜欢

转载自www.cnblogs.com/cncul/p/11841734.html