Spring中使用Redis之字符串类型

一、Redis简介
Redis是一种基于内存的数据库,并且提供一定的持久化功能,他是一种键值数据库,使用key作为索引找到当前缓存的数据,并且返回给程序调用者。当前的Redis支持6种数据类型,它们分别是字符串(string),列表(list),集合(set),哈希结构(hash),有序集合(zset)和基数(HyperLogLog),使用它们有利于对一些不太大的数据集合进行快速计算,简化编程。

二、学习目标
之前都是在使用Java API来对Redis进行操作,这次我们是使用Spring来对Redis进行操作,掌握并且熟悉使用Spring来对Redis的6种数据类型进行基本操作,这样可以解决在没有封装的情况下使用Redis的Java的API,并且需要自己编写规则吧Java对象和Redis的字符串进行相互转换的缺点,这些使用Spring来对Redis操作都可以解决。

三、Redis字符串简介
字符串是Redis最基本的数据结构,它将以一个键和一个值存储于Redis内部,它类似于Java中的Map结构,让Redis通过键去寻找它的值。Redis回通过key去找对应的字符串,比如通过key1找到value1。

四、字符串的基本命令
【1】set key value,功能:设置键值对,最常用的写入命令。
【2】get key,功能:通过键获取值,最常用的读取命令。
【3】del key,功能:通过key,删除键值对,输出命令,返回删除数,注意,它是一个通用的命令。
【4】strlen key,功能:求key指向字符串的长度,返回长度。
【5】getset key value,功能:修改原来的key值,并且将旧值返回,如果原来值为空,则返回为空,并且设置新值。
【6】getrange key start end,功能:获取子串,记字符串的长度为len,把字符串看作一个数组,二七是以0开始计数的,所以start和end的范围取值为0到len-1。
【7】append key value,功能:将新的字符串value,加入到原来的key指向的字符串末,返回key指向新的字符串的长度。
【8】incr key,功能:在原字段上加1,只能对整数进行操作。
【9】incrby key increment,功能:在原字段上加上指定整数,只能对整数进行操作。
【10】decr key,功能:在原字段上减1,只能对整数进行操作。
【11】decrby key decrement,功能:在原字段上减去指定整数,只能对整数进行操作。
【12】incrbyfloat key increment,功能:在原字段上加上指定浮点数,可以对整数和浮点数进行操作。

注意:如果开始把value设置为浮点数,那么incr,decr,incrby,decrby的命令都会失效,Redis不支持乘法和除法操作。

五、Spring中使用Redis操作字符串类型

步骤一:创建Maven项目,在pom.xml文件中导入一下三个依赖。

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!-- 导入Spring中的redis依赖 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <!-- 导入jedis依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.1</version>
        </dependency>
    </dependencies>

步骤二:在applicationContext.xml文件中配置Redis。

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

    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

    <!-- Redis服务中心-->
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="localhost"/>
        <property name="port" value="6379"/>
        <property name="poolConfig" ref="poolConfig"/>
    </bean>

    <!-- Redis模板类-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="stringRedisSerializer"/>
    </bean>

步骤三:创建一个RedisStringDemo类,使用Spring测试Redis字符串操作,如下所示:

package demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * @author czd
 */
public class RedisStringDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);

        //设置键值对,相当于set key value
        redisTemplate.opsForValue().set("key1", "value1");
        redisTemplate.opsForValue().set("key2", "value2");

        //通过key获取值,相当于get key
        String value = (String) redisTemplate.opsForValue().get("key1");
        System.out.println("value1: " + value);

        //通过key删除值,相当于del key
        redisTemplate.delete("key1");

        //求出key的长度,相当于strlen key
        long length = redisTemplate.opsForValue().size("key2");
        System.out.println("key2对应的字符串长度: " + length);

        //设置新值并且返回旧值,相当于getset key value
        String oldValue = (String) redisTemplate.opsForValue().getAndSet("key2", "newValue");
        System.out.println("key2的旧的值:" + oldValue);

        String value2 = (String) redisTemplate.opsForValue().get("key2");
        System.out.println("key2对应的字符串:"+value2);

        //求子串,相当于getrange key start end
        String rangeValue = redisTemplate.opsForValue().get("key2", 0, 3);
        System.out.println("key2对应的值的子串:" + rangeValue);

        //在字符串末尾追加字符,并且返回新的字符串长度
        int newLength = redisTemplate.opsForValue().append("key2", "_append");
        System.out.println("追加后字符串长度:" + newLength);

        //设置一个number值为9的键值对
        redisTemplate.opsForValue().set("number","9");

        //对键值对加一,相当于incr key
        redisTemplate.opsForValue().increment("number");
        System.out.println(redisTemplate.opsForValue().get("number"));

        //对键值对加5,相当于incrby key increment
        redisTemplate.opsForValue().increment("number",5);
        System.out.println(redisTemplate.opsForValue().get("number"));

        //对键值对减一,相当于decr key
        redisTemplate.getConnectionFactory().getConnection().decr(
                redisTemplate.getKeySerializer().serialize("number")
        );
        System.out.println(redisTemplate.opsForValue().get("number"));

        //对键值对减去5,相当于decrby  key increment
        redisTemplate.getConnectionFactory().getConnection().decrBy(
                redisTemplate.getKeySerializer().serialize("number"),5
        );
        System.out.println(redisTemplate.opsForValue().get("number"));

        //对键值对加上2.5,相当于incrbyfloat key increment,版本问题有可能报错
//        redisTemplate.opsForValue().increment("number",2.5);
//        System.out.println(redisTemplate.opsForValue().get("number"));

    }
}

运行效果如下所示:
Spring中使用Redis之字符串类型