Spring Data Redis 使用

Spring Boot 2.2.1.RELEASE

添加Spring Data Redis相关依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

 <!--spring2.0集成redis所需common-pool2-->
 <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-pool2</artifactId>
     <version>2.4.2</version>
 </dependency>

 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.60</version>
 </dependency>

 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
 </dependency>

application.yml 添加Redis环境配置

spring:
  redis:
    # Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
    database: 0
    host: localhost
    port: 6379
    # 连接密码(默认为空)
    password:
    # 连接超时时间(毫秒)
    timeout: 10000ms
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-wait: -1
        # 连接池中的最大空闲连接 默认 8
        max-idle: 8
        # 连接池中的最小空闲连接 默认 0
        min-idle: 0

Spring Boot自动配置的redisTemplate是RedisTemplate<Object, Object>

可自定义redisTemplate,修改key和value的序列化器

@Configuration
public class RedisConfig {
    /**
     * Spring data Redis 自定义redisTemplate
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericFastJsonRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericFastJsonRedisSerializer());
        return template;
    }
}

测试User类

@Data
// 无参构造函数,fastjson序列化需要
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private int id;
    private String name;
}

1. 字符串 String

@SpringBootTest
public class OpsForValueTest {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * set
     * 可设置超时,偏移量等参数
     */
    @Test
    public void set() {
        redisTemplate.opsForValue().set("redisTemplate_string", "redisTemplate_value");
    }

    /**
     * 由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:25 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:26 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:27 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:28 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:29 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:30 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:31 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:32 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:33 CST 2019
     * redisTemplate_timeUnit_10 Wed Nov 27 17:05:34 CST 2019
     * cannot find
     */
    @Test
    public void setTime() throws Exception {
        redisTemplate.opsForValue().set("redisTemplate_timeUnit","redisTemplate_timeUnit_10",10, TimeUnit.SECONDS);

        while (true) {
            Object value = redisTemplate.opsForValue().get("redisTemplate_timeUnit");
            if (value != null) {
                System.out.println(value + " " + new Date());
                Thread.sleep(1000);
            } else {
                System.out.println("cannot find");
                break;
            }
        }
    }

    /**
     * get
     */
    @Test
    public void get() {
        String value = String.valueOf(redisTemplate.opsForValue().get("redisTemplate_string"));
        System.out.println(value);
    }

    /**
     * multiSet
     */
    @Test
    public void multiSet() {
        Map<String,String> map = new HashMap<>();
        map.put("redisTemplate_map_key_1", "redisTemplate_map_value_1");
        map.put("redisTemplate_map_key_2", "redisTemplate_map_value_2");
        map.put("redisTemplate_map_key_3", "redisTemplate_map_value_3");

        redisTemplate.opsForValue().multiSet(map);
    }

    /**
     * multiGet
     */
    @Test
    public void multiGet() {
        List<String> keys = new ArrayList<>();
        keys.add("redisTemplate_map_key_1");
        keys.add("redisTemplate_map_key_2");
        keys.add("redisTemplate_map_key_3");
        System.out.println(redisTemplate.opsForValue().multiGet(keys));
    }

    /**
     * getAndSet
     * 设置键的字符串值并返回其旧值
     */
    @Test
    public void getAndSet() {
        String oldValue = String.valueOf(redisTemplate.opsForValue().getAndSet("redisTemplate_string", "redisTemplate_value_new"));
        System.out.println(oldValue);
    }

    /**
     * increment
     * 自增,再调用自增1
     */
    @Test
    public void incrementSet() {
        stringRedisTemplate.opsForValue().increment("stringTemplate_increment", 1);
    }

    /**
     * 用stringRedisTemplate,在fastJSON转 set
     */
    @Test
    public void setObject() {
        User user = new User(1, "张三");
        stringRedisTemplate.opsForValue().set("stringTemplate_object", JSON.toJSONString(user));
    }

    /**
     * 用stringRedisTemplate,在fastJSON转 get
     */
    @Test
    public void getObject() {
        String userJson = stringRedisTemplate.opsForValue().get("stringTemplate_object");
        User user = JSON.parseObject(userJson, new TypeReference<User>(){});
        System.out.println(user);
    }

    /**
     * 用redisTemplate,value使用fastJSON转 set
     */
    @Test
    public void setFastJsonObject() {
        User user = new User(2, "李四");
        redisTemplate.opsForValue().set("redisTemplate_object", user);
    }

    /**
     * 用redisTemplate,value使用fastJSON转 get
     */
    @Test
    public void getFastJsonObject() {
        User user = (User)redisTemplate.opsForValue().get("redisTemplate_object");
        System.out.println(user);
    }

}

2. 字典 Hash

@SpringBootTest
public class OpsForHashTest {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * put
     * {redisTemplate_hash_key_1=redisTemplate_hash_value_1, redisTemplate_hash_key_2=redisTemplate_hash_value_2, redisTemplate_hash_key_3=redisTemplate_hash_value_3}
     */
    @Test
    public void put() {
        redisTemplate.opsForHash().put("redisTemplate_hash", "redisTemplate_hash_key_1", "redisTemplate_hash_value_1");
        redisTemplate.opsForHash().put("redisTemplate_hash", "redisTemplate_hash_key_2", "redisTemplate_hash_value_2");
        redisTemplate.opsForHash().put("redisTemplate_hash", "redisTemplate_hash_key_3", "redisTemplate_hash_value_3");
    }

    /**
     * putAll
     * {redisTemplate_hash_key_1=redisTemplate_hash_value_1, redisTemplate_hash_key_2=redisTemplate_hash_value_2, redisTemplate_hash_key_3=redisTemplate_hash_value_3,
     * redisTemplate_hash_all_key_1=redisTemplate_hash_all_value_1, redisTemplate_hash_all_key_2=redisTemplate_hash_all_value_2}
     */
    @Test
    public void putAll() {
        Map<String, Object> map = new HashMap<>();
        map.put("redisTemplate_hash_all_key_1", "redisTemplate_hash_all_value_1");
        map.put("redisTemplate_hash_all_key_2", "redisTemplate_hash_all_value_2");

        redisTemplate.opsForHash().putAll("redisTemplate_hash", map);
    }

    /**
     * entries
     * 获取键值对
     */
    @Test
    public void entries() {
        System.out.println(redisTemplate.opsForHash().entries("redisTemplate_hash"));
    }

    /**
     * 迭代器
     *
     * redisTemplate_hash_key_1:redisTemplate_hash_value_1
     * redisTemplate_hash_key_2:redisTemplate_hash_value_2
     * redisTemplate_hash_key_3:redisTemplate_hash_value_3
     */
    @Test
    public void scan() {
        Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan("redisTemplate_hash", ScanOptions.NONE);
        while(cursor.hasNext()){
            Map.Entry<Object, Object> entry = cursor.next();
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

}

3. 列表 List

@SpringBootTest
public class OpsForListTest {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * leftPush
     * 左插入
     * [redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_1]
     */
    @Test
    public void leftPush() {
        redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_1");
        redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_2");
        redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_3");
    }

    /**
     * leftPush
     * 插入到该值的左边
     * [redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_leftPushPivot, redisTemplate_lpush_1]
     */
    @Test
    public void leftPushPivot() {
        redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_1", "redisTemplate_lpush_leftPushPivot");
    }

    /**
     * leftPushAll
     * list 直接左插入一个list,后面有值也不是添加在原有的list中
     * [redisTemplate_lpush_4, [redisTemplate_lpush_list_1, redisTemplate_lpush_list_2, redisTemplate_lpush_list_3], redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_1]
     */
    @Test
    public void leftPushAllList() {
        redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_1");
        redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_2");
        redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_3");

        List<String> list = new ArrayList<>();
        list.add("redisTemplate_lpush_list_1");
        list.add("redisTemplate_lpush_list_2");
        list.add("redisTemplate_lpush_list_3");

        redisTemplate.opsForList().leftPushAll("redisTemplate_lpush_list",list);

        redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_4");
    }

    /**
     * leftPushAll
     * array 直接左插入在原有list之中
     * [redisTemplate_lpush_Array_3, redisTemplate_lpush_Array_2, redisTemplate_lpush_Array_1, redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_1]
     */
    @Test
    public void leftPushAllArray() {
        String[] array = {
                "redisTemplate_lpush_Array_1",
                "redisTemplate_lpush_Array_2",
                "redisTemplate_lpush_Array_3"
        };

        redisTemplate.opsForList().leftPushAll("redisTemplate_lpush",array);
    }

    /**
     * leftPushIfPresent
     * 向左插入(如果存在)
     * 只有key存在,才插入
     * 0
     * 0
     * 1
     * 2
     * [bb, aa]
     */
    @Test
    public void leftPushIfPresent() {
        System.out.println(redisTemplate.opsForList().leftPushIfPresent("leftPushIfPresent","aa"));
        System.out.println(redisTemplate.opsForList().leftPushIfPresent("leftPushIfPresent","bb"));


        System.out.println(redisTemplate.opsForList().leftPush("leftPushIfPresent","aa"));
        System.out.println(redisTemplate.opsForList().leftPushIfPresent("leftPushIfPresent","bb"));
    }

    /**
     * 删除并返回最左边的值
     * [bb, aa]
     * bb
     */
    @Test
    public void leftPop() {
        System.out.println(redisTemplate.opsForList().leftPop("leftPushIfPresent"));
    }

    /**
     * rightPush
     * 右插入
     * [redisTemplate_rpush_1, redisTemplate_rpush_2, redisTemplate_rpush_3]
     */
    @Test
    public void rightPush() {
        redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_1");
        redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_2");
        redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_3");
    }

    /**
     * rightPush
     * 插入到该值的右边
     * [redisTemplate_rpush_1, redisTemplate_rpush_rightPushPivot, redisTemplate_rpush_2, redisTemplate_rpush_3]
     */
    @Test
    public void rightPushPivot() {
        redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_1", "redisTemplate_rpush_rightPushPivot");
    }

    /**
     * rightPushAll
     * list 直接右插入一个list,后面有值也不是添加在原有的list中
     * [redisTemplate_rpush_1, redisTemplate_rpush_2, redisTemplate_rpush_3, [redisTemplate_rpush_list_1, redisTemplate_rpush_list_2, redisTemplate_rpush_list_3], redisTemplate_rpush_4]
     */
    @Test
    public void rightPushAllList() {
        redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_1");
        redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_2");
        redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_3");

        List<String> list = new ArrayList<>();
        list.add("redisTemplate_rpush_list_1");
        list.add("redisTemplate_rpush_list_2");
        list.add("redisTemplate_rpush_list_3");

        redisTemplate.opsForList().rightPushAll("redisTemplate_rpush_list",list);

        redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_4");
    }

    /**
     * rightPushAll
     * array 直接右插入在原有list之中
     * [redisTemplate_rpush_1, redisTemplate_rpush_2, redisTemplate_rpush_3, redisTemplate_rpush_Array_1, redisTemplate_rpush_Array_2, redisTemplate_rpush_Array_3]
     */
    @Test
    public void rightPushAllArray() {
        String[] array = {
                "redisTemplate_rpush_Array_1",
                "redisTemplate_rpush_Array_2",
                "redisTemplate_rpush_Array_3"
        };

        redisTemplate.opsForList().rightPushAll("redisTemplate_rpush",array);
    }

    /**
     * rightPushIfPresent
     * 向右插入(如果存在)
     * 只有key存在,才插入
     * 0
     * 0
     * 1
     * 2
     * [aa, bb]
     */
    @Test
    public void rightPushIfPresent() {
        System.out.println(redisTemplate.opsForList().rightPushIfPresent("rightPushIfPresent","aa"));
        System.out.println(redisTemplate.opsForList().rightPushIfPresent("rightPushIfPresent","bb"));

        System.out.println(redisTemplate.opsForList().rightPush("rightPushIfPresent","aa"));
        System.out.println(redisTemplate.opsForList().rightPushIfPresent("rightPushIfPresent","bb"));
    }

    /**
     * [bb, cc, cc]
     * cc
     */
    @Test
    public void rightPop() {
        System.out.println(redisTemplate.opsForList().rightPop("rightPushIfPresent"));
    }

    /**
     * 根据index替换值
     * [aa, cc]
     */
    @Test
    public void set() {
        redisTemplate.opsForList().set("rightPushIfPresent",1, "cc");
    }

    /**
     * 根据count次数,删除查找到的值
     *
     * count > 0,删除从头到尾移动的值的元素。
     * count < 0,删除等于从尾到头移动的值的元素。
     * count = 0,删除等于value的所有元素。
     *
     * [aa, aa, bb, cc, cc]
     * [bb, cc, cc]
     */
    @Test
    public void remove() {
        // 删除列表中存储的两次出现的值 aa
        redisTemplate.opsForList().remove("rightPushIfPresent",2, "aa");
    }

    /**
     * range
     */
    @Test
    public void range() {
        List<Object> list = redisTemplate.opsForList().range("rightPushIfPresent", 0, 10);
        System.out.println(list);
    }

}

4. 集合 Set

@SpringBootTest
public class OpsForSetTest {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * [redisTemplate_set_3, redisTemplate_set_2, redisTemplate_set_1]
     */
    @Test
    public void add() {
        redisTemplate.opsForSet().add("redisTemplate_set", "redisTemplate_set_1", "redisTemplate_set_2", "redisTemplate_set_3");
    }

    /**
     * intersect
     * 交集
     * 可设置keyList,对多个进行交集
     *
     * intersectAndStore
     * 交集保存到另一个set中
     *
     * [redisTemplate_intersect_3, redisTemplate_intersect_2]
     */
    @Test
    public void intersect() {
        redisTemplate.opsForSet().add("redisTemplate_intersect_1", "redisTemplate_intersect_1", "redisTemplate_intersect_2", "redisTemplate_intersect_3");
        redisTemplate.opsForSet().add("redisTemplate_intersect_2", "redisTemplate_intersect_2", "redisTemplate_intersect_3");

        System.out.println(redisTemplate.opsForSet().intersect("redisTemplate_intersect_1", "redisTemplate_intersect_2"));
    }

    /**
     * union
     * 并集
     *
     * [redisTemplate_union_4, redisTemplate_union_1, redisTemplate_union_3, redisTemplate_union_2]
     */
    @Test
    public void union() {
        redisTemplate.opsForSet().add("redisTemplate_union_1", "redisTemplate_union_1", "redisTemplate_union_2", "redisTemplate_union_3");
        redisTemplate.opsForSet().add("redisTemplate_union_2", "redisTemplate_union_2", "redisTemplate_union_4");

        System.out.println(redisTemplate.opsForSet().union("redisTemplate_union_1", "redisTemplate_union_2"));
    }

    /**
     * difference
     * 差集
     *
     * [redisTemplate_difference_1, redisTemplate_difference_3]
     * [redisTemplate_difference_4]
     */
    @Test
    public void difference() {
        redisTemplate.opsForSet().add("redisTemplate_difference_1", "redisTemplate_difference_1", "redisTemplate_difference_2", "redisTemplate_difference_3");
        redisTemplate.opsForSet().add("redisTemplate_difference_2", "redisTemplate_difference_2", "redisTemplate_difference_4");

        System.out.println(redisTemplate.opsForSet().difference("redisTemplate_difference_1", "redisTemplate_difference_2"));
        System.out.println(redisTemplate.opsForSet().difference("redisTemplate_difference_2", "redisTemplate_difference_1"));
    }

    /**
     * 迭代器
     *
     * redisTemplate_set_3
     * redisTemplate_set_2
     * redisTemplate_set_1
     */
    @Test
    public void scan() {
        Cursor<Object> cursor = redisTemplate.opsForSet().scan("redisTemplate_set", ScanOptions.NONE);
        while(cursor.hasNext()){
            System.out.println(cursor.next());
        }
    }

    /**
     * 获取members
     */
    @Test
    public void members() {
        System.out.println(redisTemplate.opsForSet().members("redisTemplate_set"));
    }

}

5. 有序集合 Sorted Set

@SpringBootTest
public class OpsForZSetTest {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * add
     *
     * [redisTemplate_zset_2, redisTemplate_zset_1]
     */
    @Test
    public void add() {
        ZSetOperations.TypedTuple<Object> objectTypedTuple1 = new DefaultTypedTuple<>("redisTemplate_zset_1",2.0);
        ZSetOperations.TypedTuple<Object> objectTypedTuple2 = new DefaultTypedTuple<>("redisTemplate_zset_2",1.0);

        Set<ZSetOperations.TypedTuple<Object>> tuples = new HashSet<>();
        tuples.add(objectTypedTuple1);
        tuples.add(objectTypedTuple2);

        redisTemplate.opsForZSet().add("redisTemplate_zset",tuples);
    }

    /**
     * incrementScore
     * 增加score,改变排序
     * [redisTemplate_zset_1, redisTemplate_zset_2]
     */
    @Test
    public void incrementScore() {
        redisTemplate.opsForZSet().incrementScore("redisTemplate_zset", "redisTemplate_zset_2", 1.1);
    }

    /**
     * range
     */
    @Test
    public void range() {
        System.out.println(redisTemplate.opsForZSet().range("redisTemplate_zset",0,10));
    }

    /**
     * rangeWithScores
     * 根据分数递增返回zset
     * value:redisTemplate_zset_1score:2.0
     * value:redisTemplate_zset_2score:2.1
     */
    @Test
    public void rangeWithScores() {
        Set<ZSetOperations.TypedTuple<Object>> tuples = redisTemplate.opsForZSet().rangeWithScores("redisTemplate_zset",0,10);
        Iterator<ZSetOperations.TypedTuple<Object>> iterator = tuples.iterator();

        while (iterator.hasNext()){
            ZSetOperations.TypedTuple<Object> typedTuple = iterator.next();
            System.out.println("value:" + typedTuple.getValue() + "score:" + typedTuple.getScore());
        }
    }

    /**
     * 迭代器
     * redisTemplate_zset_1:2.0
     * redisTemplate_zset_2:2.1
     */
    @Test
    public void scan() {
        Cursor<ZSetOperations.TypedTuple<Object>> cursor = redisTemplate.opsForZSet().scan("redisTemplate_zset", ScanOptions.NONE);
        while (cursor.hasNext()){
            ZSetOperations.TypedTuple<Object> item = cursor.next();
            System.out.println(item.getValue() + ":" + item.getScore());
        }
    }

}

6. 基数统计 HyperLogLog

@SpringBootTest
public class HyperLogLogTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 3
     */
    @Test
    public void addTest(){
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value1");
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value1");
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value2");
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value3");
    }

    /**
     * 3
     */
    @Test
    public void add2Test(){
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value3");
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value4");
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value4");
        stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value5");
    }

    /**
     * 将多个 HyperLogLog 合并为一个 HyperLogLog
     */
    @Test
    public void unionTest(){
        stringRedisTemplate.opsForHyperLogLog().union("hyperLogLog","hyperLogLog1","hyperLogLog2");
    }

    /**
     * 5
     */
    @Test
    public void sizeTest(){
        System.out.println(stringRedisTemplate.opsForHyperLogLog().size("hyperLogLog"));
    }

}

7. 发布订阅 pub/sub

application.yml 添加配置

server:
  port: 8123

redis-channel: redischat

新建一个配置类,添加消息监听容器;亦可在RedisConfig中添加

@Configuration
public class RedisPubSubConfig {

    private static String REDIS_CHANNEL;

    @Value("${redis-channel:'redischat'}")
    public void setUseRedisChannel(String redisChannel) {
        REDIS_CHANNEL = redisChannel;
    }

    /**
     * spring data Redis 添加消息监听容器,用于pub/sub
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic(REDIS_CHANNEL));
        return container;
    }

}

添加订阅方

@Component
public class Subscriber extends MessageListenerAdapter {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        byte[] body = message.getBody();
        byte[] channel = message.getChannel();
        String msg = stringRedisTemplate.getStringSerializer().deserialize(body);
        String topic = stringRedisTemplate.getStringSerializer().deserialize(channel);
        System.out.println("监听到topic为" + topic + "的消息:" + msg);
    }

}

启动application,用测试类向该channel发消息

@SpringBootTest
public class PubSubTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static String REDIS_CHANNEL;

    @Value("${redis-channel:'redischat'}")
    public void setUseRedisChannel(String redisChannel) {
        REDIS_CHANNEL = redisChannel;
    }

    @Test
    public void pubTest() {
        stringRedisTemplate.convertAndSend(REDIS_CHANNEL, "redis pub/sub test");
    }

}

成功获取并打印消息
打印消息

8. 事务

@SpringBootTest
public class TransactionTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 事务
     * 
     * resultList 为命令执行结果:
     * true
     * true
     * value1
     */
    @Test
    public void transactionTest() {
        List<Object> resultList = stringRedisTemplate.execute(new SessionCallback<List<Object>>() {
            public List<Object> execute(RedisOperations operations) throws DataAccessException {
                StringRedisTemplate stringRedisTemplate = (StringRedisTemplate)operations;

                stringRedisTemplate.multi();
                stringRedisTemplate.opsForValue().set("transaction1", "value1");
                stringRedisTemplate.opsForValue().set("transaction2", "value2");
                operations.opsForValue().get("transaction1");

                return stringRedisTemplate.exec();
            }
        });
    }
}

9. 管道 pipeline

@SpringBootTest
public class PipelineTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * pipeline
     * 
     * resultList 为命令执行结果:
     * true
     * true
     * true
     * value3
     */
    @Test
    public void pipelineTest(){
        List<Object> resultList = stringRedisTemplate.executePipelined(new RedisCallback<Object>() {
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection stringRedisConnection = (StringRedisConnection)connection;

                stringRedisConnection.set("pipeline1", "value1");
                stringRedisConnection.set("pipeline2", "value2");
                stringRedisConnection.set("pipeline2", "value3");

                stringRedisConnection.get("pipeline2");

                return null;
            }
        });
    }
}

参考:
Spring Data Redis 文档
spring-data-redis 2.0 的使用示例代码
spring boot通过Spring Data Redis集成redis
如何使用RedisTemplate访问Redis数据结构
SpringBoot中使用redis事务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值