13Spring中使用Jedis操作redis

Redis是一款开源的内存KV存储,相比较于membercached只有一种数据结构,redis支持多种数据结构。

Spring对Redis的支持

Spring中通过Spring Data Redis这个模块实现对Redis的支持。操作Redis的方式有以下几种:

  • 支持的客户端 Jedis / Lettuce
  • RedisTemplate
  • Repository支持

Jedis客户端的简单使用

  • Jedis的实例不是线程安全的,也就是在多线程场景下,不能使用同一个Jedis实例。
  • 通过JedisPool中维护Jedis实例,当需要使用的时候从JedisPool中获取Jedis实例。
  • 获取到Jedis实例之后进行对应业务方法的调用

talk is easy ,show me the code

引入Jedis依赖

<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

配置创建JedisPoolConfig

由于Jedis实例非线程安全,所以使用JedisPool来创建维护Jedis。先在application.properties文件中对JedisPool进行配置

redis.host=localhost
#连接池的最大数据库连接数 。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal ,在这之前使用maxActive
redis.maxTotal=5
#控制一个pool最多有多少个状态为空闲(idle)的jedis实例
redis.maxIdle=5
#在调用(borrow)一个jedis实例时,是否提前进行验证操作,如果为true,则得到的jedis实例均是可用的
redis.testOnBorrow=true

使用JedisPool的配置,创建JedisPoolConfig这个Bean

@Bean
    @ConfigurationProperties("redis")
    public JedisPoolConfig jedisPoolConfig() {
        return new JedisPoolConfig();
    }

同样的,为什么是使用maxTotal、maxIdle、testOnBorrow这几个字段,而不是其他的其他名称的字段。首先前缀redis是我们自己定义的,这个是可以修改的,这个就不多说了。

Spring redis 插入list spring操作redis_redis


上图是JedisPoolconfig的类关系图,其父类中定义了maxTotal、maxIdle等字段。至于testOnBorrow这个字段名是在GenericObjectPoolConfig的父类BaseObjectPoolConfig中定义的。

配置创建JedisPool

@Bean(destroyMethod = "close")
    public JedisPool jedisPool(@Value("${redis.host}") String host) {
        return new JedisPool(jedisPoolConfig(), host);
    }

使用自定义的JedisPoolConfig 并传入host信息,来完成JedisPool的创建。

使用Jedis实例操作Redis

try (Jedis jedis = jedisPool.getResource()) {
            jedis.set("name", "张三");

            log.info("redis value:{}", jedis.get("name"));
        }
  • 首先通过JedisPool获取Jedis实例
  • 通过Jedis实例提供的API进行数据的存取

常用Util

public class RedisPool {
    //Redis服务器IP
    private static String ADDR = "127.0.0.1";
    //Redis的端口号
    private static int PORT = 6379;
    //访问密码
    private static String AUTH = "123456";
    //可用连接实例的最大数目,默认值为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.setMaxActive(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
//            config.setMaxWait(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取Jedis实例
     * @return
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

更多配置信息

#ip地址
redis.hostName=172.20.1.205  
#端口号
redis.port=6379  
#如果有密码
redis.password=123456  
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=10000
#最大空闲数
redis.maxIdle=300  
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
#redis.maxActive=600
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=1000  
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=1000  
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000  
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=1024  
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000  
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true  
#在空闲时检查有效性, 默认false
redis.testWhileIdle=true

知行合一