redis-util
1.demo
package com.pwc.ddc.redisutil.servcie.imp; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; import com.pwc.ddc.redisutil.entity.Student; import com.pwc.ddc.redisutil.servcie.MemoryCacheForRedis; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import java.util.*; import java.util.concurrent.TimeUnit; /** * MemoryCacheForRedisImp * * @author hongjun.h.zhang@cn.pwc.com * @description TODO * @date 2022/12/21 17:17 */ public class MemoryCacheForRedisImp implements MemoryCacheForRedis { public static RedisTemplate<String,String> redisTemplate; public static ValueOperations<String, String> stringOperations; private static String[] KEY = new String[]{"test1","test2","test3","test4","test5","test6","test7","test8","test9"}; static { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); configuration.setDatabase(5); configuration.setHostName("120.48.69.173"); configuration.setPassword("admin@pwc"); configuration.setPort(6379); JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(configuration); jedisConnectionFactory.afterPropertiesSet(); redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory); redisTemplate.afterPropertiesSet(); stringOperations = redisTemplate.opsForValue(); } public static void main(String[] args) { // init(); test(); } public static void init(){ for (String s : KEY) { redisTemplate.delete(s); } } @Override public Long getExpire(String key) { return redisTemplate.getExpire(key); } @Override public Boolean expire(String key, long time) { redisTemplate.expire(key,time,TimeUnit.SECONDS); return true; } @Override public Boolean hasKey(String key) { return redisTemplate.hasKey(key); } @Override public Boolean delete(String key) { redisTemplate.delete(key); return true; } @Override public Boolean delete(List<String> keys) { redisTemplate.delete(keys); return true; } @Override public <T> void set(String key, T value) { stringOperations.set(key,JSON.toJSONString(value)); } @Override public <T> void set(String key, Collection<T> values) { stringOperations.set(key,JSON.toJSONString(values)); } @Override public <T> void set(String key, T value, long timeout, TimeUnit unit) { stringOperations.set(key,JSON.toJSONString(value),timeout,unit); } @Override public <T> void set(String key, T value, long timeout) { set(key,value,timeout,TimeUnit.SECONDS); } @Override public <T> Boolean setIfAbsent(String key, T value) { return stringOperations.setIfAbsent(key,JSON.toJSONString(value)); } @Override public <T> Boolean setIfAbsent(String key, T value, long timeout, TimeUnit unit) { return stringOperations.setIfAbsent(key,JSON.toJSONString(value),timeout,unit); } @Override public void multiSet(Map<String, Object> map) { Map<String,String> stringMap = new HashMap<>(); for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) { stringMap.put(stringObjectEntry.getKey(),JSON.toJSONString(stringObjectEntry.getValue())); } stringOperations.multiSet(stringMap); } @Override public Boolean multiSetIfAbsent(Map<String, Object> map) { Map<String,String> stringMap = new HashMap<>(); for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) { stringMap.put(stringObjectEntry.getKey(),JSON.toJSONString(stringObjectEntry.getValue())); } return stringOperations.multiSetIfAbsent(stringMap); } @Override public <T> T get(String key, Class<T> t) { String str = stringOperations.get(key); return JSON.parseObject(str, t); } @Override public <T> Collection<T> gets(String key, Class<T> t) { String str = stringOperations.get(key); return JSON.parseArray(str, t); } @Override public <T> T getAndSet(String key, T value, Class<T> t) { T ret = get(key, t); set(key,value); return JSON.parseObject(stringOperations.getAndSet(key,JSON.toJSONString(value)),t); } @Override public <T> List<T> multiGet(Collection<String> keys, Class<T> t) { List<String> list = stringOperations.multiGet(keys); List<T> ret = new ArrayList<>(); if (list == null){ return ret; } for (String str : list) { try{ ret.add(JSON.parseObject(str,t)); continue; }catch (JSONException e){ } try{ List<T> ts = JSON.parseArray(str, t); for (T temp : ts) { ret.add(temp); } }catch (JSONException e){ } } return ret; } @Override public Long size(String key) { if (!hasKey(key)){ return 0L; } String str = stringOperations.get(key); try{ List<String> list = JSON.parseArray(str, String.class); return (long) list.size(); }catch (Exception e){ } return 1L; } }
2.实体类
package com.pwc.ddc.redisutil.entity; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * Student * * @author hongjun.h.zhang@cn.pwc.com * @description TODO * @date 2022/12/21 20:07 */ public class Student { private int id; private String username; private String sex; private int age; private String school; public Student(int id, String username, String sex, int age, String school) { this.id = id; this.username = username; this.sex = sex; this.age = age; this.school = school; } private static Random random = new Random(); private static String[] USERNAME_DIC = {"张三","李四","王五","路人甲","路人乙"}; private static String[] SEX_DIC = {"男","女"}; private static String[] SCHOOL_DIC = {"学校一","学校二","学校三","学校四","学校五"}; public Student() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return username; } public void setUserName(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } @Override public String toString() { return "Student{" + "id=" + id + ", username='" + username + '\'' + ", sex='" + sex + '\'' + ", age=" + age + ", school='" + school + '\'' + '}'; } public static List<Student> getRandomStudent(int count){ List<Student> ret = new ArrayList<>(); for (int i = 0; i < count; i++) { ret.add(getRandomStudent()); } return ret; } public static Student getRandomStudent(){ return new Student(random.nextInt(100),USERNAME_DIC[random.nextInt(USERNAME_DIC.length)] ,SEX_DIC[random.nextInt(SEX_DIC.length)],random.nextInt(100),SCHOOL_DIC[random.nextInt(SCHOOL_DIC.length)]); } }
5.测试类
public static void test(){ init(); MemoryCacheForRedisImp imp = new MemoryCacheForRedisImp(); System.out.println("在redis写入"+KEY[0]); System.out.println("在redis写入"+KEY[1]); imp.set(KEY[0], Student.getRandomStudent()); imp.set(KEY[1], Student.getRandomStudent(),1000,TimeUnit.SECONDS); System.out.println(KEY[0] +"的有效期为"+ imp.getExpire(KEY[0])); System.out.println(KEY[1] +"的有效期为"+ imp.getExpire(KEY[1])); System.out.println("判断是否含键:"+KEY[0]+ imp.hasKey(KEY[0])); System.out.println("判断是否含键:"+KEY[2]+ imp.hasKey(KEY[2])); Student student = imp.get(KEY[0], Student.class); System.out.println(KEY[0] +"的值为"+ student.toString()); System.out.println("开始调用setIfAbsent方法:"); System.out.println("开始写入"+KEY[1]+"结果为:" + imp.setIfAbsent(KEY[1], Student.getRandomStudent())); System.out.println("开始写入"+KEY[2]+"结果为:" + imp.setIfAbsent(KEY[2], Student.getRandomStudent())); System.out.println("开始调用multiSet方法:"); Map<String,Object> map = new HashMap<>(); map.put(KEY[3], Student.getRandomStudent()); map.put(KEY[4], Student.getRandomStudent()); map.put(KEY[5], Student.getRandomStudent()); imp.multiSet(map); System.out.println("查询redis中结果"); System.out.println(imp.get(KEY[3], Student.class)); System.out.println(imp.get(KEY[4], Student.class)); System.out.println(imp.get(KEY[5], Student.class)); System.out.println("开始调用multiSetIfAbsent方法:"); Map<String,Object> map2 = new HashMap<>(); map2.put(KEY[4], Student.getRandomStudent()); map2.put(KEY[5], Student.getRandomStudent()); map2.put(KEY[6], Student.getRandomStudent()); System.out.println(imp.get(KEY[4], Student.class)); System.out.println(imp.get(KEY[5], Student.class)); imp.multiSetIfAbsent(map2); System.out.println("查询redis中结果"); System.out.println(imp.get(KEY[4], Student.class)); System.out.println(imp.get(KEY[5], Student.class)); System.out.println(imp.get(KEY[6], Student.class)); System.out.println("开始测试集合放入和取出功能"); imp.set(KEY[7], Student.getRandomStudent(4)); Collection<Student> gets = imp.gets(KEY[7], Student.class); for (Student get : gets) { System.out.println(get.toString()); } System.out.println("开始测试getAndSet"); System.out.println(KEY[6] + "当前值为" + imp.get(KEY[6], Student.class)); System.out.println(KEY[6] + "通过getAndSet获取值为" + imp.getAndSet(KEY[6],Student.getRandomStudent(), Student.class)); System.out.println(KEY[6] + "当前值为" + imp.get(KEY[6], Student.class)); System.out.println("开始测试multiAndGet"); List<String> list = new ArrayList<>(); list.add(KEY[5]); list.add(KEY[6]); list.add(KEY[7]); List<Student> students = imp.multiGet(list, Student.class); for (Student temp : students) { System.out.println("结果为:"+ temp.toString()); } init(); }