RedisTemplate操作Redis數據結構-鏈表類型 (linked-list)


鏈表結構是Redis中一個常用的結構,他可以存儲多個字符串,而且是有序的。Redis鏈表是雙向的,因此可以從左到右也可以從右到左遍歷它存儲的節點。使用鏈表結構就意味着讀性能的喪失,其優勢在於插入和刪除的便利。

SpringBoot中使用RedisTemplate執行Redis基本命令

在application.properties或application.yml文件中配置Redis

spring:
  redis:
    host: 127.0.0.1
    port: 6379

編寫代碼

package com.heaven.redis;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisListCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.Jedis;

import java.io.UnsupportedEncodingException;
import java.util.*;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
class RedisApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;
    @Test
    void testLinkedList() {
        //設置生成key value的序列化策略
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);

        //刪除list以便反復測試()
        redisTemplate.delete("list");
        //將node3從左邊插入鏈表(lpush)
        redisTemplate.opsForList().leftPush("list","node3");
        List<String> nodeList = new ArrayList<>();
        for(int i=2;i>=1;i--){
            nodeList.add("node"+i);
        }
        //將多個node從左邊插入鏈表(lpush)
        redisTemplate.opsForList().leftPushAll("list",nodeList);
        //從鏈表右邊插入一個node(rpush)
        redisTemplate.opsForList().rightPush("list","node4");
        //獲取下標為0的節點(lindex)
        String node1 = (String) redisTemplate.opsForList().index("list", 0);
        log.info("node1====="+node1);
        //獲取鏈表長度(llen)
        Long size = redisTemplate.opsForList().size("list");
        log.info("size=========="+size);
        //從左邊彈出一個節點(lpop)
        String lpop = (String) redisTemplate.opsForList().leftPop("list");
        log.info("lpop=========="+lpop);
        //從右邊彈出一個節點(rpop)
        String rpop = (String) redisTemplate.opsForList().rightPop("list");
        log.info("rpop=========="+rpop);
        try {
            //在node2前插入一個節點(linsert 需要使用更為底層的命令操作)
            redisTemplate.getConnectionFactory().getConnection().lInsert("list".getBytes("utf-8"),
                    RedisListCommands.Position.BEFORE,"node2".getBytes("utf-8"),"before_node".getBytes("utf-8"));
            //在node2之后插入一個節點(linsert 需要使用更為底層的命令操作)
            redisTemplate.getConnectionFactory().getConnection().lInsert("list".getBytes("utf-8"),
                    RedisListCommands.Position.AFTER,"node2".getBytes("utf-8"),"after_node".getBytes("utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //判斷list是否存在,若存在則在左側插入節點(lpushx)
        redisTemplate.opsForList().leftPushIfPresent("list","start");
        //判斷list是否存在,若存在則在右側插入節點(rpushx)
        redisTemplate.opsForList().rightPushIfPresent("list","end");
        //獲取下標0到3的節點元素(lrange)
        List<String> ranges = redisTemplate.opsForList().range("list", 0, 10);
        for(String range : ranges){
            log.info("range========"+range);
        }
        for(int i=0;i<3;i++){
            nodeList.add("node");
        }
        //從左側插入3個值為node的節點(lpush)
        redisTemplate.opsForList().leftPushAll("list",nodeList);
        //從左到右刪除至多三個值為node的節點(lrem)
        redisTemplate.opsForList().remove("list",3,"node");
        //給鏈表下標為0的節點設置新值(lset)
        redisTemplate.opsForList().set("list",0,"new_node_value");
        log.info("nodeList==="+redisTemplate.opsForList().range("list",0,redisTemplate.opsForList().size("list")));
    }
}

 

運行結果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM