Redis的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据hash分子来存储和查找数据,理论上一个集合可以存储42亿个元素,因为采用哈希表结构,所以对于Redis集合 的插入、删除和查找的复杂度都是O(1),只是我们需要注意3点:
- 对于集合而言,它的每一个元素都是不能重复的,当插入相同记录的时候都会失败。
- 集合是无序的。
- 集合的每个元素都是String数据结构类型。
Redis的集合可以对于不同的集合进行操作,比如求出两个或者以上集合的交集、差集和并集等,如下所示:
- sadd key member[member1 member2…]:给键为key的集合增加成员,也可以同时增加多个。
- scard key:统计键为key集合成员数。
- sdiff key1 [key2]:找出两个集合的差集。参数如果是单key,那么Redis就返回这个key的所有元素。
- sdiffstore des key [key2]:先按sdiff命令的规则,找出key1和key2两个集合的差集,然后将其保存到des集合中。
- sinter key1 [key2]:求key1和key2两个集合的交集,参数如果是单key,那么Redis就返回这个key的所有元素。
- sinterstore des key1 [key2]:先按sinter命令的规则,找出key1和key2两个集合的交集,然后将其保存到des集合中。
- sismember key member:判断member是否是键为key的集合的成员,如果是返回1,否则返回0。
- smembers key:返回集合所有成员。
- smove src des member:将成员member从集合sec迁移到集合des中。
- spop key:随即弹出集合的一个元素。
- srandmember key [count] 随即返回集合中一个或多个元素,count为限制返回的总数,如果count为负数,则先求出其绝对值。
- srem key member1 [member2 member3…]:移除集合中的元素,可以是多个元素。
- sunion key1 [key2]:求两个集合的并集。
- sunionstore des key1 [key2]:先按sunion命令的规则,找出key1和key2两个集合的交集,然后将其保存到des集合中。
现在我们用一个例子来使用Spring去操作Redis的集合结构。
redisSpring-cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="50" />
<property name="maxTotal" value="100" />
<property name="maxWaitMillis" value="20000" />
</bean>
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="localhost" />
<property name="port" value="6379" />
<property name="password" value="123456" />
<property name="poolConfig" ref="poolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultSerializer" ref="stringRedisSerializer" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer" />
</bean>
</beans>
testSet.java
package com.ssm.redis1.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.List;
import java.util.Set;
public class testSet {
public static void main(String[] args){
ApplicationContext applicationContext=new
ClassPathXmlApplicationContext("redisSpring-cfg.xml");
RedisTemplate redisTemplate=applicationContext.getBean(RedisTemplate.class);
Set set=null;
//将元素加入列表
redisTemplate.boundSetOps("set1").add("v1","v2","v3","v4","v5","v6");
redisTemplate.boundSetOps("set2").add("v0","v1","v3","v4","v7","v8");
//求集合长度
redisTemplate.opsForSet().size("set1");
//求差集
set=redisTemplate.opsForSet().difference("set1","set2");
//求并集
set=redisTemplate.opsForSet().intersect("set1","set2");
//判断是否是集合中的元素
boolean exists=redisTemplate.opsForSet().isMember("set1","v1");
//获取集合所有元素
set=redisTemplate.opsForSet().members("set1");
//从集合中随机弹出一个元素
String member=(String)redisTemplate.opsForSet().pop("set1");
//随机获取一个集合的元素
member=(String)redisTemplate.opsForSet().randomMember("set1");
//随机获取2个集合的元素
List list=redisTemplate.opsForSet().randomMembers("set1",2L);
//删除一个集合的元素,参数可以是多个
redisTemplate.opsForSet().remove("set1","v2");
//求两个集合的并集
redisTemplate.opsForSet().union("set1","set2");
//求两个集合的差集,并保存在集合diff_set中
redisTemplate.opsForSet().differenceAndStore("set1","set2","diff_set");
//求两个集合的交集,并保存在集合inter_set中
redisTemplate.opsForSet().intersectAndStore("set1","set2","inter_set");
//求两个集合的并集,并保存在集合union_set中
redisTemplate.opsForSet().unionAndStore("set1","set2","union_set");
}
}