Java 操作 Redis 五種數據類型


項目添加依賴

     <!-- Redis 依賴 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
            

Java 怎么連接 Redis

//連接 Redis
    @Test
    public void initConn01(){
        System.out.println("==========================");
        System.out.println("==========================");
        System.out.println("==========================");
        // 創建 jedis 對象,連接 redis 服務
        Jedis jedis=new Jedis("192.168.75.163",6379);
        // 設置認證密碼
        //jedis.auth("root");
        // 指定數據庫 默認是 0
        jedis.select(1);
        // 使用 ping 命令,測試連接是否成功
        String result=jedis.ping();
        System.out.println(result);// 返回 PONG
        // 添加一條數據
        jedis.set("username","zhangsan");
        // 獲取一條數據
        String username=jedis.get("username");
        System.out.println(username);
        // 釋放資源
        if(jedis!=null){
            jedis.close();
        }
    }

看下輸出結果

 

 

 通過 Redis 連接池獲取連接對象並操作服務器

private String host ="192.168.75.163";
private Integer port=6379;
@Test
    public void initConn02() {
        // 初始化 redis 客戶端連接池
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), host, port, 10000);
        // 從連接池獲取連接
        Jedis jedis = jedisPool.getResource();
        // 指定數據庫 默認是 0
        jedis.select(2);
        // 使用 ping 命令,測試連接是否成功
        String result = jedis.ping();
        System.out.println(result);// 返回 PONG
        // 添加一條數據
        jedis.set("username", "zhangsan");
        // 獲取一條數據
        String username = jedis.get("username");
        System.out.println(username);
        // 釋放資源
        if (jedis != null)
            jedis.close();
    }

封裝 JedisUtil 對外提供連接對象獲取方法

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
 * 實例化 Jedis 對象工具類
 */
public final class JedisUtil {
    //Redis 服務器 IP
    private static String ADDR = "192.168.75.163";
    //Redis 的端口號
    private static int PORT = 6379;
    //訪問密碼
    private static String AUTH = "root";
    //可用連接實例的最大數目,默認值為 8;
    //如果賦值為-1,則表示不限制;如果 pool 已經分配了 maxActive 個 jedis 實例,則此時 pool 的狀態為 exhausted(耗盡)。
    private static int MAX_ACTIVE = 1024;
    //控制一個 pool 最多有多少個狀態為 idle(空閑的)的 jedis 實例,默認值也是 8。
    private static int MAX_IDLE = 200;
    //等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。如果超過等待時間,則直接拋出 JedisConnectionException;
    private static int MAX_WAIT = 10000;
    private static int TIMEOUT = 10000;
    //在 borrow 一個 jedis 實例時,是否提前進行 validate 操作;如果為 true,則得到的 jedis 實例均是可用的;
    private static boolean TEST_ON_BORROW = true;
    private static JedisPool jedisPool = null;
    /**
     * 初始化 Redis 連接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            //jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 獲取 Jedis 實例
     *
     * @return
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null)
                return jedisPool.getResource();
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 釋放 jedis 資源
     *
     * @param jedis
     */
    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.close();
        }
    }
}

Java 操作 Redis 五種數據類型

連接與釋放

Jedis jedis = null;
    /**
     * 連接 Redis
     */
    @Before
    public void initConn() {
        jedis = JedisUtil.getJedis();
    }
    /**
     * 釋放資源
     */
    @After
    public void close() {
        JedisUtil.returnResource(jedis);
    }

1、操作 String

  @Test
    public void testString() {
        // 添加一條數據
        jedis.set("username", "zhangsan");
        jedis.set("age", "18");
        // 添加多條數據 參數奇數為 key 參數偶數為 value
        jedis.mset("address", "bj", "sex", "1");
        // 獲取一條數據
        String username = jedis.get("username");
        System.out.println(username);
        // 獲取多條數據
        List<String> list = jedis.mget("username", "age", "address", "sex");
        for (String str : list) {
            System.out.println(str);
        }
        // 刪除
        //jedis.del("username");
    }

看下結果

 

 

 

2、操作 hash

@Test
    public void testHash() {
        /*
         * 添加一條數據
         * 參數一:redis 的 key
         * 參數二:hash 的 key
         * 參數三:hash 的 value
         */
        jedis.hset("userInfo", "name", "lisi");
        // 添加多條數據
        Map<String, String> map = new HashMap<>();
        map.put("age", "20");
        map.put("sex", "1");
        jedis.hmset("userInfo", map);
        // 獲取一條數據
        String name = jedis.hget("userInfo", "name");
        System.out.println(name);
        // 獲取多條數據
        List<String> list = jedis.hmget("userInfo", "age", "sex");
        for (String str : list) {
            System.out.println(str);
        }
        // 獲取 Hash 類型所有的數據
        Map<String, String> userMap = jedis.hgetAll("userInfo");
        for (Map.Entry<String, String> userInfo : userMap.entrySet()) {
            System.out.println(userInfo.getKey() + "--" + userInfo.getValue());
        }
        // 刪除 用於刪除 hash 類型數據
        //jedis.hdel("userInfo", "name");
    }

看下結果

 

 

 3、操作 list

@Test
    public void testList() {
        // 左添加(上)
        jedis.lpush("students", "Wang Wu", "Li Si");
        // 右添加(下)
        jedis.rpush("students", "Zhao Liu");
        // 獲取 start 起始下標 end 結束下標 包含關系
        List<String> students = jedis.lrange("students", 0, 2);
        for (String stu : students) {
            System.out.println(stu);
        }
        // 獲取總條數
        Long total = jedis.llen("students");
        System.out.println("總條數:" + total);
        // 刪除單條 刪除列表中第一次出現的 Li Si
        // jedis.lrem("students", 1, "Li Si");
        // 刪除多條
        // jedis.del("students");
    }

看下結果

 

 

 

4、操作 set

@Test
    public void testSet() {
        // 添加數據
        jedis.sadd("letters", "aaa", "bbb", "ccc", "ddd", "eee");
        // 獲取數據
        Set<String> letters = jedis.smembers("letters");
        for (String letter: letters) {
            System.out.println(letter);
        }
        // 刪除
        //jedis.srem("letters", "aaa", "bbb");
    }

看下結果

 

 

 

5、操作 sorted set -有序

@Test
    public void testSortedSet() {
        Map<String, Double> scoreMembers = new HashMap<>();
        scoreMembers.put("zhangsan", 99D);
        scoreMembers.put("lisi", 96D);
        scoreMembers.put("wangwu", 92D);
        scoreMembers.put("zhaoliu", 100D);
        scoreMembers.put("tianqi", 95D);
        // 添加數據
        jedis.zadd("score", scoreMembers);
        // 獲取數據
        Set<String> scores = jedis.zrange("score", 0, 4);
        for (String score: scores) {
            System.out.println(score);
        }
        // 獲取總條數
        Long total = jedis.zcard("score");
        System.out.println("總條數:" + total);
        // 刪除
        //jedis.zrem("score", "zhangsan", "lisi");
    }

看下結果

 

 

 6、Redis 中以層級關系、目錄形式存儲數據

@Test
    public void test() {
        // Redis 中以層級關系、目錄形式存儲數據
        jedis.set("user:01", "user_zhangsan");
        jedis.set("user:02", "user_lisi");
        System.out.println(jedis.get("user:01"));
    }

看下結果

 

 

 

 

 

 7、獲取所有 key&事務&刪除

// 獲取所有 key
    @Test
    public void testAllKeys() {
        // 當前庫 key 的數量
        System.out.println(jedis.dbSize());
        // 當前庫 key 的名稱
        Set<String> keys = jedis.keys("*");
        for (String key: keys) {
            System.out.println(key);
        }
    }
    // 操作事務
    @Test
    public void testMulti() {
        Transaction tx = jedis.multi();
        // 開啟事務
        tx.set("tel", "10010");
        // 提交事務
        // tx.exec();
        // 回滾事務
        tx.discard();
    }
    // 刪除
    @Test
    public void testDelete() {
        // 刪除 通用 適用於所有數據類型
        jedis.del("score");
    }

8、操作 byte

實體類user

import java.io.Serializable;
public class User implements Serializable {
    private static final long serialVersionUID = 9148937431079191022L;
    private Integer id;
    private String username;
    private String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

序列化工具類

/**
 * 序列化工具類
 */
public class SerializeUtil {

    /**
     * 將 java 對象轉換為 byte 數組 序列化過程
     */
    public static byte[] serialize(Object object) {
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            // 序列化
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 將 byte 數組轉換為 java 對象 反序列化
     */
    public static Object unserialize(byte[] bytes) {
        if(bytes == null)return null;
        ByteArrayInputStream bais = null;
        try {
            // 反序列化
            bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
操作 byte
@Test
    public void testByte() {
        User user = new User();
        user.setId(2);
        user.setUsername("zhangsan");
        user.setPassword("123");
        // 序列化
        byte[] userKey = SerializeUtil.serialize("user:" + user.getId());
        byte[] userValue = SerializeUtil.serialize(user);
        jedis.set(userKey, userValue);
        // 獲取數據
        byte[] userResult = jedis.get(userKey);
        // 反序列化
        User u = (User) SerializeUtil.unserialize(userResult);
        System.out.println(u);
    }

看下結果

 


免責聲明!

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



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