Spring中使用Redis之集合类型

一、Redis集合简介
Redis的集合不是严格线性结构,而是严格哈希表结构,它的内部会根据hash分子来存储和查找数据,理论上严格集合可以存储42亿个元素,因为采用哈希表结构,所以对于Redis集合的插入,删除,和查找的复杂度都是O(1),只是我们需要注意三点:

  • 对于集合而言,它的每一个元素都是不能重复的,当插入相同记录的时候会失败。
  • 集合是无序的。
  • 集合的每一个元素都是String数据类型。

Redis集合可以对于不同的集合进行操作,比如求出两个或者两个以上的集合的交集、差集和并集。

二、集合的基本命令
【1】sadd key number1 [number2 …] ,功能:给键为key的集合添加成员,可以同时添加多个。
【2】scard key,功能:统计键为key的集合的成员数。
【3】sdiff key1 [key2],功能:找出两个集合的差集,参数如果是单个key,那么就返回这个key的所有元素。
【4】sdiffstore desKey key1 [key2],功能:先按照sdiff命令的规则,找出key1和key2两个集合的差集,然后保存在desKey集合中,参数如果是单个key,那么就返回这个key的所有元素。
【5】sinter key1 [key2],功能:求key1和key2两个集合的交集,参数如果是单个key,那么就返回这个key的所有元素。
【6】sinterstore key1 [key2],功能:先按照sinter 命令的规则,找出key1和key2两个集合的交集,然后保存在desKey集合中,参数如果是单个key,那么就返回这个key的所有元素。
【7】sismember key member,功能:判断member是否为key键的集合的成员,如果是返回1,不是则返回0。
【8】smembers key,功能:返回集合所有成员。
【9】smove src des member,功能:键成员member从集合src中迁移到集合des中。
【10】spop key,功能:随机弹出集合的严格元素。
【11】srandmember key [count],功能:随机返回集合中严格或者多个元素,如果count为负数,则先取绝对值,count默认值为1,若count大于等于集合总数,则返回整个集合。
【12】srem key member1 [member2],移除集合中的指定元素,可以移除多个。
【13】sunion key1 [key2],功能:求两个集合的并集,参数如果是单个key,那么就返回这个key的所有元素。
【14】sunionstore des key1 key2,功能:先执行sunion命令求出并集,然后保存到集合des中。

三、Spring中使用Redis操作集合类型

步骤一:创建Maven项目,在pom.xml文件中导入一下三个依赖。

     <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!-- 导入Spring中的redis依赖 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <!-- 导入jedis依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.1</version>
        </dependency>
    </dependencies>



步骤二:在applicationContext.xml文件中配置Redis。

<?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">

    <!-- Jedis 的连接池配置 -->
    <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"/>

    <!-- Redis服务中心-->
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="localhost"/>
        <property name="port" value="6379"/>
        <property name="poolConfig" ref="poolConfig"/>
    </bean>

    <!-- Redis模板类-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="defaultSerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="stringRedisSerializer"/>
    </bean>
</beans>


步骤三:创建一个RedisSetDemo类,使用Spring测试Redis链表操作,如下所示:

package demo;

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;

/**
 * @author czd
 */
public class RedisSetDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);

        Set<String> set = null;
        //将元素加入链表中,相当于sadd key number1 [number2 …]
        redisTemplate.boundSetOps("set1").add("value1", "value2", "value3");
        redisTemplate.boundSetOps("set2").add("value0", "value1", "value2");

        //求集合的长度,相当于scard key
        long size = redisTemplate.opsForSet().size("set1");
        System.out.println("set1集合的长度为:" + size);

        //求两个集合的差集,相当于sdiff key1 [key2]
        set = redisTemplate.opsForSet().difference("set1", "set2");
        for (String value : set) {
            System.out.println("set集合中的值:" + value);
        }

        //求两个集合的交集,相当于sinter key1 [key2]
        set = redisTemplate.opsForSet().intersect("set1", "set2");
        for (String value : set) {
            System.out.println("set集合中的值:" + value);
        }

        //判断某个元素是否为集合中的元素,相当于sismember key member
        boolean exist = redisTemplate.opsForSet().isMember("set1", "value1");
        System.out.println("value1是否存在集合set1中:" + exist);

        //获取集合中所有的元素,相当于smembers key
        set = redisTemplate.opsForSet().members("set1");
        for (String value : set) {
            System.out.println("set集合中的值:" + value);
        }

        //从集合中随机弹出一个数,相当于spop key
        String value = (String) redisTemplate.opsForSet().pop("set1");
        System.out.println("从集合中随机弹出一个数的值为:" + value);

        //随机获取一个集合的元素,相当于srandmember key
        value = (String) redisTemplate.opsForSet().randomMember("set1");
        System.out.println("随机获取一个集合的元素的值为:" + value);

        //随机获取一个集合的元素,相当于srandmember key [count]
//        List list =redisTemplate.opsForSet().randomMembers("sete1",2L);
//        for(int i = 0; i < list.size(); i++){
//            System.out.println("值为:" + list.get(i));
//        }

        //删除集合一个元素,也可以删除多个,相当于srem key member1 [member2]
        redisTemplate.opsForSet().remove("set1", "value1", "value2");

        //求两个集合的并集,相当于sunion key1 [key2]
        set = redisTemplate.opsForSet().union("set1","set2");
        for (String value1 : set) {
            System.out.println("set集合中的值:" + value1);
        }

        //求两个集合的差集,并且保存到diff_set中,相当于sdiffstore desKey key1 [key2]
        redisTemplate.opsForSet().differenceAndStore("set1","set2","diff_set");

        //求两个集合的交集,并且保存到inter_set中,相当于sinterstore key1 [key2]
        redisTemplate.opsForSet().intersectAndStore("set1","set2","inter_set");

        //求两个集合的并集,并且保存到union_set中,相当于sunionstore des key1 key2
        redisTemplate.opsForSet().unionAndStore("set1","set2","union_set");
    }
}

运行效果如下图所示:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值