Java中使用Jedis操作redis

本文介绍如何使用Java操作Redis数据库,包括字符串、列表的基本操作及示例代码,并实现了一个简单的Redis连接池。

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

一、下载jar包

可以在MAVEN仓库中下载所需的jar包
http://mvnrepository.com/artifact/redis.clients/jedis这是路径
如果需要使用jedis连接池的话需要commons-pool2,这个是Apache开发的
我是从http://www.mvnjar.com/中下载的,可以在这里下载到源码包,对于一些比较喜欢看源码的小伙伴比较有用

二、操作

public void stringTest() {
        Jedis jedis = JedisUtil.getInstance().getJedis();
        try {
            // 设置指定 key 的值
            jedis.set("strTest", "String");
            // 获取指定 key 的值
            System.out.println(jedis.get("strTest"));
            // 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
            System.out.println(jedis.getSet("strTest", "Test"));
            // 获取所有(一个或多个)给定 key 的值。
            System.out.println(jedis.mget("email", "strTest"));
            // 对某个键设置过期时间
            jedis.expire("strTest", 15);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭连接
            JedisUtil.getInstance().closeJedis(jedis);
        }
    }
public void listTest() {
        Jedis jedis = JedisUtil.getInstance().getJedis();
        try {
            // 设置指定 key 的值,将一个或多个值插入到列表头部(没有就创建一个key,有则添加在头部)
             jedis.lpush("strList", "String1", "String2", "String3","String4", "String5");
            // 获取指定列表长度
            System.out.println(jedis.llen("strList"));
            // 获取指定 ListKey的值,从开始start开始,向后面取出stop个值
            System.out.println(jedis.lrange("strList", 1, 5));
            // 若超出则没有数据,不会报错
            System.out.println(jedis.lrange("strList", 15, 5));
            // 取出第几个索引值(索引从0开始)
            System.out.println(jedis.lindex("strList", 0));
            // 为第几个索引赋值(替换)
            jedis.lset("strList", 3, "three");
            // 超出索引的会报错(索引从0开始)
            jedis.lset("strList", 9, "ten");// ERR index out of range
            // 移出并获取列表的第一个元素
            System.out.println(jedis.lpop("strList"));
            // 移出并获取列表的最后一个元素
            System.out.println(jedis.rpop("strList"));
            // 在键的尾部插入值,并返回键的长度
            System.out.println(jedis.rpush("strList", "may", "be"));

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭连接
            JedisUtil.getInstance().closeJedis(jedis);
        }
    }

还有一个map的就不贴出来了,小伙伴自己去研究
下面是Redis连接池:

package com.jie.util;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

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

public class JedisUtil {
    /**
     * 私有构造器
     */
    private JedisUtil() {
    }

    /**
     * 全局的Map
     */
    private static Map<String, JedisPool> maps = new HashMap<String, JedisPool>();

    /**
     * @Description 获取连接池
     * @auth weishujie
     * @creattime 2017年8月18日上午10:52:30
     * @param ip
     * @param port
     * @return
     */
    private static JedisPool getPool(String ip, int port) {
        String key = ip + ":" + port;// jedis的地址
        JedisPool pool = null;
        if (!maps.containsKey(key)) {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL);
            config.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE);
            config.setMaxWaitMillis(GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS);
            config.setTestOnBorrow(true);
            config.setTestOnReturn(true);
            try {
                pool = new JedisPool(config, ip, port);
                maps.put(key, pool);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            pool = maps.get(key);
        }
        return pool;
    }

    /**
     * @Description 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 
     *                  没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。 
     * @author weishujie
     * @data 2017年8月18日上午11:54:30
     */
    private static class RedisUtilHolder {
        /** 
         * 静态初始化器,由JVM来保证线程安全 
         */
        private static JedisUtil instance = new JedisUtil();
    }

    /** 
     * 当getInstance方法第一次被调用的时候,它第一次读取 
     * RedisUtilHolder.instance,导致RedisUtilHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,
     * 从而创建RedisUtil的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。 
     * 这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。 
     */
    public static JedisUtil getInstance() {
        return RedisUtilHolder.instance;
    }

    /**
     * @Description 获取Jedis
     * @auth weishujie
     * @creattime 2017年8月18日下午12:06:51
     * @param ip
     * @param port
     * @return
     */
    public Jedis getJedis(String ip, int port) {
        Jedis jedis = null;
        int count = 0;
        do {
            jedis = getPool(ip, port).getResource();
            count++;
        } while (jedis == null && count < 3);// 重启三次,三次获取不到就结束
        return jedis;
    }

    /**
     * @Description 获取默认的Jedis
     * @auth weishujie
     * @creattime 2017年8月18日下午2:34:09
     * @return
     */
    public Jedis getJedis() {
        return getJedis(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT);
    }

    /**
     * @Description 释放Jdeis到连接池
     * @auth weishujie
     * @creattime 2017年8月18日下午2:16:55
     * @param jedis
     * @param ip
     * @param port
     */
    @SuppressWarnings("deprecation")
    public void closeJedis(Jedis jedis, String ip, int port) {
        if (jedis != null) {
            getPool(ip, port).returnResource(jedis);
        }
    }

    /**
     * @Description 直接关闭连接
     * @auth weishujie
     * @creattime 2017年8月18日下午2:36:57
     * @param jedis
     */
    public void closeJedis(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值