spring使用redis

Posted 岸北

tags:

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

前言

本文使用的是spring+springMVC+mybatis+maven

一、引入jar包

这里有一个坑,版本兼容问题,以下版本亲测可用。spring版本是4.2.5
 <!--redis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.2</version>
        </dependency>

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

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.3</version>
        </dependency>

二、配置spring-redis.xml

    <!--设置数据池 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}"></property>
        <property name="minIdle" value="${redis.minIdle}"></property>
        <property name="maxTotal" value="${redis.maxTotal}"></property>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"></property>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
    </bean>
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:redis.properties"/>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>

    <bean id="jedisConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          p:host-name="${redis.host}" p:password="${redis.pass}" p:port="${redis.port}" p:poolConfig-ref="poolConfig" />
    <bean id="stringRedisTemplate"
          class="org.springframework.data.redis.core.StringRedisTemplate"
          p:connection-factory-ref="jedisConnectionFactory"></bean>
    <bean id="redisTemplate"
          class="org.springframework.data.redis.core.RedisTemplate"
          p:connection-factory-ref="jedisConnectionFactory">
        <!--以下针对各种数据进行序列化方式的选择 -->
        <property name="keySerializer">
            <bean
                    class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean
                    class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="hashKeySerializer">
            <bean
                    class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
    </bean>

    <!-- 工具类交给spring管理 -->
    <bean id="RedisUtil" class="com.hsy.util.RedisUtil">
    </bean>

三、配置redis.properties

redis.host=220.181.38.148
redis.pass=redis
redis.port=6379
redis.maxIdle=300
redis.minIdle=100
redis.maxTotal=500
redis.maxWaitMillis=3000
redis.testOnBorrow=true

四、创建工具类


package com.hsy.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    @Resource(name = "stringRedisTemplate")
    private StringRedisTemplate redisTemplate;

    @Resource(name = "redisTemplate")
    private RedisTemplate<String, Serializable> redis;

    private static Logger logger = LoggerFactory.getLogger(RedisUtil.class);

    public List<Object> values(String key){

        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return null;
        }
        return redisTemplate.opsForHash().values(key);
    }

    // inject the redisTemplate as ListOperations
    /*
     * (non-Javadoc)
     *
     * @see com.sd.redis.IRedisBaiseTakes#add(java.lang.Object, java.lang.String)
     */
    public void add(String key, String value) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return;
        }
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * @param objectKey
     *            外包集合名称
     * @param key
     *            单个对象id
     * @param object
     *            对象
     */
    public void addObj(String objectKey, String key, Object object) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return;
        }
        redisTemplate.opsForHash().put(objectKey, key, SerializeUtil.serialize(object));
    }

    /*
     * (non-Javadoc)
     *
     * @see com.sd.redis.IRedisBaiseTakes#delete(java.lang.Object)
     */
    public void delete(String key) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return;
        }
        redisTemplate.delete(key);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.sd.redis.IRedisBaiseTakes#delete(java.util.List)
     */
    public void delete(List<String> listKeys) {
        if (redisTemplate == null || listKeys.size() < 1) {
            logger.warn("----redisTemplate操作出错-----");
            return;
        }
        redisTemplate.delete(listKeys);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.sd.redis.IRedisBaiseTakes#deletObj(java.lang.Object,
     * java.lang.Object)
     */
    public void deletObj(String objecyKey, String key) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return;
        }
        redis.opsForHash().delete(objecyKey, key);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.sd.redis.IRedisBaiseTakes#update(java.lang.Object, java.lang.String)
     */
    public void update(String key, String value) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return;
        } else {
            redisTemplate.delete(key);
            redisTemplate.opsForValue().set(key, value);

        }
    }

    /**
     * @param objectKey
     *            对象集合id
     * @param key
     *            单个对象id
     * @param object
     *            经过序列化的对象
     */
    public void updateObj(String objectKey, String key, Object object) {

    }

    public String get(String key) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return null;
        }
        String value = (String) redisTemplate.opsForValue().get(key);
        return value;
    }

    /**
     * @return 返回一个object对象
     */
    public Object getObj(String objectKey, String key) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return null;
        }
        Object obj = redisTemplate.opsForHash().get(objectKey, key);
        return obj;
    }

    public boolean isContainsStringKey(String key) {
        if (redisTemplate == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return false;
        }else {
            return   redisTemplate.hasKey(key);
        }
    }

    public boolean isContainObj(String objectKey, String key) {
        if (redis == null || key == null || "".equals(key)) {
            logger.warn("----redisTemplate操作出错-----");
            return false;
        }else {
            return   redis.opsForHash().hasKey(objectKey, key);
        }
    }

}

五、创建单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:spring/spring-redis.xml" })
public class RedisTest {

    @Autowired
    private RedisUtil redisUtil;

    @Test
    public void test(){
        redisUtil.add("age","22");
        System.out.println("age = " + redisUtil.get("age"));
    }
}

结果

六、在SpringMVC中使用

1、在applicationContext.xml中引入spring-redis.xml

<import resource="spring-redis.xml" />

2、编写service层代码

//接口
public interface ChatService {

    String getChatMsgAll(String key);

}

//实现类
@Service("chatService")
public class ChatServiceImpl implements ChatService {

    @Resource
    private RedisUtil redisUtil;

    @Override
    public String getChatMsgAll(String key) {
        return redisUtil.get(key);
    }
}

3、编写controller

@Controller
@RequestMapping("/chat")
public class ChatController {

    @Autowired
    private ChatService chatService;

    @ResponseBody
    @RequestMapping(value ="", method = RequestMethod.POST)
    public String chat(){

        return chatService.getChatMsgAll("age");
    }
}

4、测试

以上是关于spring使用redis的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:thymeleaf 没有正确渲染片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

spring-data-redis中同时使用set()get()increment()的问题

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段