Spring使用Redis

1.引入依赖

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

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

2.配置(applicationContext.xml)

1.使用Spring配置JedisPoolConfig对象(连接池)

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!--最大空闲数-->
    <property name="maxIdle" value="50"/>
    <!--最大连接数-->
    <property name="maxTotal" value="100"/>
    <!--最大等待时间-->
    <property name="maxWaitMillis" value="20000"/>
</bean>

2.为连接池配置工厂模型

<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <!--Redis服务地址-->
    <property name="hostName" value="localhost"/>
    <!--端口号-->
    <property name="port" value="6379"/>
    <!--如果有密码则需要配置密码-->
    <!--<property name="password" value="password"/>-->
    <!--连接池配置-->
    <property name="poolConfig" ref="poolConfig"/>
</bean>

3.配置RedisTemplate

<bean id="redisTemplate"
      class="org.springframework.data.redis.core.RedisTemplate"
      p:connection-factory-ref="connectionFactory"/>
</bean>

注:普通的连接根本没有办法直接将对象直接存入 Redis 内存中,我们需要替代的方案:将对象序列化(可以简单的理解为继承Serializable接口)。我们可以把对象序列化之后存入Redis缓存中,然后在取出的时候又通过转换器,将序列化之后的对象反序列化回对象,所有需要POJO对象实现Serializable接口

3.RedisTemplate基本使用

StringRedisTemplate与RedisTemplate
两者的关系是StringRedisTemplate继承RedisTemplate。
两者的数据是不共通的:
StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

1.redisTemplate.opsForValue().set("student_1", student);
2.10秒后失效
void set(K key, V value, long timeout, TimeUnit unit);
redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
3.用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
void set(K key, V value, long offset);

使用:template.opsForValue().set("key","hello world");
      template.opsForValue().set("key","redis", 6);
      System.out.println(template.opsForValue().get("key"));
结果:hello redis

4.不存在才设置,设置成功返回true,失败返回false
Boolean setIfAbsent(K key, V value);
5.为多个键分别设置它们的值
void multiSet(Map<? extends K, ? extends V> m);
为多个键分别取出它们的值
List<V> multiGet(Collection<K> keys);

        Map<String,String> maps = new HashMap<String, String>();
        maps.put("multi1","multi1");
        maps.put("multi2","multi2");
        maps.put("multi3","multi3");
        template.opsForValue().multiSet(maps);

        List<String> keys = new ArrayList<String>();
        keys.add("multi1");
        keys.add("multi2");
        keys.add("multi3");
        template.opsForValue().multiGet(keys);

6.为多个键分别设置它们的值,如果存在则返回false,不存在返回true
Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);
7.设置键的字符串值并返回其旧值
T getAndSet(K key, T value);
8.如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。
如果键不存在,则它被创建并设置为空字符串并追加,因此APPEND在这种特殊情况下将类似于SET。
Integer append(K key, String value);
9.截取key所对应的value字符串
String get(K key, long start, long end);

使用:
appendTest对应的value为Helloworld
System.out.println("*********"+template.opsForValue().get("appendTest",0,5));
结果:*********Hellow
使用:System.out.println("*********"+template.opsForValue().get("appendTest",0,-1));
结果:*********Helloworld
使用:System.out.println("*********"+template.opsForValue().get("appendTest",-3,-1));
结果:*********rld

10.返回key所对应的value值得长度
Long size(K key);
11.删除key对应的键值对
redisTemplate.opsForValue().getOperations().delete("key");

注:详情参见https://blog.csdn.net/ruby_one/article/details/79141940

原文地址:https://www.cnblogs.com/loveer/p/11316279.html