文章目录
- 1.环境搭建
- 1.创建模块
- 2.查看是否交给父模块管理
- 3.引入依赖
- 4.自动配置
- 1.目录
- 2.RedisAutoConfiguration.java
- 3.spring.factories
- 2.重写RedisTemplate
- 1.引入Jackson
- 2.编写RedisConfig.java
- 3.RedisAutoConfiguration.java 导入配置类
- 3.Redis工具类
- 1.RBase.java Redis基础工具类
- 2.RString.java
- 3.RList.java
- 4.RSet.java
- 5.RHash.java
- 6.RSortedSet.java
- 4.测试
- 1.创建测试模块
- 2.引入依赖
- 3.启动类
- 4.编写application.yml
- 5.测试
- 1.RStringController.java
- 2.RListController.java
- 3.RSetController.java
- 4.RHashController.java
- 5.RSortedSetController.java
1.环境搭建
1.创建模块
2.查看是否交给父模块管理
3.引入依赖
<?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>
<parent>
<groupId>com.sunxiansheng</groupId>
<artifactId>sunrays-common</artifactId>
<version>1.0</version>
</parent>
<version>1.0</version>
<artifactId>common-redis-starter</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
</project>
4.自动配置
1.目录
2.RedisAutoConfiguration.java
package com.sunxiansheng.redis.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedisAutoConfiguration {
}
3.spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunxiansheng.redis.config.RedisAutoConfiguration
2.重写RedisTemplate
1.引入Jackson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
2.编写RedisConfig.java
package com.sunxiansheng.redis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
Jackson2JsonRedisSerializer<Object> jacksonSerializer = jackson2JsonRedisSerializer();
redisTemplate.setValueSerializer(jacksonSerializer);
redisTemplate.setHashValueSerializer(jacksonSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.activateDefaultTyping(
BasicPolymorphicTypeValidator.builder()
.allowIfSubType(Object.class)
.build(),
ObjectMapper.DefaultTyping.NON_FINAL
);
jacksonSerializer.setObjectMapper(objectMapper);
return jacksonSerializer;
}
}
3.RedisAutoConfiguration.java 导入配置类
3.Redis工具类
1.RBase.java Redis基础工具类
package com.sunxiansheng.redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
public class RBase {
protected RedisTemplate<String, Object> redisTemplate;
public RBase(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
private static final String DEFAULT_KEY_SEPARATOR = ":";
public String buildKeyByDefaultSeparator(String... parts) {
return String.join(DEFAULT_KEY_SEPARATOR, parts);
}
public String buildKeyByCustomSeparator(String separator, String... parts) {
return String.join(separator, parts);
}
public Boolean delete(String key) {
if (key == null || key.isEmpty()) {
throw new IllegalArgumentException("Key cannot be null or empty");
}
return redisTemplate.delete(key);
}
public Long deleteBatch(Collection<String> keys) {
if (keys == null || keys.isEmpty()) {
return 0L;
}
return redisTemplate.delete(keys);
}
public Boolean expire(String key, long timeout, TimeUnit unit) {
if (key == null || key.isEmpty()) {
throw new IllegalArgumentException("Key cannot be null or empty");
}
if (timeout <= 0) {
return false;
}
return redisTemplate.expire(key, timeout, unit);
}
public Boolean expire(String key, long timeout) {
return expire(key, timeout, TimeUnit.SECONDS);
}
public Long getExpire(String key) {
if (key == null || key.isEmpty()) {
throw new IllegalArgumentException("Key cannot be null or empty");
}
return redisTemplate.getExpire(key);
}
public Boolean hasKey(String key) {
if (key == null || key.isEmpty()) {
throw new IllegalArgumentException("Key cannot be null or empty");
}
return redisTemplate.hasKey(key);
}
protected <T> T convertValue(Object value, Class<T> type) {
if (value == null) {
return null;
}
if (type == Long.class && value instanceof Integer) {
return type.cast(((Integer) value).longValue());
}
if (type.isInstance(value)) {
return type.cast(value);
} else {
throw new ClassCastException("Redis中的对象运行类型与请求转换的类型不匹配,请优先检查Redis配置类是否保存了对象原始信息!期待类型:"
+ type.getName() + ",实际类型:"
+ value.getClass().getName());
}
}
}
2.RString.java
package com.sunxiansheng.redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.concurrent.TimeUnit;
public class RString extends RBase {
public RString(RedisTemplate<String, Object> redisTemplate) {
super(redisTemplate);
}
public void set(String key, Object value) {
validateKeyAndValue(key, value);
redisTemplate.opsForValue().set(key, value);
}
public void setWithExpire(String key, Object value, final long timeout, final TimeUnit unit) {
validateKeyAndValue(key, value);
validateTimeoutAndUnit(timeout, unit);
redisTemplate.opsForValue().set(key, value, timeout, unit);
}
public void setWithExpire(String key, Object value, final long timeout) {
setWithExpire(key, value, timeout, TimeUnit.SECONDS);
}
public Boolean setIfAbsent(String key, Object value, long timeout, TimeUnit unit) {
validateKeyAndValue(key, value);
validateTimeoutAndUnit(timeout, unit);
return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit);
}
public Boolean setIfAbsent(String key, Object value, long timeout) {
return setIfAbsent(key, value, timeout, TimeUnit.SECONDS);
}
public <T> T get(String key, Class<T> type) {
Object value = redisTemplate.opsForValue().get(key);
return convertValue(value, type);
}
public <T> T getAndSet(String key, T value, Class<T> type) {
Object oldValue = redisTemplate.opsForValue().getAndSet(key, value);
return convertValue(oldValue, type);
}
public Long changeByDelta(String key, long delta) {
if (key == null) {
throw new IllegalArgumentException("Key 不能为空!");
}
return redisTemplate.opsForValue().increment(key, delta);
}
private void validateKeyAndValue(String key, Object value) {
if (key == null || value == null) {
throw new IllegalArgumentException("Key 和 Value 不能为空!");
}
}
private void validateTimeoutAndUnit(long timeout, TimeUnit unit) {
if (timeout <= 0 || unit == null) {
throw new IllegalArgumentException("超时时间必须大于 0,时间单位不能为空!");
}
}
}
3.RList.java
package com.sunxiansheng.redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class RList extends RBase {
public RList(RedisTemplate<String, Object> redisTemplate) {
super(redisTemplate);
}
public Long leftPush(String key, Object value) {
return redisTemplate.opsForList().leftPush(key, value);
}
public <V> Long leftPushAll(String key, List<V> dataList) {
return redisTemplate.opsForList().leftPushAll(key, dataList.toArray());
}
public <V> Long leftPushAll(String key, Collection<V> dataCollection) {
return redisTemplate.opsForList().leftPushAll(key, dataCollection.toArray());
}
public Long rightPush(String key, Object value) {
return redisTemplate.opsForList().rightPush(key, value);
}
public <V> Long rightPushAll(String key, List<V> dataList) {
return redisTemplate.opsForList().rightPushAll(key, dataList.toArray());
}
public <V> Long rightPushAll(String key, Collection<V> dataCollection) {
return redisTemplate.opsForList().rightPushAll(key, dataCollection.toArray());
}
public Long removeByValue(String key, long count, Object value) {
return redisTemplate.opsForList().remove(key, count, value);
}
public <T> T popRight(String key, Class<T> type) {
Object value = redisTemplate.opsForList().rightPop(key);
return convertValue(value, type);
}
public <T> T popLeft(String key, Class<T> type) {
Object value = redisTemplate.opsForList().leftPop(key);
return convertValue(value, type);
}
public void set(String key, final long index, Object value) {
redisTemplate.opsForList().set(key, index, value);
}
public <T> List<T> rangeAll(String key, Class<T> type) {
List<Object> range = redisTemplate.opsForList().range(key, 0, -1);
List<T> result = new ArrayList<>();
if (range != null) {
for (Object item : range) {
result.add(convertValue(item, type));
}
}
return result;
}
public <T> T getElementByIndex(String key, long index, Class<T> type) {
Object value = redisTemplate.opsForList().index(key, index);
return convertValue(value, type);
}
public Long size(String key) {
return redisTemplate.opsForList().size(key);
}
}
4.RSet.java
package com.sunxiansheng.redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.HashSet;
import java.util.Set;
public class RSet extends RBase {
public RSet(RedisTemplate<String, Object> redisTemplate) {
super(redisTemplate);
}
public Long add(String key, Object data) {
return redisTemplate.opsForSet().add(key, data);
}
public <T> Long addBatch(String key, Set<T> dataSet) {
return redisTemplate.opsForSet().add(key, dataSet.toArray());
}
public <T> Long remove(String key, Set<T> dataSet) {
return redisTemplate.opsForSet().remove(key, dataSet.toArray());
}
public <T> Set<T> members(String key, Class<T> type) {
Set<Object> members = redisTemplate.opsForSet().members(key);
Set<T> result = new HashSet<>();
if (members != null) {
for (Object member : members) {
result.add(convertValue(member, type));
}
}
return result;
}
public Boolean isMember(String key, Object data) {
return redisTemplate.opsForSet().isMember(key, data);
}
public Long size(String key) {
return redisTemplate.opsForSet().size(key);
}
}
5.RHash.java
package com.sunxiansheng.redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.*;
public class RHash extends RBase {
public RHash(RedisTemplate<String, Object> redisTemplate) {
super(redisTemplate);
}
public void put(String key, String hashKey, Object hashValue) {
redisTemplate.opsForHash().put(key, hashKey, hashValue);
}
public void putAll(String key, Map<String, ?> map) {
if (map == null || map.isEmpty()) {
throw new IllegalArgumentException("Map不能为空!");
}
redisTemplate.opsForHash().putAll(key, map);
}
public Long delete(String key, List<String> hashKeys) {
if (hashKeys == null || hashKeys.isEmpty()) {
return 0L;
}
return redisTemplate.opsForHash().delete(key, hashKeys.toArray());
}
public Long delete(String key, String hashKey) {
if (hashKey == null) {
return 0L;
}
return redisTemplate.opsForHash().delete(key, hashKey);
}
public <T> T getOneMapValue(String key, String hashKey, Class<T> type) {
if (hashKey == null) {
return null;
}
Object object = redisTemplate.opsForHash().get(key, hashKey);
return convertValue(object, type);
}
public <T> List<T> getMultiMapValue(String key, Collection<String> hashKeys, Class<T> type) {
if (hashKeys == null || hashKeys.isEmpty()) {
return Collections.emptyList();
}
Collection<Object> keys = new ArrayList<>(hashKeys);
List<Object> objects = redisTemplate.opsForHash().multiGet(key, keys);
List<T> result = new ArrayList<>();
for (Object obj : objects) {
result.add(convertValue(obj, type));
}
return result;
}
public <T> Map<String, T> getAll(String key, Class<T> type) {
Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);
if (entries.isEmpty()) {
return Collections.emptyMap();
}
Map<String, T> result = new HashMap<>();
for (Map.Entry<Object, Object> entry : entries.entrySet()) {
if (entry.getKey() instanceof String) {
String strKey = (String) entry.getKey();
T value = convertValue(entry.getValue(), type);
result.put(strKey, value);
} else {
throw new ClassCastException("Redis中Hash的键不是String类型:实际类型为 " + entry.getKey().getClass().getName());
}
}
return result;
}
public Boolean hasHashKey(String key, String hashKey) {
if (hashKey == null) {
return false;
}
return redisTemplate.opsForHash().hasKey(key, hashKey);
}
}
6.RSortedSet.java
package com.sunxiansheng.redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class RSortedSet extends RBase {
public RSortedSet(RedisTemplate<String, Object> redisTemplate) {
super(redisTemplate);
}
public Boolean add(String key, Object data, double score) {
return redisTemplate.opsForZSet().add(key, data, score);
}
public static class DataScore<T> {
private T data;
private Double score;
public DataScore() {
}
public DataScore(T data, Double score) {
this.data = data;
this.score = score;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
}
public <T> Long addBatch(String key, Set<DataScore<T>> dataScores) {
Set<ZSetOperations.TypedTuple<Object>> tuples = new HashSet<>();
for (DataScore<T> dataScore : dataScores) {
tuples.add(new ZSetOperations.TypedTuple<Object>() {
@Override
public Object getValue() {
return dataScore.getData();
}
@Override
public Double getScore() {
return dataScore.getScore();
}
@Override
public int compareTo(ZSetOperations.TypedTuple<Object> o) {
return Double.compare(o.getScore(), this.getScore());
}
});
}
return redisTemplate.opsForZSet().add(key, tuples);
}
public <T> Long remove(String key, Set<T> dataSet) {
return redisTemplate.opsForZSet().remove(key, dataSet.toArray());
}
public Long removeRangeByScore(String key, double min, double max) {
return redisTemplate.opsForZSet().removeRangeByScore(key, min, max);
}
public Double changeByDelta(String key, Object data, double delta) {
return redisTemplate.opsForZSet().incrementScore(key, data, delta);
}
public <T> Set<ZSetOperations.TypedTuple<T>> reverseRangeWithScores(String key, Class<T> type) {
Set<ZSetOperations.TypedTuple<Object>> typedTuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, -1);
Set<ZSetOperations.TypedTuple<T>> result = new TreeSet<>((a, b) -> Double.compare(b.getScore(), a.getScore()));
if (typedTuples != null) {
for (ZSetOperations.TypedTuple<Object> tuple : typedTuples) {
T value = convertValue(tuple.getValue(), type);
Double score = tuple.getScore();
result.add(new ZSetOperations.TypedTuple<T>() {
@Override
public T getValue() {
return value;
}
@Override
public Double getScore() {
return score;
}
@Override
public int compareTo(ZSetOperations.TypedTuple<T> o) {
return Double.compare(o.getScore(), this.getScore());
}
});
}
}
return result;
}
public Double score(String key, Object data) {
return redisTemplate.opsForZSet().score(key, data);
}
public Long reverseRank(String key, Object data) {
return redisTemplate.boundZSetOps(key).reverseRank(data);
}
public Long zCard(String key) {
return redisTemplate.opsForZSet().zCard(key);
}
public Long count(String key, double min, double max) {
return redisTemplate.opsForZSet().count(key, min, max);
}
}
4.测试
1.创建测试模块
2.引入依赖
<?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>
<parent>
<groupId>com.sunxiansheng</groupId>
<artifactId>sunrays-demo</artifactId>
<version>1.0</version>
</parent>
<artifactId>common-redis-starter-demo</artifactId>
<dependencies>
<dependency>
<groupId>com.sunxiansheng</groupId>
<artifactId>common-redis-starter</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.sunxiansheng</groupId>
<artifactId>common-log4j2-starter</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.sunxiansheng</groupId>
<artifactId>common-web-starter</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
3.启动类
package com.sunxiansheng.redis;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
4.编写application.yml
spring:
redis:
host:
port:
password:
database: 0
timeout: 1800000
lettuce:
pool:
max-active: 20
max-wait: -1
max-idle: 10
min-idle: 0
5.测试
1.RStringController.java
package com.sunxiansheng.redis.controller;
import com.sunxiansheng.redis.utils.RString;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping("/rstring")
public class RStringController {
@Resource
private RString rString;
@PostMapping("/set")
public String set(@RequestParam String key, @RequestParam Long value) {
rString.set(key, value);
return "Value set successfully!";
}
@PostMapping("/setWithExpire")
public String setWithExpire(@RequestParam String key,
@RequestParam Long value,
@RequestParam long timeout) {
rString.setWithExpire(key, value, timeout);
return "Value set with expiration successfully!";
}
@PostMapping("/setWithExpireUnit")
public String setWithExpireUnit(@RequestParam String key,
@RequestParam Long value,
@RequestParam long timeout) {
rString.setWithExpire(key, value, timeout, TimeUnit.DAYS);
return "Value set with custom expiration successfully!";
}
@PostMapping("/setIfAbsent")
public String setIfAbsent(@RequestParam String key,
@RequestParam Long value,
@RequestParam long timeout) {
boolean result = rString.setIfAbsent(key, value, timeout);
return result ? "Value set successfully!" : "Key already exists!";
}
@GetMapping("/get")
public Long get(@RequestParam String key) {
return rString.get(key, Long.class);
}
@PostMapping("/getAndSet")
public Long getAndSet(@RequestParam String key, @RequestParam Long value) {
return rString.getAndSet(key, value, Long.class);
}
@PostMapping("/changeByDelta")
public Long changeByDelta(@RequestParam String key, @RequestParam long delta) {
return rString.changeByDelta(key, delta);
}
}
2.RListController.java
package com.sunxiansheng.redis.controller;
import com.sunxiansheng.redis.utils.RList;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/rlist")
public class RListController {
@Autowired
private RList rList;
@PostMapping("/leftPush")
public String leftPush(@RequestParam String key, @RequestBody User user) {
rList.leftPush(key, user);
return "User added to the left of the list.";
}
@PostMapping("/leftPushAll")
public String leftPushAll(@RequestParam String key, @RequestBody List<User> users) {
rList.leftPushAll(key, users);
return "Users added to the left of the list.";
}
@PostMapping("/rightPush")
public String rightPush(@RequestParam String key, @RequestBody User user) {
rList.rightPush(key, user);
return "User added to the right of the list.";
}
@PostMapping("/rightPushAll")
public String rightPushAll(@RequestParam String key, @RequestBody List<User> users) {
rList.rightPushAll(key, users);
return "Users added to the right of the list.";
}
@PutMapping("/set")
public String set(@RequestParam String key, @RequestParam int index, @RequestBody User user) {
rList.set(key, index, user);
return "User updated at index " + index;
}
@GetMapping("/rangeAll")
public List<User> rangeAll(@RequestParam String key) {
return rList.rangeAll(key, User.class);
}
@GetMapping("/getElementByIndex")
public User getElementByIndex(@RequestParam String key, @RequestParam int index) {
return rList.getElementByIndex(key, index, User.class);
}
@GetMapping("/size")
public Long size(@RequestParam String key) {
return rList.size(key);
}
@DeleteMapping("/popRight")
public User popRight(@RequestParam String key) {
return rList.popRight(key, User.class);
}
@DeleteMapping("/popLeft")
public User popLeft(@RequestParam String key) {
return rList.popLeft(key, User.class);
}
@DeleteMapping("/removeByValue")
public String removeByValue(@RequestParam String key, @RequestParam int count, @RequestBody User user) {
Long removedCount = rList.removeByValue(key, count, user);
return removedCount + " matching users removed.";
}
}
@NoArgsConstructor
@Data
@AllArgsConstructor
class User implements java.io.Serializable {
private String id;
private String name;
}
3.RSetController.java
package com.sunxiansheng.redis.controller;
import com.sunxiansheng.redis.utils.RSet;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.Serializable;
import java.util.Set;
@RestController
@RequestMapping("/rset")
public class RSetController {
@Autowired
private RSet rSet;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Element implements Serializable {
private Long id;
private String name;
}
@PostMapping("/add")
public Long add(@RequestParam String key, @RequestBody Element element) {
return rSet.add(key, element);
}
@PostMapping("/addBatch")
public Long addBatch(@RequestParam String key, @RequestBody Set<Element> elements) {
return rSet.addBatch(key, elements);
}
@PostMapping("/remove")
public Long remove(@RequestParam String key, @RequestBody Set<Element> elements) {
return rSet.remove(key, elements);
}
@GetMapping("/members")
public Set<Element> members(@RequestParam String key) {
return rSet.members(key, Element.class);
}
@GetMapping("/isMember")
public Boolean isMember(@RequestParam String key, @RequestBody Element element) {
return rSet.isMember(key, element);
}
@GetMapping("/size")
public Long size(@RequestParam String key) {
return rSet.size(key);
}
}
4.RHashController.java
package com.sunxiansheng.redis.controller;
import com.sunxiansheng.redis.utils.RHash;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("/rhash")
public class RHashController {
private final RHash rHash;
public RHashController(RHash rHash) {
this.rHash = rHash;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
public static class User {
private Long id;
private String name;
private Integer age;
}
@PostMapping("/put")
public void put(@RequestParam String key, @RequestParam String hashKey, @RequestBody User user) {
rHash.put(key, hashKey, user);
}
@PostMapping("/putAll")
public void putAll(@RequestParam String key, @RequestBody Map<String, User> userMap) {
rHash.putAll(key, userMap);
}
@DeleteMapping("/deleteMultiple")
public Long deleteMultiple(@RequestParam String key, @RequestBody List<String> hashKeys) {
return rHash.delete(key, hashKeys);
}
@DeleteMapping("/deleteSingle")
public Long deleteSingle(@RequestParam String key, @RequestParam String hashKey) {
return rHash.delete(key, hashKey);
}
@GetMapping("/getOne")
public User getOneMapValue(@RequestParam String key, @RequestParam String hashKey) {
return rHash.getOneMapValue(key, hashKey, User.class);
}
@GetMapping("/getMulti")
public List<User> getMultiMapValue(@RequestParam String key, @RequestBody List<String> hashKeys) {
return rHash.getMultiMapValue(key, hashKeys, User.class);
}
@GetMapping("/getAll")
public Map<String, User> getAll(@RequestParam String key) {
return rHash.getAll(key, User.class);
}
@GetMapping("/hasHashKey")
public Boolean hasHashKey(@RequestParam String key, @RequestParam String hashKey) {
return rHash.hasHashKey(key, hashKey);
}
}
5.RSortedSetController.java
package com.sunxiansheng.redis.controller;
import com.sunxiansheng.redis.utils.RSortedSet;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.*;
import java.util.Set;
@RestController
@RequestMapping("/rsortedset")
public class RSortedSetController {
@Autowired
private RSortedSet rSortedSet;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class CustomValue {
private Long id;
private String name;
}
@PostMapping("/add")
public Boolean add(@RequestParam String key, @RequestBody CustomValue value, @RequestParam double score) {
return rSortedSet.add(key, value, score);
}
@PostMapping("/addBatch")
public Long addBatch(@RequestParam String key, @RequestBody Set<RSortedSet.DataScore<CustomValue>> dataScores) {
return rSortedSet.addBatch(key, dataScores);
}
@PostMapping("/remove")
public Long remove(@RequestParam String key, @RequestBody Set<CustomValue> values) {
return rSortedSet.remove(key, values);
}
@PostMapping("/removeRangeByScore")
public Long removeRangeByScore(@RequestParam String key, @RequestParam double min, @RequestParam double max) {
return rSortedSet.removeRangeByScore(key, min, max);
}
@PostMapping("/changeByDelta")
public Double changeByDelta(@RequestParam String key, @RequestBody CustomValue value, @RequestParam double delta) {
return rSortedSet.changeByDelta(key, value, delta);
}
@GetMapping("/reverseRangeWithScores")
public Set<ZSetOperations.TypedTuple<CustomValue>> reverseRangeWithScores(@RequestParam String key) {
return rSortedSet.reverseRangeWithScores(key, CustomValue.class);
}
@GetMapping("/score")
public Double score(@RequestParam String key, @RequestBody CustomValue value) {
return rSortedSet.score(key, value);
}
@GetMapping("/reverseRank")
public Long reverseRank(@RequestParam String key, @RequestBody CustomValue value) {
return rSortedSet.reverseRank(key, value);
}
@GetMapping("/zCard")
public Long zCard(@RequestParam String key) {
return rSortedSet.zCard(key);
}
@GetMapping("/count")
public Long count(@RequestParam String key, @RequestParam double min, @RequestParam double max) {
return rSortedSet.count(key, min, max);
}
}