使用前言
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
* 是否使用骨架: 否
开始代码
-
环境搭建(下):
-
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>
-
-
创建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
-
创建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值相等,如果相等则也需要清理缓存。这样当服务器进行修改操作的时候,缓存会及时更新;
- 本博会一直更新,支持就给个关注吧;^ ^