Jedis操作Redis模型

本文介绍如何通过Java操作Redis数据库,包括直接操作与使用连接池的方式,并提供了字符串、列表、集合、哈希及有序集合等数据类型的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于外部程序,想要访问Redis首先需要对Redis进行两个设置
在Redis配置文件redis.conf中配置如下

1. 注释掉bang 127.0.0.1,否则只能本机访问 
2. 关闭redis的保护模式

不推荐使用new jedis这样的操作,因为操作一次都要对redis进行远程访问,会大量的消耗资源
推荐使用连接池,其中有三个非常重要的类

JedisPoolConfig:设置和读取配置文件
JedisPool:Jedis连接池
Jedis:Jedis操作对象

首先先来一个new jedis的栗子

package jedisdemo;

import redis.clients.jedis.Jedis;

/**
 * Jedis 操作 Redis
 */
public class JedisTest {

    private static Jedis jedis;

    public static void main(String[] args) {
        jedis = new Jedis("192.168.242.161", 6379);

        jedis.set("name", "zhangsan");

        String value = jedis.get("name");

        System.out.println("name = " + value);
    }
}

Console输出name = zhangsan

下面是使用连接池的栗子

package jedisdemo;

import static org.junit.Assert.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Jedis 操作 Redis(使用连接池)
 */
public class JedisPoolTest {

    private static int MAX_TOTAL = 20; // 最大连接数,默认为8,-1表示不限制
    private static int MAX_IDLE = 10; // 最大空闲连接数,默认为8
    private static int MIN_IDLE = 5; // 初始化连接数
    private static int MAX_WAIT = 10000; // 最大等待时间,单位为毫秒,默认-1,永不超时,如果超时,抛出异常 JedisConnectionException
    private static boolean TEST_ON_BORROW = true; // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;


    private static String HOST = "192.168.242.161"; // IP
    private static int PORT = 6379; // 端口,默认6379
    private static String AUTH = "admin"; // redis 密码
    private static int TIMEOUT = 1000; // 超时时间

    private static Jedis jedis = null;
    private JedisPool jedisPool = null;

    @Before
    public void init() throws Exception {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(MAX_TOTAL);
        poolConfig.setMaxIdle(MAX_IDLE);
        poolConfig.setMinIdle(MIN_IDLE);
        poolConfig.setMaxWaitMillis(MAX_WAIT);
        poolConfig.setTestOnBorrow(TEST_ON_BORROW);

        // 如果有密码,需要设置
        // JedisPool jedisPool = new JedisPool(poolConfig, HOST, PORT, TIMEOUT, AUTH);

        jedisPool  = new JedisPool(poolConfig, HOST, PORT);

        jedis = jedisPool .getResource();
    }

    // Redis String 字符串
    @Test
    public void testString() throws Exception {
        // set get
        jedis.set("address", "HeBei");
        System.out.println("address = " + jedis.get("address"));

        // append
        jedis.append("address", " tangsan");
        System.out.println("address = " + jedis.get("address"));

        // del
        jedis.del("address");
        System.out.println("address = " + jedis.get("address"));
    }

    // Redis List 列表
    @Test
    public void testList() throws Exception {
        // lpush lrange
         jedis.lpush("dblist", "mysql", "oracle", "db2");
         System.out.println("dblist = " + jedis.lrange("dblist", 0, -1));

        // rpush lrange
        jedis.rpush("dblist", "mongodb", "redis");
        System.out.println("dblist = " + jedis.lrange("dblist", 0, -1));

        // lpop lrange
        jedis.lpop("dblist");
        System.out.println("dblist = " + jedis.lrange("dblist", 0, -1));

        // llen
        System.out.println(jedis.llen("dblist"));
    }

    // Redis Set 无序集合
    @Test
    public void testSet() throws Exception {
        // sadd smembers
        jedis.sadd("myset", "peach", "pear", "banana");
        System.out.println("myset = " + jedis.smembers("myset"));

        // srem smembers
        jedis.srem("myset", "banana");
        System.out.println("myset = " + jedis.smembers("myset"));

        // scard
        System.out.println(jedis.scard("myset"));
    }

    // Redis Hash 哈希
    @Test
    public void testHash() throws Exception {
        // hset
        Map<String, String> hash = new HashMap<String, String>();
        hash.put("name", "tom");
        hash.put("age", "20");
        hash.put("address", "ShangHai");
        jedis.hmset("user", hash);

        // hdel
        jedis.hdel("user", "address");

        // hexists
        System.out.println(jedis.hexists("user", "address"));

        // hkeys 
        Set<String> hkeys = jedis.hkeys("user");
        for (String str : hkeys) {
            System.out.println(str);
        }

        // hvals
        List<String> hvals = jedis.hvals("user");
        for (String str : hvals) {
            System.out.println(str);
        }

        // hgetall
        Map<String, String> map = jedis.hgetAll("user");
        for(Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
    }

    // Redis ZSet 有序集合
    @Test
    public void testZSet() throws Exception {
        // zadd zrange
        Map<String, Double> scoreMembers = new HashMap<String, Double>();
        scoreMembers.put("math", 90.0);
        scoreMembers.put("english", 87.5);
        scoreMembers.put("sports", 94.0);
        scoreMembers.put("music", 67.0);
        scoreMembers.put("politics", 97.0);
        jedis.zadd("score_set", scoreMembers);
        System.out.println(jedis.zrange("score_set", 0, -1));
        System.out.println(jedis.zrangeWithScores("score_set", 0, -1));

        // zrem 
        jedis.zrem("score_set", "sports");
        System.out.println(jedis.zrange("score_set", 0, -1));

        // zcard
        System.out.println(jedis.zcard("score_set"));

        // zrank
        System.out.println(jedis.zrank("score_set", "math"));
    }

    // Java对象存储到Redis(使用序列化)
    @Test
    public void testSerialize() throws Exception {
        User user = new User(1, "张三", "河北");
        jedis.set("user".getBytes(), SerializeUtil.serialize(user));
    }

    // Redis 反序列化后转为Java对象
    @Test
    public void testDeSerialize() throws Exception {
        byte[] bytes = jedis.get("user".getBytes());
        System.out.println((User)SerializeUtil.deSerialize(bytes));
    }

    // 释放资源
    @After
    public void destory() throws Exception {
        if (jedis != null) {
            jedis.close();
        }
    }
}

序列化和反序列化工具类

package jedistest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SerializeUtil {

    /**
     * 序列化对象
     */
    public static byte[] serialize(Object obj) {
        byte[] bytes = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ;
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            bytes = baos.toByteArray();
            baos.close();
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bytes;
    }

    /**
     * 反序列化对象
     */
    public static Object deSerialize(byte[] bytes) {
        Object obj = null;
        try {
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            obj = ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值