**缓存解决方案_Spring Data Redis 入门*

使用前言

1. 为什么要使用Spring Data Reids:
    * 我们目前的系统已经实现了广告后台管理和广告前台展示,但是对于首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。
    * 那如何解决呢?我们通常的做法有两种:一种是数据缓存、一种是网页静态化。我们今天讨论第一种解决方案。

2. Redis
    * redis 是一款开源的 Key-Value  数据库,运行在内存中,由 ANSI C 编写。企业开发通常
    采用 Redis 来实现缓存。
    * 同类的产品还有 memcache 、memcached 、MongoDB 等。

3.  Jedis
    * Jedis 是 Redis 官方推出的一款面向 Java 的客户端,提供了很多接口供 Java 语言调用。
    可以在 Redis 官网下载。
    * 当然还有一些开源爱好者提供的客户端,如 Jredis、SRP 等等,推荐使用Jedis

Spring Data Redis 准备

1. Spring Data Redis
  

      1. Spring-data-redis 是 spring 大家族的一部分,提供了在 srping 应用中通过简单的配置访问 redis 服务,对 reids 底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate 提 供了 redis 各种操作、异常处理及序列化,支持发布订阅,并对 spring 3.1 cache 进行了实现。
        2. spring-data-redis 针对 jedis 提供了如下功能:
            	1. 连接池自动管理,提供了一个高度封装的“RedisTemplate”类
            	2. 针对 jedis 客户端中大量 api 进行了归类封装,将同一类型操作封装为 operation 接口:
            			*  ValueOperations:简单 K-V 操作
            			* SetOperations:set 类型数据操作
            			* ZSetOperations:zset 类型数据操作
            			* HashOperations:针对 map 类型的数据操作
            			* ListOperations:针对 list 类型的数据操作
    2. 环境搭建(上):
            	* 使用工具:idea
            	* 使用环境Maven
            	* 使用版本JDK:1.7
            	* 是否使用骨架: 否

开始代码

  1. 环境搭建(下):

    1. pom.xml:

         <?xml version="1.0" encoding="UTF-8"?>
             <project xmlns="http://maven.apache.org/POM/4.0.0"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
                 <modelVersion>4.0.0</modelVersion>
                 <groupId>cn.itcast.demo</groupId>
                 <artifactId>springDataRedisDemo</artifactId>
                 <version>1.0-SNAPSHOT</version>
                 <!-- 集中定义依赖版本号 -->
                 <properties>
                     <spring.version>4.2.4.RELEASE</spring.version>
                 </properties>
                 <dependencies>
                     <!-- Spring -->
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-context</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-beans</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-webmvc</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-jdbc</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-aspects</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-jms</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-context-support</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-test</artifactId>
                         <version>${spring.version}</version>
                     </dependency>
                     <dependency>
                         <groupId>junit</groupId>
                         <artifactId>junit</artifactId>
                         <version>4.9</version>
                     </dependency>
                     <!-- 缓存 -->
                     <dependency>
                         <groupId>redis.clients</groupId>
                         <artifactId>jedis</artifactId>
                         <version>2.8.1</version>
                     </dependency>
                     <dependency>
                         <groupId>org.springframework.data</groupId>
                         <artifactId>spring-data-redis</artifactId>
                         <version>1.7.2.RELEASE</version>
                     </dependency>
                 </dependencies>
             </project>
      
  2. 创建resources/properties/redis-config.properties:

    Redis settings

            # server IP 
            redis.host=127.0.0.1
            # server port 
            redis.port=6379
            # server pass 
            redis.pass= 
            # use dbIndex
            redis.database=0
            # \u63A7\u5236\u4E00\u4E2Apool\u6700\u591A\u6709\u591A\u5C11\u4E2A\u72B6\u6001\u4E3Aidle(\u7A7A\u95F2\u7684)\u7684jedis\u5B9E\u4F8B 
            redis.maxIdle=300
            # \u8868\u793A\u5F53borrow(\u5F15\u5165)\u4E00\u4E2Ajedis\u5B9E\u4F8B\u65F6\uFF0C\u6700\u5927\u7684\u7B49\u5F85\u65F6\u95F4\uFF0C\u5982\u679C\u8D85\u8FC7\u7B49\u5F85\u65F6\u95F4(\u6BEB\u79D2)\uFF0C\u5219\u76F4\u63A5\u629B\u51FAJedisConnectionException\uFF1B  
            redis.maxWait=3000
            # \u5728borrow\u4E00\u4E2Ajedis\u5B9E\u4F8B\u65F6\uFF0C\u662F\u5426\u63D0\u524D\u8FDB\u884Cvalidate\u64CD\u4F5C\uFF1B\u5982\u679C\u4E3Atrue\uFF0C\u5219\u5F97\u5230\u7684jedis\u5B9E\u4F8B\u5747\u662F\u53EF\u7528\u7684  
            redis.testOnBorrow=true
    
  3. 创建resources/spring/applicationContext-redis.xml:

         <?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:p="http://www.springframework.org/schema/p" 
           xmlns:context="http://www.springframework.org/schema/context" 
           xmlns:mvc="http://www.springframework.org/schema/mvc" 
           xmlns:cache="http://www.springframework.org/schema/cache"
           xsi:schemaLocation="http://www.springframework.org/schema/beans   
                     http://www.springframework.org/schema/beans/spring-beans.xsd   
                     http://www.springframework.org/schema/context   
                     http://www.springframework.org/schema/context/spring-context.xsd   
                     http://www.springframework.org/schema/mvc   
                     http://www.springframework.org/schema/mvc/spring-mvc.xsd 
                     http://www.springframework.org/schema/cache  
                     http://www.springframework.org/schema/cache/spring-cache.xsd">  
           
            <context:property-placeholder location="classpath*:properties/*.properties" />   
           
            <!-- redis 相关配置 --> 
            <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
              <property name="maxIdle" value="${redis.maxIdle}" />   
              <property name="maxWaitMillis" value="${redis.maxWait}" />  
              <property name="testOnBorrow" value="${redis.testOnBorrow}" />  
            </bean>  
           
            <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
                p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>  
            
            <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
             	<property name="connectionFactory" ref="JedisConnectionFactory" />  
            </bean>  
               
         </beans>  
    

入门小demo_Hash:

  • 创建test/java/test/TestRedisHash.java:

     package test;
     
     import org.junit.Test;
     import org.junit.runner.RunWith;
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.data.redis.core.RedisTemplate;
     import org.springframework.test.context.ContextConfiguration;
     import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     
     import java.util.List;
     import java.util.Set;
     
     /**
      * TestRedisHash
      * hasee
      * 2018/11/27
      * 11:27
      *
      * @Version 1.0
      **/
      
      //hash有大的key,在大的key值下有小的key和value值,所以从来储存一个对象的属性的时候,可以使用它;存值使用put,取值使用keys,values,或者get("index")找出对应的值,使用即可
      //hash的删除分为两种,一种是直接删除大key,直接delete大key的名字即可; 一种是删除大key下的小key,先boundHashOps大key,然后delete小的key值即可;小的key值对应的value值可以是一个值,也可以是一个对象,也可以是一个数组,也可以是一个其他的集合等..
     @RunWith(SpringJUnit4ClassRunner.class)
     @ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml")
     public class TestRedisHash {
     
         @Autowired
         private RedisTemplate redisTemplate;
     
         /*
         * 存值
         * */
         @Test
         public void setValue(){
     
             redisTemplate.boundHashOps("nameHash").put("a","孙悟空");
             redisTemplate.boundHashOps("nameHash").put("b","八戒");
             redisTemplate.boundHashOps("nameHash").put("c","唐僧");
         }
         /*
         * 批量获取值
         * */
         @Test
         public void getValue(){
             Set nameHash=redisTemplate.boundHashOps("nameHash").keys();
             System.out.println(nameHash);
             System.out.println("------------------------------");
             List values=redisTemplate.boundHashOps("nameHash").values();
             System.out.println(values);
         }
         /*
         * 获取指定的值
         * */
         @Test
         public void getValueById(){
             Object o=redisTemplate.boundHashOps("nameHash").get("b");
             System.out.println(o);
         }
     
         /*
         * 删除指定的ID值
         * */
         @Test
         public void deleteValueById(){
             redisTemplate.boundHashOps("nameHash").delete("a");
     
         }
         /*
         * 删除整个hash
         * */
         @Test
         public void deleteValue(){
             redisTemplate.delete("nameHash");
         }
     }
    

入门小demo_Set:

  • 创建 test/java/test/TestRedisSet .java:

        package test;
      	
      	import org.junit.Test;
      	import org.junit.runner.RunWith;
      	import org.springframework.beans.factory.annotation.Autowired;
      	import org.springframework.data.redis.core.RedisTemplate;
      	import org.springframework.test.context.ContextConfiguration;
      	import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      	
      	import java.util.Set;
      	
      	/*
      	* set是一个集合的储存对象,且非空不唯一;储存的时候使用add方法,取的时候使用member,删除的时候使用delete
      	*
      	* */
      	@RunWith(SpringJUnit4ClassRunner.class)
      	@ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml")
      	public class TestRedisSet {
      	
      	    @Autowired
      	    private RedisTemplate redisTemplate;
      	
      	    /*
      	    *
      	    * 设置值
      	    * */
      	    @Test
      	    public void setValue(){
      	        redisTemplate.boundSetOps("nameSet").add("诸葛亮");
      	        redisTemplate.boundSetOps("nameSet").add("庞统");
      	        redisTemplate.boundSetOps("nameSet").add("曹操");
      	    }
      	
      	
      	    /*
      	    * 获取值
      	    * */
      	    @Test
      	    public void getValue(){
      	        Set nameSet=redisTemplate.boundSetOps("nameSet").members();
      	        System.out.println(nameSet);
      	    }
      	
      	
      	    /*
      	    * 删除值
      	    * */
      	    @Test
      	    public void deleteValue(){
      	        redisTemplate.delete("nameSet");
      	
      	    }
      	}
    

入门小demo_Value:

  • 创建 test/java/test/TestRedisValue .java:

        package test;
      	import org.junit.Test;
      	import org.junit.runner.RunWith;
      	import org.springframework.beans.factory.annotation.Autowired;
      	import org.springframework.data.redis.core.RedisTemplate;
      	import org.springframework.test.context.ContextConfiguration;
      	import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      	
      	/**
      	 * TestRedisValue
      	 * hasee
      	 * 2018/11/27
      	 * 10:17
      	 *
      	 * @Version 1.0
      	 **/
      	@RunWith(SpringJUnit4ClassRunner.class)             //导入测试依赖
      	@ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml")      //导入配置依赖
      	public class TestRedisValue {
      	    //导入springData Redis的操作对象
      	    @Autowired
      	    private RedisTemplate redisTemplate;
      	    /*
      	    *
      	    * 设置值
      	    * */
      	    @Test
      	    public void setValues(){
      	        redisTemplate.boundValueOps("name").set("黑马诸葛亮");
      	    }
      	    /*
      	    *
      	    * 获取值
      	    * */
      	    @Test
      	    public void getValues(){
      	        Object value=redisTemplate.boundValueOps("name").get();
      	        System.out.println(value);
      	    }
      	
      	    /*
      	    * 删除值
      	    * */
      	    @Test
      	    public void deleteValue(){
      	        redisTemplate.delete("name");
      	    }
      	}
    

入门小demo_List:

  • 创建 test/java/test/TestRedisValue .java:

       package test;
      	import org.junit.Test;
      	import org.junit.runner.RunWith;
      	import org.springframework.beans.factory.annotation.Autowired;
      	import org.springframework.data.redis.core.RedisTemplate;
      	import org.springframework.test.context.ContextConfiguration;
      	import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      	
      	import java.util.List;
      	
      	/**
      	 * TestReidsList
      	 * hasee
      	 * 2018/11/27
      	 * 10:54
      	 *
      	 * @Version 1.0
      	 **/
      	/*
      	 * list集合可以储存空值,可以储存重复的值,它与set有一些区别,设置值为leftPush和rightPush,取值为range【它是设定取一个范围内的值,如果需要取全部的值,需要将range[start,end]的范围
      	 * 设置为比集合的内容大一些即可】
      	 *
      	 * */
      	@RunWith(SpringJUnit4ClassRunner.class)
      	@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
      	public class TestReidsList {
      	
      	    @Autowired
      	    private RedisTemplate redisTemplate;
      	
      	
      	    /*
      	     *
      	     * 设置值
      	     * */
      	    @Test
      	    public void setValue() {
      	
      	        redisTemplate.boundListOps("li").leftPush("关羽");
      	        redisTemplate.boundListOps("li").rightPush("刘备");
      	        redisTemplate.boundListOps("li").leftPush("张飞");
      	        redisTemplate.boundListOps("li").leftPush("");
      	    }
      	
      	    /*
      	     * 批量取值
      	     * */
      	    @Test
      	    public void getValue() {
      	        //获取集合从0-3索引的值
      	        List list=redisTemplate.boundListOps("li").range(0, 10);
      	        System.out.println(list);
      	    }
      	
      	    /*
      	    * 单个取值
      	    *
      	    * */
      	    @Test
      	    public void getValue_index(){
      	        Object li=redisTemplate.boundListOps("li").index(1);
      	        System.out.println(li);
      	    }
      	
      	
      	    /*
      	     * 删除值
      	     * */
      	    @Test
      	    public void deleteValue() {
      	        redisTemplate.delete("li");
      	    }
      	
      	
      	}
    

注意:

  • 在使用Spring Data Redis时,一般使用在首页之类,访问量比较高,且安全性要求较低的地方,因此在支付之类的页面谨慎使用;
  • 在使用Spring Data Redis时,在增删改的时候,可以进行判断操作,对缓存进行清理;在修改操作的时候,要注意判断,有可能修改界面会修改key[id]值,所以需要对原来的id进行清除缓存,同时也需要判断现在的id值是否与原来的id值相等,如果相等则也需要清理缓存。这样当服务器进行修改操作的时候,缓存会及时更新;
  • 本博会一直更新,支持就给个关注吧;^ ^
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗余

码字来之不易,您的鼓励我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值