缓存解决方案 -- Redis
一、Redis,Jedis,Spring Data Redis
1.1 Redis
redis是一款开源的Key-value数据库,运行在内存中,由ANSIC编写。企业开发通常使用Redis来实现缓存。同类产品还有memcache、memcached、MongoDB等。
1.2 Jedis
Jedis是Redis官方退出的一款面向Java的客户端,提供了很多借口供Java语言调用。可以在Redis官网下载。还有一些开源爱好者提供的客户端,如Jredis、SRP等等。
1.3 Spring Data Redis
Spring Data Redis是spring家族的而一部分,提供了在spring应用中通过简单的配置访问Redis服务,对Redis底层开发包(Jedis、Jredis、RJC)进行了高度封装,RedisTeamplate提供了redis各种操作,异常处理及序列化,支持发布订阅,并对spring3.1cache进行了实现。
spring-data-redis针对Jedis提供了如下功能:
1.连接池自动管理,提供了一个高度封装的RedisTemplate类
2.针对Jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
ValueOperation:简单K-V操作
SetOperation:set类型数据操作
ZSetOperation:zset类型数据操作
HashOperation:针对map类型数据操作
ListOperation:针对list类型的数据操作
二、Spring Data Redis入门小Demo
2.1 准备工作
- 构建Maven工程,SpringDataRedisDemo
- 引入Spring、JUnit相关坐标依赖
- 引入Jedis和SpringDataRedis依赖
1 <!-- spring与Junit相关依赖 --> 2 略 3 4 <!-- 缓存 --> 5 <dependency> 6 <groupId>redis.clients</groupId> 7 <artifactId>jedis</artifactId> 8 <version>2.8.1</version> 9 </dependency> 10 11 <dependency> 12 <groupId>org.springframework.data</groupId> 13 <artifactId>spring-data-redis</artifactId> 14 <version>1.7.2.RELEASE</version> 15 </dependency>
- 创建redis-config.properties文件
1 redis.host=127.0.0.1 2 3 redis.port=6379 4 5 redis.password= // 密码,这里没有设置 6 7 redis.database=0 8 9 redis.maxIdle=300 // 最大空闲数 10 11 redis.maxWait=3000 // 连接时的最大等待毫秒数 12 13 redis.testOnBorrow=true // 在提取一个Jedis实例时,是否提前进行验证操作;true代表是得到的Jedis实例均是可用的
- 创建applicationContext-redis.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xmlns:cache="http://www.springframework.org/schema/cache" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/mvc 12 http://www.springframework.org/schema/mvc/spring-mvc.xsd 13 http://www.springframework.org/schema/cache 14 http://www.springframework.org/schema/cache/spring-cache.xsd"> 15 16 <context:property-placeholder location="classpath*:properties/*.properties" /> 17 18 <!-- redis 相关配置 --> 19 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> 20 <property name="maxIdle" value="${redis.maxIdle}" /> 21 <property name="maxWaitMillis" value="${redis.maxWait}" /> 22 <property name="testOnBorrow" value="${redis.testOnBorrow}" /> 23 </bean> 24 25 26 <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 27 p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> 28 29 <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> 30 <property name="connectionFactory" ref="JedisConnectionFactory" /> 31 </bean> 32 33 </beans>
2.2 RedisTemplate相关操作
1.值类型操作
1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml") 3 public class TestValue { 4 5 @Autowired 6 private RedisTemplate redisTemplate; 7 8 @Test 9 public void setValue(){ 10 redisTemplate.boundValueOps("name").set("buwei"); 11 } 12 13 @Test 14 public void getValue(){ 15 String str = (String) redisTemplate.boundValueOps("name").get(); 16 System.out.println(str); 17 } 18 19 @Test 20 public void deleteValue(){ 21 redisTemplate.delete("name");; 22 } 23 }
2.Set类型操作
1 /** 2 * 存值 3 */ 4 @Test 5 public void setValue(){ 6 redisTemplate.boundSetOps("nameset").add("曹操"); 7 redisTemplate.boundSetOps("nameset").add("刘备"); 8 redisTemplate.boundSetOps("nameset").add("孙权"); 9 } 10 11 /** 12 * 取值 13 */ 14 @Test 15 public void getValue(){ 16 Set members = redisTemplate.boundSetOps("nameset").members(); 17 System.out.println(members); 18 } 19 20 /** 21 * 删除集合中的某一个值 22 */ 23 @Test 24 public void deleteValue(){ 25 redisTemplate.boundSetOps("nameset").remove("孙权"); 26 } 27 28 /** 29 * 删除整个集合 30 */ 31 @Test 32 public void deleteAllValue(){ 33 redisTemplate.delete("nameset"); 34 }
3.List类型操作
- 右压栈
1 /** 2 * 右压栈:后添加的对象排在后边 3 */ 4 @Test 5 public void testSetValue1(){ 6 redisTemplate.boundListOps("namelist1").rightPush("刘备"); 7 redisTemplate.boundListOps("namelist1").rightPush("关羽"); 8 redisTemplate.boundListOps("namelist1").rightPush("张飞"); 9 } 10 11 /** 12 * 显示右压栈集合 13 */ 14 @Test 15 public void testGetValue1(){ 16 List list = redisTemplate.boundListOps("namelist1").range(0, 10); 17 System.out.println(list); 18 }
- 左压栈
1 /** 2 * 左压栈:后添加的对象排在前边 3 */ 4 @Test 5 public void testSetValue2(){ 6 redisTemplate.boundListOps("namelist2").leftPush("刘备"); 7 redisTemplate.boundListOps("namelist2").leftPush("关羽"); 8 redisTemplate.boundListOps("namelist2").leftPush("张飞"); 9 } 10 11 /** 12 * 显示左压栈集合 13 */ 14 @Test 15 public void testGetValue2(){ 16 List list = redisTemplate.boundListOps("namelist2").range(0, 10); 17 System.out.println(list); 18 }
- 根据索引查询元素
1 /** 2 * 查询集合中的元素 3 */ 4 @Test 5 public void testSearchByIndex(){ 6 String s = (String) redisTemplate.boundListOps("namelist1").index(1); 7 System.out.println(s); 8 }
- 移除元素
1 /** 2 * 移除集合某个元素 3 */ 4 @Test 5 public void testRemoveByIndex(){ 6 redisTemplate.boundListOps("namelist1").remove(1, "关羽"); 7 }
4.Hash类型操作
- 存值
1 @Test 2 public void testSetValue(){ 3 redisTemplate.boundHashOps("namehash").put("a", "唐僧"); 4 redisTemplate.boundHashOps("namehash").put("b", "悟空"); 5 redisTemplate.boundHashOps("namehash").put("c", "八戒"); 6 redisTemplate.boundHashOps("namehash").put("d", "沙僧"); 7 }
- 提取所有的KEY
1 @Test 2 public void testGetKeys(){ 3 Set s = redisTemplate.boundHashOps("namehash").keys(); 4 System.out.println(s); 5 }
- 提取所有的值
1 @Test 2 public void testGetValues(){ 3 List values = redisTemplate.boundHashOps("namehash").values(); 4 System.out.println(values); 5 }
- 根据KEY提取值
1 @Test 2 public void testGetValueByKey(){ 3 Object object = redisTemplate.boundHashOps("namehash").get("b"); 4 System.out.println(object); 5 }
- 根据kEY移除值
1 @Test 2 public void testRemoveValueByKey(){ 3 redisTemplate.boundHashOps("namehash").delete("c"); 4 }
当我们的业务中有需要用到redis的时候我们就可以考虑使用Spring Data Redis来实现我们的需求啦!:)
如发现有错误欢迎指正,欢迎交流,接受反驳。 -- by不为 :)