redis 详解二

pom

<!-- Redis 官方提供的 Java 驱动 -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    
    <!-- Spring 对 Redis 的封装 -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.8.6.RELEASE</version>
    </dependency>
    
    <!-- Java 与 JSON 的相互转换 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>

Redis 数据结构简介

Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。

下面来对这5种数据结构类型作简单的介绍:

Redis 5种数据结构的概念大致介绍到这边,下面将结合Spring封装的RedisTemplate来对这5种数据结构的运用进行演示

RedisTemplate介绍

Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。RedisTemplate位于spring-data-redis包下。

RedisTemplate中定义了对5种数据结构操作

redisTemplate.opsForValue();//操作字符串

redisTemplate.opsForHash();//操作hash

redisTemplate.opsForList();//操作list

redisTemplate.opsForSet();//操作set

redisTemplate.opsForZSet();//操作有序set

StringRedisTemplate与RedisTemplate

  • 两者的关系是StringRedisTemplate继承RedisTemplate。

  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisConf配置如下:

package com.guige.core.conf;

import com.guige.core.ext.common.redis.MyCacheErrorHandler;
import com.guige.core.ext.common.redis.MyKeyGenerator;
import com.guige.core.ext.common.redis.MyRedisCacheManager;
import com.guige.core.ext.common.redis.MyRedisTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.interceptor.CacheErrorHandler;
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.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisPoolConfig;

/**
 * TODO
 *
 * @author songaw
 * @date 2018/7/17 11:29
 */
@Component
@Configuration
public class RedisConf {
    @Value("${spring.redis.database}")
    private Integer database;

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.port}")
    private Integer port;

    @Value("${spring.redis.timeout}")
    private Integer timeout;

    @Value(value = "${spring.redis.expire:300}")
    private Integer expiration;

    @Value("${spring.redis.pool.maxactive}")
    private int maxActive;

    @Value("${spring.redis.pool.minidle}")
    private int minIdle;

    @Value("${spring.redis.pool.maxidle}")
    private int maxIdle;

    @Bean
    public JedisPoolConfig jedisPoolConfig(){
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(this.maxIdle);
        poolConfig.setMinIdle(this.minIdle);
        poolConfig.setTestOnCreate(true);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestWhileIdle(true);
        return poolConfig;
    }
    @Bean
    public JedisConnectionFactory jedisConnectionFactory(){
        JedisPoolConfig config = jedisPoolConfig();
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(config);
        jedisConnectionFactory.setDatabase(this.database);
        jedisConnectionFactory.setHostName(this.host);
        jedisConnectionFactory.setPassword(this.password);
        jedisConnectionFactory.setPort(this.port);
        jedisConnectionFactory.setTimeout(this.timeout);
        return jedisConnectionFactory;
    }
    @Bean
   public  RedisTemplate redisTemplate(){
        MyRedisTemplate myRedisTemplate = new MyRedisTemplate();
        myRedisTemplate.setConnectionFactory(jedisConnectionFactory());
        return myRedisTemplate;
    }
    public RedisCacheManager redisCacheManager(){
        MyRedisCacheManager myRedisCacheManager = new MyRedisCacheManager(redisTemplate());
        return myRedisCacheManager;
    }
    @Bean
    public CacheErrorHandler cacheErrorHandler(){
        MyCacheErrorHandler myCacheErrorHandler = new MyCacheErrorHandler();
        return myCacheErrorHandler;
    }
    @Bean
    KeyGenerator keyGenerator(){
        MyKeyGenerator myKeyGenerator = new MyKeyGenerator();
        return myKeyGenerator;
    }
}

Redis的String数据结构 (推荐使用StringRedisTemplate)

public interface ValueOperations<K,V>

ValueOperations可以对String数据结构进行操作:

---------------------------------------------------------------------------------------------------------------


set void set(K key, V value);
使用:redisTemplate.opsForValue().set("name","tom");
结果:redisTemplate.opsForValue().get("name")  输出结果为tom

---------------------------------------------------------------------------------------------------------------


set void set(K key, V value, long timeout, TimeUnit unit);

使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null

---------------------------------------------------------------------------------------------------------------


set void set(K key, V value, long offset);
该方法是用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
使用:template.opsForValue().set("key","hello world");
      template.opsForValue().set("key","redis", 6);
      System.out.println("***************"+template.opsForValue().get("key"));
结果:***************hello redis
---------------------------------------------------------------------------------------------------------------


setIfAbsent Boolean setIfAbsent(K key, V value);
使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));//false  multi1之前已经存在
        System.out.println(template.opsForValue().setIfAbsent("multi111","multi111"));//true  multi111之前不存在
结果:false
true
---------------------------------------------------------------------------------------------------------------

multiSet void multiSet(Map<? extends K, ? extends V> m);
为多个键分别设置它们的值
 multiSet void multiSet(Map<? extends K, ? extends V> m);
 使用:
        Map<String,String> maps = new HashMap<String, String>();
        maps.put("multi1","multi1");
        maps.put("multi2","multi2");
        maps.put("multi3","multi3");
        template.opsForValue().multiSet(maps);
        List<String> keys = new ArrayList<String>();
        keys.add("multi1");
        keys.add("multi2");
        keys.add("multi3");
        System.out.println(template.opsForValue().multiGet(keys));
结果:
        [multi1, multi2, multi3]
---------------------------------------------------------------------------------------------------------------

get V get(Object key);
使用:template.opsForValue().set("key","hello world");
      System.out.println("***************"+template.opsForValue().get("key"));
结果:***************hello world

---------------------------------------------------------------------------------------------------------------
getAndSet V getAndSet(K key, V value);
设置键的字符串值并返回其旧值
使用:template.opsForValue().set("getSetTest","test");
      System.out.println(template.opsForValue().getAndSet("getSetTest","test2"));
结果:test
---------------------------------------------------------------------------------------------------------------

multiGet List<V> multiGet(Collection<K> keys);
为多个键分别取出它们的值
使用:Map<String,String> maps = new HashMap<String, String>();
      maps.put("multi1","multi1");
      maps.put("multi2","multi2");
      maps.put("multi3","multi3");
      template.opsForValue().multiSet(maps);
      List<String> keys = new ArrayList<String>();
      keys.add("multi1");
      keys.add("multi2");
      keys.add("multi3");
      System.out.println(template.opsForValue().multiGet(keys));
结果:[multi1, multi2, multi3]
---------------------------------------------------------------------------------------------------------------

increment Long increment(K key, long delta);
支持整数
使用:template.opsForValue().increment("increlong",1);
      System.out.println("***************"+template.opsForValue().get("increlong"));
结果:***************1
---------------------------------------------------------------------------------------------------------------
increment Double increment(K key, double delta);
也支持浮点数
使用:template.opsForValue().increment("increlong",1.2);
      System.out.println("***************"+template.opsForValue().get("increlong"));
结果:***************2.2
---------------------------------------------------------------------------------------------------------------
append Integer append(K key, String value);

如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。如果键不存在,则它被创建并设置为空字符串,因此APPEND在这种特殊情况下将类似于SET。
使用:template.opsForValue().append("appendTest","Hello");
      System.out.println(template.opsForValue().get("appendTest"));
      template.opsForValue().append("appendTest","world");
      System.out.println(template.opsForValue().get("appendTest"));
结果:Hello
      Helloworld
---------------------------------------------------------------------------------------------------------------
get String get(K key, long start, long end);
截取key所对应的value字符串
使用:appendTest对应的value为Helloworld
System.out.println("*********"+template.opsForValue().get("appendTest",0,5));
结果:*********Hellow
使用:System.out.println("*********"+template.opsForValue().get("appendTest",0,-1));
结果:*********Helloworld
使用:System.out.println("*********"+template.opsForValue().get("appendTest",-3,-1));
结果:*********rld
---------------------------------------------------------------------------------------------------------------
size Long size(K key);
返回key所对应的value值得长度

使用:template.opsForValue().set("key","hello world");
  System.out.println("***************"+template.opsForValue().size("key"));
结果:***************11

---------------------------------------------------------------------------------------------------------------


setBit Boolean setBit(K key, long offset, boolean value);
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
key键对应的值value对应的ascii码,在offset的位置(从左向右数)变为value

使用:template.opsForValue().set("bitTest","a");
      // 'a' 的ASCII码是 97。转换为二进制是:01100001
      // 'b' 的ASCII码是 98  转换为二进制是:01100010
      // 'c' 的ASCII码是 99  转换为二进制是:01100011
      //因为二进制只有0和1,在setbit中true为1,false为0,因此我要变为'b'的话第六位设置为1,第七位设置为0
      template.opsForValue().setBit("bitTest",6, true);
      template.opsForValue().setBit("bitTest",7, false);
      System.out.println(template.opsForValue().get("bitTest"));
结果:b
---------------------------------------------------------------------------------------------------------------
getBit Boolean getBit(K key, long offset);
获取键对应值的ascii码的在offset处位值

使用:System.out.println(template.opsForValue().getBit("bitTest",7));
结果:false
View Code

Redis的List数据结构

public interface ListOperations<K,V>

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

ListOperations专门操作list列表:

---------------------------------------------------------------------------------------------------------------
List<V> range(K key, long start, long end);

返回存储在键中的列表的指定元素。偏移开始和停止是基于零的索引,其中0是列表的第一个元素(列表的头部),1是下一个元素

使用:System.out.println(template.opsForList().range("list",0,-1));
结果:[c#, c++, python, java, c#, c#]

---------------------------------------------------------------------------------------------------------------
void trim(K key, long start, long end);
修剪现有列表,使其只包含指定的指定范围的元素,起始和停止都是基于0的索引

使用:
System.out.println(template.opsForList().range("list",0,-1));

template.opsForList().trim("list",1,-1);//裁剪第一个元素
System.out.println(template.opsForList().range("list",0,-1));

结果:[c#, c++, python, java, c#, c#]
[c++, python, java, c#, c#]
---------------------------------------------------------------------------------------------------------------

Long size(K key);

返回存储在键中的列表的长度。如果键不存在,则将其解释为空列表,并返回0。当key存储的值不是列表时返回错误。
使用:System.out.println(template.opsForList().size("list"));
结果:6

---------------------------------------------------------------------------------------------------------------

Long leftPush(K key, V value);

将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从左边插入)

使用:template.opsForList().leftPush("list","java");
      template.opsForList().leftPush("list","python");
      template.opsForList().leftPush("list","c++");
结果:返回的结果为推送操作后的列表的长度
1
2
3
---------------------------------------------------------------------------------------------------------------

Long leftPushAll(K key, V... values);

批量把一个数组插入到列表中
使用:String[] stringarrays = new String[]{"1","2","3"};
      template.opsForList().leftPushAll("listarray",stringarrays);
      System.out.println(template.opsForList().range("listarray",0,-1));
结果:[3, 2, 1]

---------------------------------------------------------------------------------------------------------------
Long leftPushAll(K key, Collection<V> values);

批量把一个集合插入到列表中

使用:List<Object> strings = new ArrayList<Object>();
      strings.add("1");
      strings.add("2");
      strings.add("3");
      template.opsForList().leftPushAll("listcollection4", strings);
      System.out.println(template.opsForList().range("listcollection4",0,-1));
结果:[3, 2, 1]

---------------------------------------------------------------------------------------------------------------
Long leftPushIfPresent(K key, V value);

只有存在key对应的列表才能将这个value值插入到key所对应的列表中

使用:System.out.println(template.opsForList().leftPushIfPresent("leftPushIfPresent","aa"));
      System.out.println(template.opsForList().leftPushIfPresent("leftPushIfPresent","bb"));
==========分割线===========
System.out.println(template.opsForList().leftPush("leftPushIfPresent","aa"));
      System.out.println(template.opsForList().leftPushIfPresent("leftPushIfPresent","bb"));
结果:
0
0
==========分割线===========
1
2
---------------------------------------------------------------------------------------------------------------
Long leftPush(K key, V pivot, V value);

把value值放到key对应列表中pivot值的左面,如果pivot值存在的话

使用:template.opsForList().leftPush("list","java","oc");
      System.out.print(template.opsForList().range("list",0,-1));
结果:[c++, python, oc, java, c#, c#]

---------------------------------------------------------------------------------------------------------------
Long rightPush(K key, V value);
将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从右边插入)

使用:template.opsForList().rightPush("listRight","java");
      template.opsForList().rightPush("listRight","python");
      template.opsForList().rightPush("listRight","c++");
结果:
1
2
3
---------------------------------------------------------------------------------------------------------------
Long rightPushAll(K key, V... values);

使用:String[] stringarrays = new String[]{"1","2","3"};
      template.opsForList().rightPushAll("listarrayright",stringarrays);
      System.out.println(template.opsForList().range("listarrayright",0,-1));
结果:[1, 2, 3]

---------------------------------------------------------------------------------------------------------------
Long rightPushAll(K key, Collection<V> values);

使用:List<Object> strings = new ArrayList<Object>();
      strings.add("1");
      strings.add("2");
      strings.add("3");
      template.opsForList().rightPushAll("listcollectionright", strings);
      System.out.println(template.opsForList().range("listcollectionright",0,-1));
结果:[1, 2, 3]
---------------------------------------------------------------------------------------------------------------

Long rightPushIfPresent(K key, V value);
只有存在key对应的列表才能将这个value值插入到key所对应的列表中

使用:System.out.println(template.opsForList().rightPushIfPresent("rightPushIfPresent","aa"));
      System.out.println(template.opsForList().rightPushIfPresent("rightPushIfPresent","bb"));
      System.out.println("==========分割线===========");
      System.out.println(template.opsForList().rightPush("rightPushIfPresent","aa"));
      System.out.println(template.opsForList().rightPushIfPresent("rightPushIfPresent","bb"));
结果:0
0
==========分割线===========
1
2
---------------------------------------------------------------------------------------------------------------

Long rightPush(K key, V pivot, V value);
把value值放到key对应列表中pivot值的右面,如果pivot值存在的话

使用:System.out.println(template.opsForList().range("listRight",0,-1));
      template.opsForList().rightPush("listRight","python","oc");
      System.out.println(template.opsForList().range("listRight",0,-1));
结果:[java, python, c++]
[java, python, oc, c++]

---------------------------------------------------------------------------------------------------------------

void set(K key, long index, V value);
在列表中index的位置设置value值

使用:System.out.println(template.opsForList().range("listRight",0,-1));
      template.opsForList().set("listRight",1,"setValue");
      System.out.println(template.opsForList().range("listRight",0,-1));
结果:[java, python, oc, c++]
[java, setValue, oc, c++]

---------------------------------------------------------------------------------------------------------------

Long remove(K key, long count, Object value);
从存储在键中的列表中删除等于值的元素的第一个计数事件。
计数参数以下列方式影响操作:
count> 0:删除等于从头到尾移动的值的元素。
count <0:删除等于从尾到头移动的值的元素。
count = 0:删除等于value的所有元素。

使用:System.out.println(template.opsForList().range("listRight",0,-1));
      template.opsForList().remove("listRight",1,"setValue");//将删除列表中存储的列表中第一次次出现的“setValue”。
      System.out.println(template.opsForList().range("listRight",0,-1));
结果:[java, setValue, oc, c++]
[java, oc, c++]
---------------------------------------------------------------------------------------------------------------

V index(K key, long index);
根据下表获取列表中的值,下标是从0开始的

使用:System.out.println(template.opsForList().range("listRight",0,-1));
System.out.println(template.opsForList().index("listRight",2));
结果:[java, oc, c++]
c++

---------------------------------------------------------------------------------------------------------------

V leftPop(K key);
弹出最左边的元素,弹出之后该值在列表中将不复存在

使用:System.out.println(template.opsForList().range("list",0,-1));
      System.out.println(template.opsForList().leftPop("list"));
      System.out.println(template.opsForList().range("list",0,-1));
结果:
[c++, python, oc, java, c#, c#]
c++
[python, oc, java, c#, c#]

---------------------------------------------------------------------------------------------------------------
V leftPop(K key, long timeout, TimeUnit unit);
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

使用:用法与 leftPop(K key);一样

---------------------------------------------------------------------------------------------------------------

V rightPop(K key);

弹出最右边的元素,弹出之后该值在列表中将不复存在

使用:    System.out.println(template.opsForList().range("list",0,-1));
      System.out.println(template.opsForList().rightPop("list"));
      System.out.println(template.opsForList().range("list",0,-1));
结果:[python, oc, java, c#, c#]
c#
[python, oc, java, c#]
---------------------------------------------------------------------------------------------------------------
V rightPop(K key, long timeout, TimeUnit unit);
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。


使用:用法与 rightPop(K key);一样

---------------------------------------------------------------------------------------------------------------

V rightPopAndLeftPush(K sourceKey, K destinationKey);
用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

使用:System.out.println(template.opsForList().range("list",0,-1));
template.opsForList().rightPopAndLeftPush("list","rightPopAndLeftPush");
  System.out.println(template.opsForList().range("list",0,-1));
  System.out.println(template.opsForList().range("rightPopAndLeftPush",0,-1));
结果:[oc, java,c#]
[oc, java]
[c#]

---------------------------------------------------------------------------------------------------------------

V rightPopAndLeftPush(K sourceKey, K destinationKey, long timeout, TimeUnit unit);


用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

使用:用法与rightPopAndLeftPush(K sourceKey, K destinationKey)一样
View Code

Redis的Hash数据机构(Redis的散列可以让用户将多个键值对存储到一个Redis键里面)

public interface HashOperations<H,HK,HV>
HashOperations提供一系列方法操作hash:

---------------------------------------------------------------------------------------------------------------

初始数据:
template.opsForHash().put("redisHash","name","tom");
template.opsForHash().put("redisHash","age",26);
template.opsForHash().put("redisHash","class","6");

Map<String,Object> testMap = new HashMap();
testMap.put("name","jack");
testMap.put("age",27);
testMap.put("class","1");
template.opsForHash().putAll("redisHash1",testMap);

---------------------------------------------------------------------------------------------------------------

Long delete(H key, Object... hashKeys);
删除给定的哈希hashKeys
使用:System.out.println(template.opsForHash().delete("redisHash","name"));
      System.out.println(template.opsForHash().entries("redisHash"));
结果:1
{class=6, age=28.1}
---------------------------------------------------------------------------------------------------------------

Boolean hasKey(H key, Object hashKey);
确定哈希hashKey是否存在

使用:System.out.println(template.opsForHash().hasKey("redisHash","age"));
      System.out.println(template.opsForHash().hasKey("redisHash","ttt"));
结果:true
false
---------------------------------------------------------------------------------------------------------------

HV get(H key, Object hashKey);
从键中的哈希获取给定hashKey的值

使用:System.out.println(template.opsForHash().get("redisHash","age"));
结果:26
---------------------------------------------------------------------------------------------------------------

List<HV> multiGet(H key, Collection<HK> hashKeys);
从哈希中获取给定hashKey的值

使用:List<Object> kes = new ArrayList<Object>();
      kes.add("name");
      kes.add("age");
      System.out.println(template.opsForHash().multiGet("redisHash",kes));
结果:[jack, 28.1]

---------------------------------------------------------------------------------------------------------------

Long increment(H key, HK hashKey, long delta);

通过给定的delta增加散列hashKey的值(整型)

使用:System.out.println(template.opsForHash().get("redisHash","age"));
  System.out.println(template.opsForHash().increment("redisHash","age",1));
结果:26
27

---------------------------------------------------------------------------------------------------------------

Double increment(H key, HK hashKey, double delta);
通过给定的delta增加散列hashKey的值(浮点数)

使用:System.out.println(template.opsForHash().get("redisHash","age"));
  System.out.println(template.opsForHash().increment("redisHash","age",1.1));
结果:27
28.1
---------------------------------------------------------------------------------------------------------------

Set<HK> keys(H key);
获取key所对应的散列表的key

使用:System.out.println(template.opsForHash().keys("redisHash1"));
//redisHash1所对应的散列表为{class=1, name=jack, age=27}
结果:[name, class, age]

---------------------------------------------------------------------------------------------------------------

Long size(H key);
获取key所对应的散列表的大小个数
使用:System.out.println(template.opsForHash().size("redisHash1"));
//redisHash1所对应的散列表为{class=1, name=jack, age=27}
结果:3
---------------------------------------------------------------------------------------------------------------

void putAll(H key, Map<? extends HK, ? extends HV> m);
使用m中提供的多个散列字段设置到key对应的散列表中

使用:Map<String,Object> testMap = new HashMap();
      testMap.put("name","jack");
      testMap.put("age",27);
      testMap.put("class","1");
      template.opsForHash().putAll("redisHash1",testMap);
      System.out.println(template.opsForHash().entries("redisHash1"));
结果:{class=1, name=jack, age=27}

---------------------------------------------------------------------------------------------------------------

void put(H key, HK hashKey, HV value);
设置散列hashKey的值
使用:template.opsForHash().put("redisHash","name","tom");
      template.opsForHash().put("redisHash","age",26);
      template.opsForHash().put("redisHash","class","6");
System.out.println(template.opsForHash().entries("redisHash"));
结果:{age=26, class="6", name=tom}

---------------------------------------------------------------------------------------------------------------

Boolean putIfAbsent(H key, HK hashKey, HV value);
仅当hashKey不存在时才设置散列hashKey的值。

使用:System.out.println(template.opsForHash().putIfAbsent("redisHash","age",30));
System.out.println(template.opsForHash().putIfAbsent("redisHash","kkk","kkk"));

结果:false
true
---------------------------------------------------------------------------------------------------------------
List<HV> values(H key);
获取整个哈希存储的值根据密钥

使用:System.out.println(template.opsForHash().values("redisHash"));
结果:[tom, 26, 6]
---------------------------------------------------------------------------------------------------------------

Map<HK, HV> entries(H key);
获取整个哈希存储根据密钥
使用:System.out.println(template.opsForHash().entries("redisHash"));
结果:{age=26, class="6", name=tom}

---------------------------------------------------------------------------------------------------------------
Cursor<Map.Entry<HK, HV>> scan(H key, ScanOptions options);
使用Cursor在key的hash中迭代,相当于迭代器。

使用:Cursor<Map.Entry<Object, Object>> curosr = template.opsForHash().scan("redisHash", ScanOptions.ScanOptions.NONE);
      while(curosr.hasNext()){
          Map.Entry<Object, Object> entry = curosr.next();
          System.out.println(entry.getKey()+":"+entry.getValue());
      }
结果:age:28.1
class:6
kkk:kkk
View Code

Redis的Set数据结构

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

public interface SetOperations<K,V>
SetOperations提供了对无序集合的一系列操作:
---------------------------------------------------------------------------------------------------------------Long add(K key, V... values);无序集合中添加元素,返回添加个数也可以直接在add里面添加多个值 如:template.opsForSet().add("setTest","aaa","bbb")
使用:String[] strarrays = new String[]{"strarr1","sgtarr2"};
      System.out.println(template.opsForSet().add("setTest", strarrays));
结果:2
---------------------------------------------------------------------------------------------------------------Long remove(K key, Object... values);移除集合中一个或多个成员
使用:String[] strarrays = new String[]{"strarr1","sgtarr2"};
System.out.println(template.opsForSet().remove("setTest",strarrays));
结果:2
---------------------------------------------------------------------------------------------------------------V pop(K key);移除并返回集合中的一个随机元素
使用:System.out.println(template.opsForSet().pop("setTest"));
System.out.println(template.opsForSet().members("setTest"));
结果:bbb
[aaa, ccc]

---------------------------------------------------------------------------------------------------------------
Boolean move(K key, V value, K destKey);将 member 元素从 source 集合移动到 destination 集合
使用:template.opsForSet().move("setTest","aaa","setTest2");
      System.out.println(template.opsForSet().members("setTest"));
      System.out.println(template.opsForSet().members("setTest2"));
结果:[ccc]
[aaa]
---------------------------------------------------------------------------------------------------------------Long size(K key);无序集合的大小长度
使用:System.out.println(template.opsForSet().size("setTest"));
结果:1

---------------------------------------------------------------------------------------------------------------Boolean isMember(K key, Object o);判断 member 元素是否是集合 key 的成员
使用:System.out.println(template.opsForSet().isMember("setTest","ccc"));
      System.out.println(template.opsForSet().isMember("setTest","asd"));
结果:true
false---------------------------------------------------------------------------------------------------------------Set<V> intersect(K key, K otherKey);
key对应的无序集合与otherKey对应的无序集合求交集
使用:System.out.println(template.opsForSet().members("setTest"));
      System.out.println(template.opsForSet().members("setTest2"));
      System.out.println(template.opsForSet().intersect("setTest","setTest2"));
结果:[aaa, ccc]
[aaa]
[aaa]
---------------------------------------------------------------------------------------------------------------
Set<V> intersect(K key, Collection<K> otherKeys);key对应的无序集合与多个otherKey对应的无序集合求交集
使用:System.out.println(template.opsForSet().members("setTest"));
        System.out.println(template.opsForSet().members("setTest2"));
        System.out.println(template.opsForSet().members("setTest3"));
        List<String> strlist = new ArrayList<String>();
        strlist.add("setTest2");
        strlist.add("setTest3");
        System.out.println(template.opsForSet().intersect("setTest",strlist));
结果:[aaa, ccc]
[aaa]
[ccc, aaa]
[aaa]
 
---------------------------------------------------------------------------------------------------------------Long intersectAndStore(K key, K otherKey, K destKey);key无序集合与otherkey无序集合的交集存储到destKey无序集合中
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
System.out.println(template.opsForSet().intersectAndStore("setTest","setTest2","destKey1"));
System.out.println(template.opsForSet().members("destKey1"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
2
[aaa, ccc]---------------------------------------------------------------------------------------------------------------Long intersectAndStore(K key, Collection<K> otherKeys, K destKey);key对应的无序集合与多个otherKey对应的无序集合求交集存储到destKey无序集合中
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
      System.out.println("setTest3:" + template.opsForSet().members("setTest3"));
      List<String> strlist = new ArrayList<String>();
      strlist.add("setTest2");
      strlist.add("setTest3");
      System.out.println(template.opsForSet().intersectAndStore("setTest",strlist,"destKey2"));
      System.out.println(template.opsForSet().members("destKey2"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
setTest3:[ccc, aaa]
2
[aaa, ccc]
---------------------------------------------------------------------------------------------------------------Long unionAndStore(K key, K otherKey, K destKey);key无序集合与otherkey无序集合的并集存储到destKey无序集合中
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
      System.out.println(template.opsForSet().unionAndStore("setTest","setTest2","unionAndStoreTest1"));
      System.out.println("unionAndStoreTest1:" + template.opsForSet().members("unionAndStoreTest1"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
4
unionAndStoreTest1:[ccc, aaa, ddd, bbb]
---------------------------------------------------------------------------------------------------------------Long unionAndStore(K key, Collection<K> otherKeys, K destKey);key无序集合与多个otherkey无序集合的并集存储到destKey无序集合中
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
      System.out.println("setTest3:" + template.opsForSet().members("setTest3"));
      List<String> strlist = new ArrayList<String>();
      strlist.add("setTest2");
      strlist.add("setTest3");
      System.out.println(template.opsForSet().unionAndStore("setTest",strlist,"unionAndStoreTest2"));
      System.out.println("unionAndStoreTest2:" + template.opsForSet().members("unionAndStoreTest2"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
setTest3:[xxx, ccc, aaa]
5
unionAndStoreTest2:[ddd, xxx, bbb, aaa, ccc]
---------------------------------------------------------------------------------------------------------------Set<V> difference(K key, K otherKey);key无序集合与otherKey无序集合的差集
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
      System.out.println(template.opsForSet().difference("setTest","setTest2"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
[bbb, ddd]
---------------------------------------------------------------------------------------------------------------Set<V> difference(K key, Collection<K> otherKeys);key无序集合与多个otherKey无序集合的差集
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
      System.out.println("setTest3:" + template.opsForSet().members("setTest3"));
      List<String> strlist = new ArrayList<String>();
      strlist.add("setTest2");
      strlist.add("setTest3");
      System.out.println(template.opsForSet().difference("setTest",strlist));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
setTest3:[xxx, ccc, aaa]
[bbb, ddd]
---------------------------------------------------------------------------------------------------------------Long differenceAndStore(K key, K otherKey, K destKey);key无序集合与otherkey无序集合的差集存储到destKey无序集合中
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
      System.out.println(template.opsForSet().differenceAndStore("setTest","setTest2","differenceAndStore1"));
      System.out.println("differenceAndStore1:" + template.opsForSet().members("differenceAndStore1"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
2
differenceAndStore1:[bbb, ddd]
---------------------------------------------------------------------------------------------------------------Long differenceAndStore(K key, Collection<K> otherKeys, K destKey);key无序集合与多个otherkey无序集合的差集存储到destKey无序集合中
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTest2:" + template.opsForSet().members("setTest2"));
      System.out.println("setTest3:" + template.opsForSet().members("setTest3"));
      List<String> strlist = new ArrayList<String>();
      strlist.add("setTest2");
      strlist.add("setTest3");
      System.out.println(template.opsForSet().differenceAndStore("setTest",strlist,"differenceAndStore2"));
      System.out.println("differenceAndStore2:" + template.opsForSet().members("differenceAndStore2"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTest2:[ccc, aaa]
setTest3:[xxx, ccc, aaa]
2
differenceAndStore2:[bbb, ddd]
---------------------------------------------------------------------------------------------------------------Set<V> members(K key);
返回集合中的所有成员
使用:System.out.println(template.opsForSet().members("setTest"));
结果:[ddd, bbb, aaa, ccc]
---------------------------------------------------------------------------------------------------------------V randomMember(K key);随机获取key无序集合中的一个元素
使用:System.out.println("setTest:" + template.opsForSet().members("setTest"));
      System.out.println("setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
      System.out.println("setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
      System.out.println("setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
      System.out.println("setTestrandomMember:" + template.opsForSet().randomMember("setTest"));
结果:setTest:[ddd, bbb, aaa, ccc]
setTestrandomMember:aaa
setTestrandomMember:bbb
setTestrandomMember:aaa
setTestrandomMember:ddd
---------------------------------------------------------------------------------------------------------------Set<V> distinctRandomMembers(K key, long count);
获取多个key无序集合中的元素(去重),count表示个数
使用:System.out.println("randomMembers:" + template.opsForSet().distinctRandomMembers("setTest",5));
结果:randomMembers:[aaa, bbb, ddd, ccc]
---------------------------------------------------------------------------------------------------------------
List<V> randomMembers(K key, long count);获取多个key无序集合中的元素,count表示个数
使用:System.out.println("randomMembers:" + template.opsForSet().randomMembers("setTest",5));
结果:randomMembers:[ccc, ddd, ddd, ddd, aaa]
---------------------------------------------------------------------------------------------------------------
Cursor<V> scan(K key, ScanOptions options);遍历set
使用:    Cursor<Object> curosr = template.opsForSet().scan("setTest", ScanOptions.NONE);
      while(curosr.hasNext()){
          System.out.println(curosr.next());
      }
结果:ddd
bbb
aaa
ccc
View Code
故乡明
原文地址:https://www.cnblogs.com/luweiweicode/p/14251941.html