SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법
Spring은 RedisTemplate을 캡슐화하여 모든 Redis 기본 API를 지원하는 Redis를 작동합니다. RedisTemplate에는 5가지 데이터 구조에 대한 연산 방법이 정의되어 있습니다.
opsForValue(): 문자열을 작동합니다.
opsForList(): 작업 목록입니다.
opsForHash(): 해시를 작동합니다.
opsForSet(): 작업 집합입니다.
opsForZSet(): 주문된 세트를 작동합니다.
예제를 통해 이러한 방법을 이해하고 적용해 봅시다. 여러 번 실행할 경우 데이터 삭제를 실패하면 데이터 작업이 반복될 수 있으므로 반드시 위의 방법을 실행한 후 데이터를 삭제해야 한다는 점에 유의하시기 바랍니다.
(1) Maven을 사용하여 종속성 파일 추가
pom.xml 구성 정보 파일에 Redis 종속성을 추가합니다.
My SpringBoot 버전:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
Redis 종속성 추가:
<!-- Redis启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.3.3.RELEASE</version> </dependency>
(2) Redis 구성
application.yml 구성 파일에서 Redis 정보를 구성합니다:
#Spring配置 spring: #缓存管理器 cache: type: redis #Redis配置 redis: database: 0 #Redis数据库索引(默认为0) host: 127.0.0.1 #Redis服务器地址 port: 6379 #Redis服务器连接端口 password: #Redis服务器连接密码(默认为空) jedis: pool: max-active: 8 #连接池最大连接数(使用负值表示没有限制) max-wait: -1s #连接池最大阻塞等待时间(使用负值表示没有限制) max-idle: 8 #连接池中的最大空闲连接 min-idle: 0 #连接池中的最小空闲连接 lettuce: shutdown-timeout: 100ms #关闭超时时间,默认值100ms
(3) Redis 구성 클래스(구성 계층)
com.pjb.config 패키지를 생성하고 RedisConfig 클래스(Redis 구성 클래스)를 생성합니다. CachingConfigurerSupport 클래스를 상속합니다.
package com.pjb.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; 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.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import java.lang.reflect.Method; /** * Redis配置类 * @author pan_junbiao **/ @Configuration public class RedisConfig extends CachingConfigurerSupport { /** * 缓存对象集合中,缓存是以key-value形式保存的, * 当不指定缓存的key时,SpringBoot会使用keyGenerator生成Key。 */ @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(); } }; } /** * 缓存管理器 */ @SuppressWarnings("rawtypes") @Bean public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory); //设置缓存过期时间 return cacheManager; } /** * 实例化RedisTemplate对象 */ @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
1. String(String)
String(String)은 Redis의 가장 기본적인 데이터 유형입니다. 각 키(Key)는 문자열의 해당 값(Value)에 해당합니다. 즉, 키-값 키-값 쌍이 있습니다. 문자열은 바이너리 안전하며 모든 데이터(예: 이미지 또는 직렬화된 개체)를 저장할 수 있습니다. 최대값은 512MB의 데이터를 저장할 수 있습니다. 일반적으로 일부 복잡한 계산 기능을 캐싱하는 데 사용됩니다. RedisTemplate은 문자열 작업을 위해 다음과 같은 메서드를 제공합니다.
1.1 void set(K 키, V 값); 긴 타임아웃, TimeUnit 단위)
다음 코드 설정은 3s에 유효하지 않습니다. 쿼리는 3초 이내에 결과를 가지며, 쿼리는 3초 후에 null을 반환합니다. 구체적인 사용법은 다음 코드를 참조하세요.
/** * Redis操作字符串(String) * @author pan_junbiao **/ @SpringBootTest public class StringTest { @Autowired private RedisTemplate redisTemplate; @Test public void string1() { redisTemplate.opsForValue().set("userName","pan_junbiao的博客"); redisTemplate.opsForValue().set("blogUrl","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForValue().set("blogRemark","您好,欢迎访问 pan_junbiao的博客"); System.out.println("用户名称:" + redisTemplate.opsForValue().get("userName")); System.out.println("博客地址:" + redisTemplate.opsForValue().get("blogUrl")); System.out.println("博客信息:" + redisTemplate.opsForValue().get("blogRemark")); } }
실행 결과:
1.3 V getAndSet(K key, V value)
키의 문자열을 설정하고 이전 값을 반환합니다. 구체적인 사용법은 다음 코드를 참조하세요.
@Autowired private RedisTemplate redisTemplate; @Test public void string2() { //设置的是3s失效,3s之内查询有结果,3s之后返回null redisTemplate.opsForValue().set("blogRemark","您好,欢迎访问 pan_junbiao的博客",3, TimeUnit.SECONDS); try { Object s1 = redisTemplate.opsForValue().get("blogRemark"); System.out.println("博客信息:" + s1); Thread.currentThread().sleep(2000); Object s2 = redisTemplate.opsForValue().get("blogRemark"); System.out.println("博客信息:" + s2); Thread.currentThread().sleep(5000); Object s3 = redisTemplate.opsForValue().get("blogRemark"); System.out.println("博客信息:" + s3); } catch (InterruptedException ie) { ie.printStackTrace(); } }
실행 결과:
1.4 정수 추가(K 키, V 값)
키가 이미 존재하고 문자열 유형인 경우 이 명령은 새 키를 추가합니다. 원래 값 문자열의 끝. 키가 존재하지 않으면 키가 생성되어 빈 문자열로 설정됩니다. 즉, 이 특별한 경우의 추가 작업은 설정 작업과 유사합니다. 구체적인 사용법은 다음 코드를 참조하세요.
@Autowired private RedisTemplate redisTemplate; @Test public void string3() { //设置键的字符串并返回其旧值 redisTemplate.opsForValue().set("blogRemark","pan_junbiao的博客"); Object oldVaule = redisTemplate.opsForValue().getAndSet("blogRemark","您好,欢迎访问 pan_junbiao的博客"); Object newVaule = redisTemplate.opsForValue().get("blogRemark"); System.out.println("旧值:" + oldVaule); System.out.println("新值:" + newVaule); }
실행 결과:
참고:
여기에서 역직렬화 구성에 주의하세요. 그렇지 않으면 오류가 보고됩니다.1.5 긴 크기(K 키)
키에 해당하는 값의 길이를 반환합니다. 다음 코드를 참조하세요.
@Autowired private RedisTemplate redisTemplate; @Test public void string4() { //设置value的序列化规则,否则会报错 redisTemplate.setValueSerializer(new StringRedisSerializer()); redisTemplate.opsForValue().append("blogRemark","您好,欢迎访问 "); System.out.println(redisTemplate.opsForValue().get("blogRemark")); redisTemplate.opsForValue().append("blogRemark","pan_junbiao的博客"); System.out.println(redisTemplate.opsForValue().get("blogRemark")); }
실행 결과:
2. list는 삽입 순서로 정렬된 간단한 문자열 목록입니다. 요소는 목록의 머리(왼쪽) 또는 꼬리(오른쪽)에 추가될 수 있습니다.
목록 데이터 결과를 이용하여 간단한 메시지 큐 기능을 수행할 수 있습니다. Irange 명령을 사용하여 Redis 기반의 고성능 페이지 매김을 구현할 수도 있습니다.
2.1 Long leftPushAll(K 키, V... 값); Long rightPushAll(K 키, V... 값)leftPushAll 메서드: 목록에 배열을 삽입함을 나타냅니다.
rightPushAll 방법: 목록의 가장 오른쪽 부분에 요소를 일괄 추가하는 것을 의미합니다. 구체적인 사용법은 다음 코드를 참조하세요.
@Autowired private RedisTemplate redisTemplate; @Test public void string5() { redisTemplate.opsForValue().set("userName","pan_junbiao的博客"); System.out.println("Value值:" + redisTemplate.opsForValue().get("userName")); System.out.println("Value值的长度:" + redisTemplate.opsForValue().size("userName")); }
실행 결과:
2.2 Long leftPush(K 키, V 값)
leftPush 메서드: 지정된 값을 모두 삽입합니다. 키 목록의 선두에 있습니다. push 작업을 수행하기 전에 해당 키가 존재하지 않으면 빈 목록을 생성하여 왼쪽에 삽입합니다.
rightPush 메서드: 키 목록 끝에 지정된 모든 값을 삽입합니다. push 작업을 수행하기 전 키가 존재하지 않으면 빈 리스트를 생성하고 오른쪽에 요소를 삽입합니다. 구체적인 사용법은 다음 코드를 참조하세요.
/** * Redis操作列表(List) * @author pan_junbiao **/ @SpringBootTest public class ListTest { @Autowired private RedisTemplate redisTemplate; @Test public void list1() { String[] user1 = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"}; String[] user2 = new String[]{"2","pan_junbiao的博客","https://blog.csdn.net/pan_junbiao"}; String[] user3 = new String[]{"3","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"}; redisTemplate.opsForList().rightPushAll("user1",user1); redisTemplate.opsForList().rightPushAll("user2",user2); redisTemplate.opsForList().rightPushAll("user3",user3); System.out.println(redisTemplate.opsForList().range("user1",0,-1)); System.out.println(redisTemplate.opsForList().range("user2",0,-1)); System.out.println(redisTemplate.opsForList().range("user3",0,-1)); } }
실행 결과:
2.3 Long size(K key)
返回存储在键中的列表的长度。如果键不存在,则将其解释为空列表,并返回0。如果key存在的值不是列表,则返回错误。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void list3() { String[] user = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"}; redisTemplate.opsForList().leftPushAll("user",user); System.out.println("列表的长度:" + redisTemplate.opsForList().size("user")); }
执行结果:
2.4 void set(K key, long index, V value)
在列表中 index 的位置设置 value。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void list4() { String[] user = new String[]{"1","pan_junbiao的博客","https://blog.csdn.net/pan_junbiao"}; redisTemplate.opsForList().rightPushAll("user",user); System.out.println(redisTemplate.opsForList().range("user",0,-1)); redisTemplate.opsForList().set("user",2,"您好,欢迎访问 pan_junbiao的博客"); System.out.println(redisTemplate.opsForList().range("user",0,-1)); }
执行结果:
2.5 V index(K key, long index)
根据下标获取列表中的值(下标从0开始)。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void list2() { redisTemplate.opsForList().rightPush("userInfo",1); redisTemplate.opsForList().rightPush("userInfo","pan_junbiao的博客"); redisTemplate.opsForList().rightPush("userInfo","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForList().rightPush("userInfo","您好,欢迎访问 pan_junbiao的博客"); System.out.println("用户编号:" + redisTemplate.opsForList().index("userInfo",0)); System.out.println("用户名称:" + redisTemplate.opsForList().index("userInfo",1)); System.out.println("博客地址:" + redisTemplate.opsForList().index("userInfo",2)); System.out.println("博客信息:" + redisTemplate.opsForList().index("userInfo",3)); }
执行结果:
2.6 Long remove(K key, long count, Object value)
从键中存储的列表中删除第一个计数事件等于给定“count”值的元素。其中,参数count的含义如下:
count=0:删除等于value的所有元素。
count>0:删除等于从头到尾移动的值的元素。
count
以下代码用于删除列表中第一次出现的值:
@Autowired private RedisTemplate redisTemplate; @Test public void list5() { String[] user = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"}; redisTemplate.opsForList().rightPushAll("user",user); System.out.println(redisTemplate.opsForList().range("user",0,-1)); //将删除列表中第一次出现的pan_junbiao的博客 redisTemplate.opsForList().remove("user",1,"pan_junbiao的博客"); System.out.println(redisTemplate.opsForList().range("user",0,-1)); }
执行结果:
2.7 V leftPop(K key);V rightPop(K key)
leftPop方法:弹出最左边的元素,弹出之后该值在列表中将不复存在。
rightPop方法:弹出最右边的元素,弹出之后该值在列表中将不复存在。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void list6() { String[] user = new String[]{"1","pan_junbiao的博客","您好,欢迎访问 pan_junbiao的博客"}; redisTemplate.opsForList().rightPushAll("user",user); System.out.println(redisTemplate.opsForList().range("user",0,-1)); //弹出最右边的元素,弹出之后该值在列表中将不复存在 System.out.println(redisTemplate.opsForList().rightPop("user")); System.out.println(redisTemplate.opsForList().range("user",0,-1)); }
执行结果:
3、哈希(Hash)
Redis 中的 hash(哈希)是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。value 中存放的是结构化的对象。利用这样数据结果,可以方便地操作其中的某个字段。比如在“单点登录”时,可以用这种数据结构存储用户信息。以 CookieId 作为 key,设置30分钟为缓存过期时间,能很好地模拟出类似 Session 的效果。
3.1 void putAll(H key, Map extends HK, ? extends HV> m);Map entries(H key)
putAll方法:用 m 中提供的多个散列字段设置到 key 对应的散列表中。
entries方法:根据密钥获取整个散列存储。具体用法见以下代码:
/** * Redis操作哈希(Hash) * @author pan_junbiao **/ @SpringBootTest public class HashTest { @Autowired private RedisTemplate redisTemplate; @Test public void hash2() { Map<String,Object> userMap = new HashMap<>(); userMap.put("userName","pan_junbiao的博客"); userMap.put("blogRemark","您好,欢迎访问 pan_junbiao的博客"); redisTemplate.opsForHash().putAll("userHash",userMap); System.out.println(redisTemplate.opsForHash().entries("userHash")); } }
执行结果:
3.2 void put(H key, HK hashKey, HV value);HV get(H key, Object hashKey)
put方法:设置 hashKey 的值。
get方法:从键中的散列获取给定 hashKey 的值。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void hash3() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogUrl","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客"); System.out.println("用户名称:" + redisTemplate.opsForHash().get("userHash","userName")); System.out.println("博客地址:" + redisTemplate.opsForHash().get("userHash","blogUrl")); System.out.println("博客信息:" + redisTemplate.opsForHash().get("userHash","blogRemark")); }
执行结果:
3.3 List values(H key);Set keys(H key)
values方法:根据密钥获取整个散列存储的值。
keys方法:根据密钥获取整个散列存储的键。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void hash4() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客"); System.out.println("散列存储的值:" + redisTemplate.opsForHash().values("userHash")); System.out.println("散列存储的键:" + redisTemplate.opsForHash().keys("userHash")); }
执行结果:
3.4 Boolean hasKey(H key, Object hashKey);Long size(H key)
hasKey方法:确定 hashKey 是否存在。
size方法:获取 key 所对应的散列表的大小个数。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void hash5() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogUrl","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客"); System.out.println(redisTemplate.opsForHash().hasKey("userHash","userName")); System.out.println(redisTemplate.opsForHash().hasKey("userHash","age")); System.out.println(redisTemplate.opsForHash().size("userHash")); }
执行结果:
3.5 Long delete(H key, Object... hashKeys)
删除给定的 hashKeys。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void hash6() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,欢迎访问 pan_junbiao的博客"); System.out.println(redisTemplate.opsForHash().delete("userHash","blogRemark")); System.out.println(redisTemplate.opsForHash().entries("userHash")); }
执行结果:
4、集合(Set)
set 是存放不重复值的集合。利用 set 可以做全局去重复的功能。还可以进行交集、并集、差集等操作,也可用来实现计算共同喜好、全部的喜好、自己独有的喜好等功能。
Redis 的 set 是 string 类型的无序集合,通过散列表实现。
4.1 Long add(K key, V... values);Set members(K key)
add方法:在无序集合中添加元素,返回添加个数;如果存在重复的则不进行添加。
members方法:返回集合中的所有成员。具体用法见以下代码:
/** * Redis操作集合(Set) * @author pan_junbiao **/ @SpringBootTest public class SetTest { @Autowired private RedisTemplate redisTemplate; @Test public void set1() { String[] citys = new String[]{"北京","上海","广州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().add("citySet","香港","澳门","台湾")); //返回集合中的所有元素 System.out.println(redisTemplate.opsForSet().members("citySet")); } }
执行结果:
4.2 Long remove(K key, Object... values)
移除集合中一个或多个成员。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void set2() { String[] citys = new String[]{"北京","上海","广州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().remove("citySet",citys)); }
执行结果:
4.3 V pop(K key)
移除并返回集合中的一个随机元素。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void set3() { String[] citys = new String[]{"北京","上海","广州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().pop("citySet")); System.out.println(redisTemplate.opsForSet().members("citySet")); }
执行结果:
4.4 Boolean move(K key, V value, K destKey)
将 member 元素移动。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void set4() { String[] citys = new String[]{"北京","上海","广州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().move("citySet","深圳","citySet2")); System.out.println(redisTemplate.opsForSet().members("citySet")); System.out.println(redisTemplate.opsForSet().members("citySet2")); }
执行结果:
4.5 Cursor scan(K key, ScanOptions options)
用于遍历 Set。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void set5() { String[] citys = new String[]{"北京","上海","广州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); Cursor<Object> cursor = redisTemplate.opsForSet().scan("citySet", ScanOptions.NONE); while(cursor.hasNext()) { System.out.println(cursor.next()); } }
执行结果:
4.6 交集、并集、差集
Set
intersect(K key1, K key2)方法、Long intersectAndStore(K key1, K key2, K destKey)方法:交集。 Set
union(K key1, K key2)方法、Long unionAndStore(K key1, K key2, K destKey)方法:并集。 Set
difference(K key1, K key2)方法、Long differenceAndStore(K key1, K key2, K destKey)方法:差集。
具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void set6() { String[] city1 = new String[]{"北京", "上海", "广州", "深圳", "昆明"}; String[] city2 = new String[]{"北京", "深圳", "昆明", "成都"}; System.out.println(redisTemplate.opsForSet().add("citySet1", city1)); System.out.println(redisTemplate.opsForSet().add("citySet2", city2)); //返回集合中的所有元素 System.out.println("城市集合1:" + redisTemplate.opsForSet().members("citySet1")); System.out.println("城市集合2:" + redisTemplate.opsForSet().members("citySet2")); //求交集、并集、差集(方式一) System.out.println("求交集、并集、差集(方式一):"); System.out.println("交集:" + redisTemplate.opsForSet().intersect("citySet1","citySet2")); System.out.println("并集:" + redisTemplate.opsForSet().union("citySet1","citySet2")); System.out.println("差集:" + redisTemplate.opsForSet().difference("citySet1","citySet2")); //求交集、并集、差集(方式二) redisTemplate.opsForSet().intersectAndStore("citySet1","citySet2", "intersectCity"); redisTemplate.opsForSet().unionAndStore("citySet1","citySet2", "unionCity"); redisTemplate.opsForSet().differenceAndStore("citySet1","citySet2", "differenceCity"); System.out.println("求交集、并集、差集(方式二):"); System.out.println("交集:" + redisTemplate.opsForSet().members("intersectCity")); System.out.println("并集:" + redisTemplate.opsForSet().members("unionCity")); System.out.println("差集:" + redisTemplate.opsForSet().members("differenceCity")); }
执行结果:
5、有序集合(Sorted Set)
zset(Sorted Set 有序集合)也是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个 double 类型的分数。可以通过分数将该集合中的成员从小到大进行排序。
虽然 zset 的成员是唯一的,但是权重参数分数(score)可以重复。集合中的元素能够按 score 进行排列。它可以用来做排行榜应用、取TOP/N、延时任务、范围查找等。
5.1 Long add(K key, Set> tuples)
增加一个有序集合。具体用法见以下代码:
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.DefaultTypedTuple; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import java.util.HashSet; import java.util.Set; /** * Redis操作有序集合(Sorted Set) * @author pan_junbiao **/ @SpringBootTest public class SortedSetTest { @Autowired private RedisTemplate redisTemplate; @Test public void Zset1() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>(); typles.add(objectTypedTuple1); typles.add(objectTypedTuple2); typles.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("typles",typles)); System.out.println(redisTemplate.opsForZSet().range("typles",0,-1)); } }
执行结果:
5.2 Boolean add(K key, V value, double score)
新增一个有序集合,存在的话为false,不存在的话为true。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset2() { System.out.println(redisTemplate.opsForZSet().add("zset2", "pan_junbiao的博客_01", 9.6)); System.out.println(redisTemplate.opsForZSet().add("zset2", "pan_junbiao的博客_01", 9.6)); }
执行结果:
5.3 Long remove(K key, Object... values)
从有序集合中移除一个或者多个元素。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset3() { System.out.println(redisTemplate.opsForZSet().add("zset3", "pan_junbiao的博客_01", 1.0)); System.out.println(redisTemplate.opsForZSet().add("zset3", "pan_junbiao的博客_02", 1.0)); System.out.println(redisTemplate.opsForZSet().range("zset3", 0, -1)); System.out.println(redisTemplate.opsForZSet().remove("zset3", "pan_junbiao的博客_02")); System.out.println(redisTemplate.opsForZSet().range("zset3", 0, -1)); }
执行结果:
5.4 Long rank(K key, Object value)
返回有序集中指定成员的排名,其中有序集成员按分数值递增(从小到大)顺序排列。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset4() { System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_01",9.6)); System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_02",1.5)); System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_03",7.4)); System.out.println(redisTemplate.opsForZSet().range("zset4", 0, -1)); System.out.println(redisTemplate.opsForZSet().rank("zset4", "pan_junbiao的博客_02")); }
执行结果:
注意:结果中的0表示第一(最小)。
5.5 Set range(K key, long start, long end);Set rangeByScore(K key, double score1, double score2)
range方法:通过索引区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列。
rangeByScore方法:通过分数区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列。
具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset5() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>(); typles.add(objectTypedTuple1); typles.add(objectTypedTuple2); typles.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("zset5",typles)); System.out.println(redisTemplate.opsForZSet().range("zset5",0,-1)); System.out.println(redisTemplate.opsForZSet().rangeByScore("zset5", 0, 8)); }
执行结果:
5.6 Long count(K key, double score1, double score2);Long size(K key)
count方法:通过分数返回有序集合指定区间内的成员个数。
size方法:获取有序集合的成员数。
具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset6() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>(); typles.add(objectTypedTuple1); typles.add(objectTypedTuple2); typles.add(objectTypedTuple3); redisTemplate.opsForZSet().add("zset6", typles); System.out.println("分数在0至8区间内的成员个数:" + redisTemplate.opsForZSet().count("zset6", 0, 8)); System.out.println("有序集合的成员数:" + redisTemplate.opsForZSet().size("zset6")); }
执行结果:
5.7 Double score(K key, Object o)
获取指定成员的score值。具体用法见以下代码:
@Test public void Zset7() { redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_01", 9.6); redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_02", 1.5); redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_03", 7.4); System.out.println("pan_junbiao的博客_01的分数:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_01")); System.out.println("pan_junbiao的博客_02的分数:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_02")); System.out.println("pan_junbiao的博客_03的分数:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_03")); }
执行结果:
5.8 Long removeRange(K key, long start, long end)
移除指定索引位置的成员,有序集合成员按照分数值递增(从小到大)顺序排列。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset8() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<ZSetOperations.TypedTuple<String>>(); tuples.add(objectTypedTuple1); tuples.add(objectTypedTuple2); tuples.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("zset8", tuples)); System.out.println(redisTemplate.opsForZSet().range("zset8", 0, -1)); System.out.println(redisTemplate.opsForZSet().removeRange("zset8", 1, 5)); System.out.println(redisTemplate.opsForZSet().range("zset8", 0, -1)); }
执行结果:
5.9 Cursor> scan(K key, ScanOptions options)
遍历 zset。具体用法见以下代码:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset9() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<ZSetOperations.TypedTuple<String>>(); tuples.add(objectTypedTuple1); tuples.add(objectTypedTuple2); tuples.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("zset9", tuples)); Cursor<ZSetOperations.TypedTuple<Object>> cursor = redisTemplate.opsForZSet().scan("zset9", ScanOptions.NONE); while (cursor.hasNext()) { ZSetOperations.TypedTuple<Object> item = cursor.next(); System.out.println(item.getValue() + " 的分数值:" + item.getScore()); } }
执行结果:
위 내용은 SpringBoot가 RedisTemplate을 사용하여 Redis 데이터 유형을 작동하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

redisisclassifiedasanoSqldatabaseBecauseItuseSakey-valuedatamodelinsteadofThraditionalRelationalDatabasemodel.Itoffersspeedandflexibility, makingIdealforreal-timeApplicationsandcaching, butitmaynotbesuitableforscenariosrequiringstrictaintetaintetaintetaintetaintetaintetaintegry

Redis는 데이터를 캐싱하여 분산 잠금 및 데이터 지속성을 구현하여 응용 프로그램 성능 및 확장 성을 향상시킵니다. 1) 캐시 데이터 : Redis를 사용하여 데이터 액세스 속도를 향상시키기 위해 자주 액세스하는 데이터를 캐시합니다. 2) 분산 잠금 : Redis를 사용하여 분산 된 잠금 장치를 구현하여 분산 환경에서 작동의 보안을 보장합니다. 3) 데이터 지속성 : 데이터 손실을 방지하기위한 RDB 및 AOF 메커니즘을 통한 데이터 보안을 보장합니다.

Redis의 데이터 모델 및 구조에는 5 가지 주요 유형이 포함됩니다. 1. 문자열 : 텍스트 또는 이진 데이터를 저장하는 데 사용되며 원자 연산을 지원합니다. 2. 목록 : 정렬 된 요소 컬렉션, 대기열 및 스택에 적합합니다. 세트 : 세트 작동을 지원하는 비 순차 고유 요소 세트. 4. 순서 세트 (SortedSet) : 순위에 적합한 점수가있는 고유 한 요소 세트. 5. 해시 테이블 (HASH) : 객체를 저장하는 데 적합한 키 값 쌍 모음.

Redis의 데이터베이스 방법에는 메모리 인 데이터베이스 및 키 값 저장소가 포함됩니다. 1) Redis는 메모리에 데이터를 저장하고 빠르게 읽고 쓰고 있습니다. 2) 키 값 쌍을 사용하여 데이터를 저장하고 캐시 및 NOSQL 데이터베이스에 적합한 목록, 컬렉션, 해시 테이블 및 주문 컬렉션과 같은 복잡한 데이터 구조를 지원합니다.

Redis는 빠른 성능, 풍부한 데이터 구조, 고 가용성 및 확장 성, 지속성 기능 및 광범위한 생태계 지원을 제공하기 때문에 강력한 데이터베이스 솔루션입니다. 1) 매우 빠른 성능 : Redis의 데이터는 메모리에 저장되며 동시성이 높고 대기 시간이 낮은 응용 프로그램에 적합한 빠른 읽기 및 쓰기 속도를 가지고 있습니다. 2) 풍부한 데이터 구조 : 다양한 시나리오에 적합한 목록, 컬렉션 등과 같은 여러 데이터 유형을 지원합니다. 3) 고 가용성 및 확장 성 : 마스터 슬레이브 복제 및 클러스터 모드를 지원하여 고 가용성 및 수평 확장 성을 달성합니다. 4) 지속성 및 데이터 보안 : 데이터 지속성은 RDB 및 AOF를 통해 달성되어 데이터 무결성 및 신뢰성을 보장합니다. 5) 광범위한 생태계 및 지역 사회 지원 : 거대한 생태계와 활동적인 커뮤니티,

Redis의 주요 기능에는 속도, 유연성 및 풍부한 데이터 구조 지원이 포함됩니다. 1) 속도 : Redis는 메모리 내 데이터베이스이며, 읽기 및 쓰기 작업은 거의 순간적이며 캐시 및 세션 관리에 적합합니다. 2) 유연성 : 복잡한 데이터 처리에 적합한 문자열, 목록, 컬렉션 등과 같은 여러 데이터 구조를 지원합니다. 3) 데이터 구조 지원 : 다양한 비즈니스 요구에 적합한 문자열, 목록, 컬렉션, 해시 테이블 등을 제공합니다.

Redis의 핵심 기능은 고성능 인 메모리 데이터 저장 및 처리 시스템입니다. 1) 고속 데이터 액세스 : Redis는 메모리에 데이터를 저장하고 마이크로 초 수준 읽기 및 쓰기 속도를 제공합니다. 2) 풍부한 데이터 구조 : 문자열, 목록, 컬렉션 등을 지원하며 다양한 응용 프로그램 시나리오에 적응합니다. 3) 지속성 : RDB 및 AOF를 통해 디스크에 데이터를 지속하십시오. 4) 구독 게시 : 메시지 대기열 또는 실시간 통신 시스템에서 사용할 수 있습니다.

Redis는 다음을 포함하여 다양한 데이터 구조를 지원합니다. 1. String, 단일 값 데이터 저장에 적합합니다. 2. 큐 및 스택에 적합한 목록; 3. 비면성 데이터 저장에 사용되는 세트; 4. 순서, 순위 목록 및 우선 순위 대기열에 적합한 순서 세트; 5. 해시 테이블, 객체 또는 구조화 된 데이터를 저장하는 데 적합합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Dreamweaver Mac版
시각적 웹 개발 도구
