zoukankan      html  css  js  c++  java
  • spring redis入门

    小二,上菜!!!

    1. 虚拟机上安装redis服务

    下载tar包,wget http://download.redis.io/releases/redis-2.8.19.tar.gz。

    解压缩,tar -zxvf redis-2.8.19.tar.gz

    进到文件夹,cd redis-2.8.19/,编译一下,make

    创建空文件夹用于存放redis程序,mkdir /usr/local/redis

    把编译后的产物依次复制到redis文件夹下

    1) 编译后src文件夹下

    红色部分文件都分别复制过去

    cp redis-benchmark /usr/local/redis

    cp redis-cli /usr/local/redis

    cp redis-server /usr/local/redis

    2) 编译后主文件夹下

    cp redis.conf /usr/local/redis

    乾坤大挪移施展好后,让我们看看redis程序的文件夹是什么样子的吧。

    cd /usr/local/redis

    OK,万事俱备,只欠startup了,now 让我们轻轻的输入启动命令:

    ./redis-server ./redis.conf

    想在后台运行?觉得命令太烦不爽?想设置成开机自启动?那就nohup...&一下,把命令加入到path中,再把它写入到rc.local里面吧。

    自己百度吧,这里就不详述了。

    刚才我们是用默认的方式启动服务器端的,默认的hostName是localhost,port是6379,你也可以编辑redis.conf改变他们。

    好了,redis服务端启动后让我们使用客户端连接下。输入redis-cli 即可(默认是连接到localhost的6379端口)

    这里keys *命令的意思是查看redis数据库里目前有哪些内容。

    我们可以简单的输入几个redis命令来测试一下。

    更多命令,敬请访问,三达不溜点度娘点康姆。这里就不细说了。

    注:第二部分java是在windows耍的,而要访问linux主机上的redis,还需要“走后门”,你需要做的是在iptables配置里面添加6379为防火墙例外端口,并重启一下iptables服务即可。

    vi /etc/sysconf/iptables

    加点佐料

    service iptables restart

    2. 访问redis的java程序的编写

    这里我们就直接写测试用例吧,直接用spring+junit就行了,做到简洁大方就行,铺张浪费可耻啊。

    maven兄,出来耍耍吧。

    项目的结构就是酱紫的。下面详述一下各个文件里面的内容吧。

    1) pom.xml

    作为保姆maven的专属区域,里面定义了要用到的包,要用到的是spring(包括core、context),junit,jedis和spring-data-redis。spring-data-redis是spring在jedis的基础上再次进行了封装,让我们用起来更爽。

    就直接上依赖包的代码吧。

        <dependencies>
            <!-- junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.1.0</version>
            </dependency>
            <!-- spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>3.1.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>3.1.2.RELEASE</version>
            </dependency>
            <!-- spring data redis -->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>1.1.1.RELEASE</version>
            </dependency>
        </dependencies>

    不多说,保姆赶紧干活去。 (Maven童鞋:T_T 你这带宽让我很无语)

    2) spring-redis.xml

    spring的xml,里面当然是配置bean的喽。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        <context:property-placeholder location="classpath:redis.properties" />
        <bean id="jedisConnectionFactory"
            class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <property name="hostName" value="${hostName}" />
            <property name="port" value="${port}" />
            <property name="database" value="${index}" />
        </bean>
    
        <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
            <property name="connectionFactory" ref="jedisConnectionFactory" />
        </bean>
    </beans>

    这里用到了一个小技巧,一些基础的配置信息我可能不想要写到xml里面,为毛呢,因为在linux下面用vi编辑格式会乱,有点小洁癖的我更愿意去编辑properties文件,key=value的形式更容易编辑,格式也不会紊乱。

    那么?就用property placeholder吧,配置起来超简单,要用某个key的时候只需要${key}这样写就可以了。

    这里我们需要定义两个spring-data-redis为我们封装好的对象,一个是JedisConnectionFactory,是不是有点连接池之类的味道了,典型的工厂模式,从connection factory里面可以拿到redis的连接对象,然后用这个connection对象YY一下,然后可能LOL。。。;另外一个是StringRedisTemplate对象,又有点JdbcTemplate的味道了,典型的模板方法模式,通过这个template对象我们就可以进行CRUD了,只不过JdbcTemplate是针对关系型数据库的,而这个RedisTemplate是针对redis非关系型数据库的。

    注意点:这里的redisTemplate我们不是用的基类RedisTemplate的对象(可能有些教程文章就用它,如果你的redis里已经有了字符串作为key/value的数据,那么小心出错),而是其子类StringRedisTemplate。在redis里面进行CRUD时,用的最多的就是String,例如字符串作为key、作为value、作为hashmap的key或value,而基类RedisTemplate默认的序列化/反序列化操作(它使用的是JdkSerializationRedisSerializer类)不是针对字符串的,更确切的来说,RedisTemplate类里面的序列化/反序列化工具对字符串/字节数组进行处理后的结果不是我们想要的结果。子类StringRedisTemplate里面的序列化/反序列化工具是StringRedisSerializer类的实例,该类是我们想要的,因此这边我们用了StringRedisTemplate的实例。有兴趣的童鞋可以试一下,如果使用的是RedisTemplate类的实例,对redis进行写操作的时候,写入的会是什么样的数据。

     3) redis.properties

    存放redis的配置信息。在第二点里也说了,具体的redis的服务器端配置信息,我们写在这个文件里。

    hostName=192.168.1.225
    port=6379
    index=0

    就跟mysql等数据库一样,一个redis服务上也能有多个数据库,redis默认连接的是0号库,默认有16个数据库,这里的配置index是指几号数据库,范围0~15,如果你想扩大容量,请自行修改redis.conf。

    4) RedisTest.java

    终于轮到猪脚登场了。咱们先看代码吧。

    package code.selwyn.spring.redis.demo.test;
    
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    
    /**
     * Class RedisTest
     * 耍耍redis
     *
     * @author Selwyn
     * Date: Mar 28, 2015 7:15:57 PM
     */
    public class RedisTest {
        /***
         * spring配置文件
         */
        private final static String[] CONFIG_LOC = {
            "spring-redis.xml"
        };
        private ApplicationContext appContext = null;
        private ApplicationContext getAppContext()
        {
            return new ClassPathXmlApplicationContext(CONFIG_LOC);
        }
        @Before
        public void setUp()
        {
            //读取spring配置文件,载入到spring上下文
            this.appContext = this.getAppContext();
        }
        
        /***
         * 测试redis单值读取与写入
         */
        @Test
        public void testRedisValueOperation()
        {
            RedisTemplate template = (RedisTemplate) this.appContext.getBean("redisTemplate");
            //单值操作的对象,通过该对象直接可以对redis进行CRUD(单值操作)
            ValueOperations<String, String> valueOper = template.opsForValue();
            
            String key = "cat";
            String valueExpected = "tom";
            
            String value = valueOper.get(key);
            Assert.assertNotNull(value);
            Assert.assertEquals("The cat is not Tom!!!", valueExpected, value);
            System.out.println(String.format("%s->%s",key,value));
            
            String newValue = "hello kitty";
            //设置新值
            valueOper.set(key, newValue);
            System.out.println("After changing...");
            System.out.println(String.format("%s->%s",key,valueOper.get(key)));
        }
    }

    作为一个Test类,针对的是一个功能类的测试,里面会有多个测试用例,而每个测试用例都可能会在开始前进行配置,测试跑完后会进行收尾工作(比如断开连接啊什么的),junit提供了两个annotation给我们,一个是@Before,一个是@After。对于单个测试方法(以@Test标识),它的执行顺序是@Before指定方法->@Test指定的方法->@After指定的方法。当然如果这个Test类里面的所有测试用例加载的配置都一样,结束后又都进行相同的收尾操作,那么我们可以用另外两个annotation,@BeforeClass和@AfterClass,我们现在就只有一个测试用例,就按常规来吧。

    对于这个测试方法的前置工作,当然是让spring帮我们盖一间豪华别墅(context),生成两个佣人(bean)。然后在测试代码里面我们要做的就是指挥那个勤劳的佣人进行工作。一切都是那么的河蟹。

    通过ClassPathXmlApplicationContext的构造方法,传递一个spring xml文件名数组给它,spring看到这个数组就开始初始化上下文,生成jedisConnectionFactory对象和redisTemplate对象,并且返回一个ApplicationContext对象,从这个对象里面我们可能很轻松的获取那两个生成的对象。

    好,接下来看测试方法。

    从spring上下文中获取redisTemplate对象,获取该对象的成员变量,即ValueOperations对象,这个类是个泛型类,ValueOperations<K, V>,对应redis数据库的基础数据类型String,即key为字符串,value也是字符串。

    使用ValueOperations对象,可以进行redis对String类型的所有操作了,包括get,set,getex等操作,通过api就可以查到相关的接口方法。

    例子里采用最基础的get/set操作,相信大家也能看懂,就不多说了吧。

    3. 总结

    入门例子,相对还是太简单了,深入学习还是需要掌握redis的很多基本命令,以及spring封装后对应的又是哪些接口的哪些方法。作为一个码农,面对新技术层出不穷、更新换代太快的情况,我只能说:任重而道远,且抠(抠腚,coding)且哈皮。

  • 相关阅读:
    【今日CV 视觉论文速览】 19 Nov 2018
    【numpy求和】numpy.sum()求和
    【今日CV 视觉论文速览】16 Nov 2018
    【今日CV 视觉论文速览】15 Nov 2018
    poj 2454 Jersey Politics 随机化
    poj 3318 Matrix Multiplication 随机化算法
    hdu 3400 Line belt 三分法
    poj 3301 Texas Trip 三分法
    poj 2976 Dropping tests 0/1分数规划
    poj 3440 Coin Toss 概率问题
  • 原文地址:https://www.cnblogs.com/selwynHome/p/4374684.html
Copyright © 2011-2022 走看看