Redis 是完全开源免费的,遵守BSD协议,先进的key - value持久化产品。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。下面是使用spring-data-redis分别针对key和value的操作。
Redis技术学习 https://www.itkc8.com
[java] view plain copy
public class KeysTest extends RedisCommon { private static StringRedisTemplate template; private static String key = "key1"; public static void main(String[] args) { log.info("-----------Starting Redis keys testing-----------"); ApplicationContext ctx = SpringApplication.run(KeysTest.class, args); template = ctx.getBean(StringRedisTemplate.class); KeysTest keysTest = ctx.getBean(KeysTest.class); keysTest.initValue(); log.info("KeysTest @##@ randomKey: " + template.randomKey()); keysTest.expireKey(key, 2); // keysTest.persistKey(key, 2); String newkey = "newKey"; // template.rename(key, newkey); template.renameIfAbsent(key, newkey); Set<String> keys = template.keys("*"); log.info("KeysTest @##@ keys:" + keys); for (String key : keys) { log.info("KeysTest @##@ " + key + " expire:" + template.getExpire(key)); // template.getExpire(key, TimeUnit.SECONDS); } int dbIndex = 1;// ref:http://redisdoc.com/key/move.html log.info("KeysTest @##@ move " + key + " to db" + dbIndex + ": " + template.move(key, 1)); // template.delete(key); template.delete(keys); log.info("KeysTest @##@ delete keys: " + keys); // template.exec(); // template.multi(); // template.discard(); // template.slaveOf(host, port); // template.slaveOfNoOne(); // template.watch(key); // template.watch(keys); // template.unwatch(); log.info("-----------End Redis keys testing-----------"); } public void initValue() { String value = "hello,redis"; template.opsForValue().set(key, value); Set<String> keys = new HashSet<String>() { private static final long serialVersionUID = -4402948387930279259L; { this.add("key2"); this.add("key3"); this.add("key4"); } }; try { byte[] bytes = template.dump(key); log.info("KeysTest # key dump:" + new String(bytes)); for (String k : keys) { template.restore(k, bytes, 0, TimeUnit.SECONDS); } } catch (Exception e) { e.printStackTrace(); } } public boolean expireKey(String key, long expiretime) { log.info("KeysTest @##@ has " + key + " : " + template.hasKey(key)); log.info("KeysTest @##@ expire " + key + " for " + expiretime + " seconds : " + template.expire(key, expiretime, TimeUnit.SECONDS)); // template.expireAt(key, new Date()); try { Thread.sleep((expiretime + 1) * 1000); } catch (InterruptedException e) { e.printStackTrace(); } boolean result = template.hasKey(key); log.info("KeysTest @##@ has " + key + " : " + result); return result; } public boolean persistKey(String key, long expiretime) { log.info("KeysTest @##@ has " + key + " : " + template.hasKey(key)); log.info("KeysTest @##@ expire " + key + " for " + expiretime + " seconds : " + template.expire(key, expiretime, TimeUnit.SECONDS)); log.info("KeysTest @##@ persist " + key + " : " + template.persist(key)); try { Thread.sleep((expiretime + 1) * 1000); } catch (InterruptedException e) { e.printStackTrace(); } return template.hasKey(key); } }
[java] view plain copy
public class StringsTest extends RedisCommon { private static StringRedisTemplate template; private static String key = "strKey"; public static void main(String[] args) throws InterruptedException { log.info("-----------Starting Redis Strings testing-----------"); ApplicationContext ctx = SpringApplication.run(StringsTest.class, args); template = ctx.getBean(StringRedisTemplate.class); StringsTest stringsTest = ctx.getBean(StringsTest.class); String value = "hello, redis"; template.opsForValue().set(key, value); log.info("StringsTest @##@ " + key + "'s value: " + template.opsForValue().get(key)); log.info("StringsTest @##@ " + key + "'s size: " + template.opsForValue().size(key)); stringsTest.getRange(key, 0, 5); template.opsForValue().getAndSet(key, "hello, redis world"); log.info("StringsTest @##@ " + key + "'s value after getAndSet: " + template.opsForValue().get(key)); stringsTest.multiOperation(); stringsTest.incrementDouble(); stringsTest.incrementLong(); } public void getRange(String key, int start, int end){ log.info("StringsTest @##@ " + key + "'s value: " + template.opsForValue().get(key)); log.info("StringsTest @##@ " + key + " range from "+start +" to " + end +" value is: " + template.opsForValue().get(key, start, end)); } public void multiOperation(){ Map<String, String> m = new HashMap<>(); Set<String> keys = new HashSet<>(); for(int i=0;i< 4;i++){ m.put("key" + i, "value" + i); keys.add("key" + i); } template.opsForValue().multiSet(m); log.info("StringsTest @##@ multiSet : done."); log.info("StringsTest @##@ multiGet : " + template.opsForValue().multiGet(keys)); } public void incrementDouble() { String hashKey = UUID.randomUUID().toString(); Double value1 = template.opsForValue().increment(hashKey, 30.5d); log.info(hashKey + " has value :" + value1); double d = 30.2d; Double value2 = template.opsForValue().increment(hashKey, d); log.info(hashKey + " has value: " + value2 + ", after increment " + d); } public void incrementLong() { String hashKey = UUID.randomUUID().toString(); long value1 = template.opsForValue().increment(hashKey, 30l); log.info(hashKey + " has value :" + value1); long l = 25l; long value2 = template.opsForValue().increment(hashKey, l); log.info(hashKey + " has value: " + value2 + ", after increment " + l); } }
[java] view plain copy
public class HashTest extends RedisCommon { private static RedisTemplate<String, Map<String, UserInfo>> userTemplate; private static RedisTemplate<String, Map<String, Double>> doubleTemplate; private static RedisTemplate<String, Map<String, Long>> longTemplate; private static String key = "UserInfo"; public static void main(String[] args) throws InterruptedException { log.info("-----------Starting Redis hash testing-----------"); ApplicationContext ctx = SpringApplication.run(HashTest.class, args); RedisConnectionFactory connectionFactory = ctx .getBean(RedisConnectionFactory.class); userTemplate = new RedisTemplate<>(); userTemplate.setConnectionFactory(connectionFactory); userTemplate.setKeySerializer(userTemplate.getStringSerializer()); userTemplate.setHashKeySerializer(userTemplate.getStringSerializer()); userTemplate .setHashValueSerializer(new JacksonJsonRedisSerializer<UserInfo>( UserInfo.class)); userTemplate.afterPropertiesSet(); doubleTemplate = new RedisTemplate<>(); doubleTemplate.setConnectionFactory(connectionFactory); doubleTemplate.setKeySerializer(doubleTemplate.getStringSerializer()); doubleTemplate.setHashKeySerializer(doubleTemplate.getStringSerializer()); doubleTemplate.setHashValueSerializer(doubleTemplate.getDefaultSerializer()); doubleTemplate.afterPropertiesSet(); longTemplate = new RedisTemplate<>(); longTemplate.setConnectionFactory(connectionFactory); longTemplate.setKeySerializer(longTemplate.getStringSerializer()); longTemplate.setHashKeySerializer(longTemplate.getStringSerializer()); longTemplate.setHashValueSerializer(new LongSerializer()); longTemplate.afterPropertiesSet(); HashTest hashTest = ctx.getBean(HashTest.class); // hashTest.insert(); // hashTest.batchInsert(); // hashTest.insertIfAbsent(); // hashTest.findAll(); // hashTest.findOne(); // hashTest.findAllKeys(); // hashTest.incrementDouble(); hashTest.incrementLong(); } public void insert() { UserInfo info = new UserInfo(); info.setName("Tomy"); info.setAge(20); info.setBirthday(new Date()); info.setId(UUID.randomUUID().toString()); userTemplate.opsForHash().put(key, info.getId(), info); log.info("insert User[" + info + "] success!"); log.info("User Hash size is : " + userTemplate.opsForHash().size(key)); } public void batchInsert() { Map<String, UserInfo> users = new HashMap<>(); for (int i = 1; i <= 3; i++) { UserInfo info = new UserInfo(); info.setName("Tomy" + i); info.setAge(20 + i); info.setBirthday(new Date()); info.setId(UUID.randomUUID().toString()); users.put(info.getId(), info); } userTemplate.opsForHash().putAll(key, users); log.info("batchInsert Users[" + users + "] success!"); log.info("User Hash size is : " + userTemplate.opsForHash().size(key)); } public void insertIfAbsent() { UserInfo info = new UserInfo(); info.setName("Tomy4"); info.setAge(20); info.setBirthday(new Date()); info.setId(UUID.randomUUID().toString()); userTemplate.opsForHash().putIfAbsent(key, info.getId(), info); log.info("insertIfAbsent User[" + info + "] success!"); log.info("User Hash size is : " + userTemplate.opsForHash().size(key)); } public void findAll() { Map<Object, Object> users = userTemplate.opsForHash().entries(key); log.info("All User[" + users + "]"); log.info("findAll User size is : " + users.size()); } public UserInfo findOne() { String hashKey = "2ca66275-88ab-49e5-8651-b987e55d9347"; Object userInfo = userTemplate.opsForHash().get(key, hashKey); // boolean have = userTemplate.opsForHash().hasKey(hashKey, hashKey); log.info("find one : " + userInfo); return userInfo != null ? (UserInfo) userInfo : null; } public Set<Object> findAllKeys() { Set<Object> users = userTemplate.opsForHash().keys(key); log.info("find : " + users.size() + " users :" + users); return users; } public void scan() { userTemplate.opsForHash().scan(key, ScanOptions.NONE); } public void incrementDouble() { String hashKey = UUID.randomUUID().toString(); Double value1 = doubleTemplate.opsForHash().increment(key, hashKey, Double.valueOf("30")); log.info(key + ":" + hashKey + " has value :" + value1); Double delta = Double.valueOf("30.3"); Double value2 = doubleTemplate.opsForHash().increment(key, hashKey, delta); log.info(key + ":" + hashKey + " has value: " + value2 + ", after increment " + delta); } public void incrementLong() { String hashKey = UUID.randomUUID().toString(); long value1 = doubleTemplate.opsForHash().increment(key, hashKey, 30l); log.info(key + ":" + hashKey + " has value :" + value1); long delta = 20l; long value2 = doubleTemplate.opsForHash().increment(key, hashKey, delta); log.info(key + ":" + hashKey + " has value: " + value2 + ", after increment " + delta); } }
[java] view plain copy
public class ListsTest extends RedisCommon { private static RedisTemplate<String, UserInfo> userTemplate; public static void main(String[] args) throws InterruptedException { log.info("-----------Starting Redis Lists testing-----------"); ApplicationContext ctx = SpringApplication.run(ListsTest.class, args); RedisConnectionFactory connectionFactory = ctx .getBean(RedisConnectionFactory.class); userTemplate = new RedisTemplate<>(); userTemplate.setConnectionFactory(connectionFactory); userTemplate.setKeySerializer(userTemplate.getStringSerializer()); userTemplate.setValueSerializer(new JacksonJsonRedisSerializer<UserInfo>( UserInfo.class)); userTemplate.afterPropertiesSet(); String key = "UserInfo"; ListsTest listsTest = ctx.getBean(ListsTest.class); listsTest.leftpush(key); listsTest.leftpushBatch(key); listsTest.leftpop(key); listsTest.rightPopAndLeftPush(key); } public void leftpush(String key) { int size = 10; for(int i = 0; i < size; i++){ UserInfo info = new UserInfo(); info.setName("Tomy" + i); info.setAge(20 + i); info.setBirthday(new Date()); info.setId(UUID.randomUUID().toString()); userTemplate.opsForList().leftPush(key, info); //userTemplate.opsForList().leftPush(key, pivot, value) //userTemplate.opsForList().leftPushIfPresent(key, value) //userTemplate.opsForList().rightPush(key, pivot, value) //userTemplate.opsForList().rightPushIfPresent(key, value) } log.info("insert [" + size + "] User success! " + key + "'s size is:" + userTemplate.opsForList().size(key)); } public void leftpushBatch(String key){ int size = 20; List<UserInfo> users = new ArrayList<>(); for(int i = 10; i < size; i++){ UserInfo info = new UserInfo(); info.setName("Tomy" + i); info.setAge(20 + i); info.setBirthday(new Date()); info.setId(UUID.randomUUID().toString()); users.add(info); } userTemplate.opsForList().leftPushAll(key, users.toArray(new UserInfo[users.size()])); //userTemplate.opsForList().rightPushAll(key, (UserInfo[])users.toArray()); log.info("batchinsert [" + users.size() + "] User success! " + key + "'s size is:" + userTemplate.opsForList().size(key)); } public void leftpop(String key){ UserInfo userInfo = userTemplate.opsForList().leftPop(key, 2, TimeUnit.SECONDS); //userTemplate.opsForList().leftPop(key); AtomicInteger ai = new AtomicInteger(0); while(userInfo != null){ ai.incrementAndGet(); userInfo = userTemplate.opsForList().leftPop(key, 2, TimeUnit.SECONDS); } log.info("pop [" + ai.get() + "] Users from " + key); } public void rightPopAndLeftPush(String srcKey){ String destinationKey = "destinationKey"; log.info("srcKey [" + srcKey + "]'s size : " + userTemplate.opsForList().size(srcKey)); log.info("destKey [" + destinationKey + "]'s size : " + userTemplate.opsForList().size(destinationKey)); UserInfo userInfo = userTemplate.opsForList().rightPopAndLeftPush(srcKey, destinationKey); while(userInfo != null){ userInfo = userTemplate.opsForList().rightPopAndLeftPush(srcKey, destinationKey, 2, TimeUnit.SECONDS); } log.info("After rightPopAndLeftPush destKey [" + destinationKey + "]'s size : " + userTemplate.opsForList().size(destinationKey)); } }
[java] view plain copy
public class SetTest extends RedisCommon { public static void main(String[] args) throws InterruptedException { log.info("-----------Starting Redis Set testing-----------"); ApplicationContext ctx = SpringApplication.run(SetTest.class, args); StringRedisTemplate st = ctx.getBean(StringRedisTemplate.class); String key = "SetKey"; String destKey = "DestKey"; String[] values = new String[]{"value1","value2","value3","value4","value5","value6","value7"}; log.info("SetKey add [" + st.opsForSet().add(key, values ) + "] values "); log.info("SetKey's member " + st.opsForSet().members(key)); String value5 = "value5"; log.info(value5 + " is member of SetKey's : " + st.opsForSet().isMember(key, value5)); log.info("SetKey's randomMember [" + st.opsForSet().randomMember(key) + "]"); log.info("SetKey's size: " + st.opsForSet().size(key)); String[] subValues = new String[]{"value1","value2","value3"}; log.info("SetKey remove " + st.opsForSet().remove(key, subValues) + " members"); log.info("SetKey's size: " + st.opsForSet().size(key)); log.info("SetKey move to DestKey: " + st.opsForSet().move(key, value5, destKey)); log.info("SetKey's size: " + st.opsForSet().size(key)); log.info("DestKey size: " + st.opsForSet().size(destKey)); String popValue = st.opsForSet().pop(key); log.info("SetKey move to DestKey: " + st.opsForSet().move(key, popValue, destKey)); log.info("SetKey's size: " + st.opsForSet().size(key)); log.info("DestKey size: " + st.opsForSet().size(destKey)); //st.opsForSet().difference(key, destKey); //st.opsForSet().differenceAndStore(key, otherKeys, destKey); //st.opsForSet().intersect(key, destKey); //st.opsForSet().intersectAndStore(key, otherKey, destKey); } }
[java] view plain copy
public class ZSetTest extends RedisCommon { public static void main(String[] args) throws InterruptedException { log.info("-----------Starting Redis ZSet testing-----------"); ApplicationContext ctx = SpringApplication.run(ZSetTest.class, args); StringRedisTemplate st = ctx.getBean(StringRedisTemplate.class); String key = "ZSetKey"; Set<TypedTuple<String>> values = new HashSet<>(); for (int i = 0; i < 10; i++) { TypedTuple<String> tuple = new DefaultTypedTuple<String>("value-" + i, 12d + i); values.add(tuple); } // log.info("SetKey add [" + st.opsForZSet().add(key, values) + "] values"); //st.opsForZSet().add(key, value, score) //st.opsForZSet().incrementScore(key, value, delta) log.info("SetKey has [" + st.opsForZSet().size(key) + "] values"); double start = 15d; double end = 18d; log.info("SetKey between " + start + " and " + end + " have " + st.opsForZSet().count(key, start, end)); long s = 1; long e = 5; log.info("SetKey range from " + s + " to " + e + " have " + st.opsForZSet().range(key, s, e)); //st.opsForZSet().rangeByScore(key, min, max, offset, count) //st.opsForZSet().rangeByScoreWithScores(key, min, max) //st.opsForZSet().rangeByScoreWithScores(key, min, max, offset, count) //st.opsForZSet() String member = "value-5"; log.info(member + "'s rank is " + st.opsForZSet().rank(key, member) + " in SetKey."); log.info("Remove " + member + " from SetKey : " + st.opsForZSet().remove(key, member)); // st.opsForZSet().removeRange(key, start, end) // st.opsForZSet().removeRangeByScore(key, min, max) // st.opsForZSet().reverseRange(key, start, end) // st.opsForZSet().reverseRangeByScore(key, min, max) // st.opsForZSet().reverseRangeByScoreWithScores(key, min, max) // st.opsForZSet().reverseRank(key, o) // st.opsForZSet().unionAndStore(key, otherKeys, destKey) // st.opsForZSet().unionAndStore(key, otherKey, destKey) } }
[java] view plain copy
public class TopicTest extends RedisCommon { private static String topicName = "Topic:chat"; @Bean RedisMessageListenerContainer container( RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter, new PatternTopic(topicName)); //container.addMessageListener(listenerAdapter, new ChannelTopic(topicName)); return container; } @Bean MessageListenerAdapter listenerAdapter(Receiver receiver) { return new MessageListenerAdapter(receiver, "receiveMessage"); } @Bean Receiver receiver(@Value("Receiver-1") String name) { return new Receiver(name); } public static void main(String[] args) throws InterruptedException { log.info("-----------Starting Redis Topic testing-----------"); ApplicationContext ctx = SpringApplication.run(TopicTest.class, args); StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class); template.convertAndSend(topicName, "Hello from Redis!"); } static class Receiver { private String name; @Autowired public Receiver(String name) { this.name = name; } public void receiveMessage(String message) { log.info(name + " received <" + message + ">"); } } }Redis技术学习 https://www.itkc8.com
