了解Redis数据结构——集合

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");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值