如何在web项目中添加redis缓存

  • 摘要:redis是什么?这个应该是你做一下工作的前提,不明白的可以百科一下。如果你大概明白了redis的工作原理。那么请继续往下看:一。首先你需要明白,为什么要在你的项目中使用redis缓存?现在很多应用程序要存储结构简单更新频繁的数据,在我看来,字典表里的数据就是存储结构简单且更新频繁的数据,因此,需要读取字典表里的数据时,可以考虑使用redis了。这只是其中之一的例子。二。如何在web项目添加redis?在java项目中,redis提供了很多客户端库,我用的jedis,它封装了
  • redis 是什么?这个应该是你做一下工作的前提,不明白的可以百科一下。如果你大概明白了redis的工作原理。那么请继续往下看:

    一。首先你需要明白,为什么要在你的项目中使用redis缓存?

    现在很多应用程序要存储结构简单更新频繁的数据,在我看来,字典表里的数据就是存储结构简单且更新频繁的数据,因此,需要读取字典表里的数据时,可以考虑使用redis了。

    这只是其中之一的例子。

    二。如何在web项目添加redis?

    在java项目中,redis提供了很多客户端库,我用的jedis,它封装了对redis数据库的所有操作。

    一般web应用中,我们还会用到spring,方便的地方在于spring本身也提供了对redis的支持--spring-data-redis,可以到官网查看文档,并有实例。

    具体步骤:

    1.引入pom依赖(如果没用maven的话,自行引入jar包吧)

    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.5.0.RELEASE</version>
        </dependency>
    </dependencies>

    同时将jedis也依赖上,因为spring-data-redis底层就是用的jedis:

         <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.6.0</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>

     

    2.在容器中配置RedisTemplate实例

    <bean id="jedisConnFactory" 
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
        p:use-pool="true"/>
    
    <!-- redis template definition -->
    <bean id="redisTemplate" 
        class="org.springframework.data.redis.core.RedisTemplate" 
        p:connection-factory-ref="jedisConnFactory"/>

    注意:这是官网直接复制过来的,我这样直接放在xml中,会报错,即使是引入p的命名空间。然后我就尝试将p属性写成property后,就没有报错了,但是在后面用的时候会key和value会出现类似"\xac\xed\x00\x05t\x00\tb "这样的情况,查询得知这是因为spring-data-redis需要将数据存储到jedis中,这中间需要序列化,再由jedis存储到数据库,问题就出在序列化上了,它会将key和value的类型信息也序列化后带上,这显然不是我们想要的结果。

    所以RedisTemplate提供了对key和value序列化类,于是我打算这样:

    <bean id="redisTemplate"
              class="org.springframework.data.redis.core.RedisTemplate">
            <property name="connectionFactory" ref="jedisConnFactory"/>
            <property name="keySerializer">
                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
            </property>
            <property name="hashKeySerializer">
                <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/>
            </property>
            <property name="valueSerializer">
                <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/>
            </property>
            <property name="hashValueSerializer">
                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
            </property>
        </bean>

    可是中间两个序列化类还是报错,没有无参构造器,所以就准备采用构造器注入的方式,但是要求注入的参数是一个Object.class类型,我也不知道怎么注入这种类型的,搞来搞去还是干脆就不要xml了,直接写配置类:

    @Configuration
    public class RedisConfig {
        @Bean
        JedisConnectionFactory jedisConnectionFactory() {
            return new JedisConnectionFactory();
        }
    
        @Bean
        RedisTemplate<String, Object> redisTemplate() {
            final RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(jedisConnectionFactory());
            template.setKeySerializer(new StringRedisSerializer());
            template.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
            template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
            return template;
        }
    }

    这下可算可以了(当然要注意扫描包)。

    有了RedisTemplate之后,就可以写具体的实现业务类了,RedisTemplate基本支持所有redis操作,比如:

    @Component
    public class SpringRedisClientImpl implements SpringRedisClient {
        @Autowired
        private RedisTemplate<String, Object> template;
        @Autowired
        private JedisConnectionFactory jedisConnectionFactory;
    
        @Override
        public void setKey(String key, String value) {
            template.opsForValue().set(key, value);
        }
    
        @Override
        public Object getKey(String key) {
            return template.opsForValue().get(key);
        }
    
        @Override
        public void incr(String key) {
            template.opsForValue().increment(key, 1);
        }
    
        @Override
        public void lPush(String key, String value) {
            template.opsForList().leftPush(key, value);
        }
    
        @Override
        public boolean checkKey(String key) {
            return template.hasKey(key);
        }
    
        @Override
        public Object lIndex(String key) {
            return template.opsForList().index(key, 0);
        }
    
        @Override
        public Long llength(String key) {
            return template.opsForList().size(key);
        }
    
        @Override
        public String lpop(String key) {
    
            return (String) template.opsForList().leftPop(key);
        }
    
        @Override
        public Set<String> getKeys(String pattern) {
            return template.keys(pattern);
        }
    
        @Override
        public void flushAll() {
            Jedis jedis = jedisConnectionFactory.getShardInfo().createResource();
            jedis.flushAll();
            jedis.close();
        }
    }

    最后,启动redis-server.exe就可以了(这里要注意要先启动这个,再启动web项目,否则启动不了,原因未知),如果对redis比较熟悉的,可以自行配置redis.windows.conf文件。其实我也不太熟悉conf文件里面的配置,尤其是持久化到磁盘那个。所以在我的项目里,我是将数据以每天为单位保存到mysql中,并清空redis。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值