一:引入springboot集成redis的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<!--这两个包是引入ToStringBuilder,感觉没吊用-->
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency>
二:接口代码
package com.neo.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Service; import java.io.Serializable; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @Service public class RedisService { private Logger logger = LoggerFactory.getLogger(RedisService.class); @Autowired private RedisTemplate redisTemplate; /** * set value * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { logger.error("set error: key {}, value {}",key,value,e); } return result; } /** * set value with expireTime * @param key * @param value * @param expireTime * @return */ public boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { logger.error("set error: key {}, value {},expireTime {}",key,value,expireTime,e); } return result; } /** * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * remove single key * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * batch delete * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * batch delete with pattern * @param pattern */ public void removePattern(final String pattern) { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0) redisTemplate.delete(keys); } /** * hash set * @param key * @param hashKey * @param value */ public void hashSet(String key, Object hashKey, Object value){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key,hashKey,value); } /** * hash get * @param key * @param hashKey * @return */ public Object hashGet(String key, Object hashKey){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key,hashKey); } /** * list push * @param k * @param v */ public void push(String k,Object v){ ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k,v); } /** * list range * @param k * @param l * @param l1 * @return */ public List<Object> range(String k, long l, long l1){ ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k,l,l1); } /** * set add * @param key * @param value */ public void setAdd(String key,Object value){ SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key,value); } /** * set get * @param key * @return */ public Set<Object> setMembers(String key){ SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } /** * ordered set add * @param key * @param value * @param scoure */ public void zAdd(String key,Object value,double scoure){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key,value,scoure); } /** * rangeByScore * @param key * @param scoure * @param scoure1 * @return */ public Set<Object> rangeByScore(String key,double scoure,double scoure1){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); } }
三:配置redis的key生成策略(一般都是类名方法名参数名),配置缓存管理器。配置redisTemplate.这里就省略后面的
package com.neo.config; import java.lang.reflect.Method; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.core.RedisTemplate; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport{ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } }
我的测试:
package com.neo.redis; import com.neo.model.User; import com.neo.service.RedisService; import org.apache.commons.lang3.SystemUtils; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.*; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; /** * redis缓存测试: 描述信息 * * @author liyy * @date 2018-07-09 10:54 */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class RedisTestService { @Autowired private RedisService redisService; @Autowired private RedisTemplate redisTemplate; /** * 测试缓存字符串 */ @Test public void test1(){ redisService.set("name","liyy"); Assert.assertEquals("liyy",redisService.get("name")); } /** * 测试缓存对象 */ @Test public void test2(){ User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020"); redisService.set("user",u); User user = (User)redisService.get("user"); System.out.println(user.getNickname()); } /** * 覆盖 */ @Test public void test3(){ redisTemplate.opsForValue().set("name","i love you"); redisTemplate.opsForValue().set("name","hello"); System.out.println(redisTemplate.opsForValue().get("name")); } /** * */ @Test public void test4(){ User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020"); ValueOperations<String,User> valueOperations = redisTemplate.opsForValue(); valueOperations.set("user",u); User user = valueOperations.get("user"); System.out.println(user.getNickname()); } /** *测试时效性 */ @Test public void test5(){ User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020"); ValueOperations<String,User> valueOperations = redisTemplate.opsForValue(); valueOperations.set("user1",u,10, TimeUnit.SECONDS); User user = valueOperations.get("user1"); System.out.println(user.getNickname()); } /** *判断key是否存在 */ @Test public void test6(){ User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020"); ValueOperations<String,User> valueOperations = redisTemplate.opsForValue(); valueOperations.set("user1",u,10, TimeUnit.SECONDS); Long time1=0L,time2=0L; try { time1 = System.currentTimeMillis(); System.out.println("线程沉睡开始...."); Thread.sleep(10000);//10s System.out.println("线程沉睡结束...."); time2 = System.currentTimeMillis(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程沉睡时间:"+(time2-time1)/1000+"秒"); if(redisTemplate.hasKey("user1")){ User user = valueOperations.get("user1"); System.out.println(user.getNickname()); }else{ System.out.println("缓存的key已经被超时删除"); } } /** * 测试缓存hash */ @Test public void test7(){ HashOperations<String,Object,Object> valueOperations = redisTemplate.opsForHash(); valueOperations.put("hash","you","you"); String str = (String)valueOperations.get("hash","you"); System.out.println(str); } /** * 测试缓存集合 */ @Test public void test8(){ String key = "list"; redisTemplate.delete(key); ListOperations<String,String> listOperations = redisTemplate.opsForList(); listOperations.leftPush(key,"i"); listOperations.leftPush(key,"love"); listOperations.leftPush(key,"you"); String str = listOperations.leftPop(key); //System.out.println(str); List<String> list = listOperations.range(key,0,3); for(String str1 : list){ System.out.println(str1) ; } } /** * 测试缓存集合 */ @Test public void test9(){ String key = "list"; redisTemplate.delete(key); ZSetOperations<String, String> zset = redisTemplate.opsForZSet(); //System.out.println(str); zset.add(key,"i",1); zset.add(key,"love",3); zset.add(key,"you",5); zset.add(key,"konw",8); Set<String> list = zset.range(key,0,3); for(String str1 : list){ System.out.println(str1) ; } } }