Java 操作 Redis 五种数据类型

Posted 路仁甲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }

看下结果

 

以上是关于Java 操作 Redis 五种数据类型的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot Redis五种数据类型的简单操作

StackExchange.Redis的使用 Redis五种数据类型的应用

redis 五种数据类型 基本操作

redis 五种数据类型 基本操作

redis 五种数据类型 基本操作

redis 五种数据类型 基本操作