redis搞定面试系列—基础篇:Java操做redis

Jedis

jedis是使用java代码操做redis数据库的,jedis和redis的关系,就至关于JDBC和MySql的关系java

添加依赖

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

    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.6</version>
    </dependency>
复制代码

jedis的代码

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

//        jedis的方法和redis的命令一一对应
        jedis.set("username","zhansan");

        jedis.close();
    }
}
复制代码

链接池而且封装JedisUtils工具类

Jedis链接池:建立一个链接池对象,每次须要操做 redis数据库,都从链接池中获取 jedis对象 使用完毕,jedis对象又从新放回链接池。若是Jedis在使用过程当中出错,则也须要还给JedisPoolredis

链接池参数配置spring

JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。数据库

  • maxActive:控制一个pool可分配多少个jedis实例,经过pool.getResource()来获取;若是赋值为-1,则表示不限制;若是pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。缓存

  • maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;bash

  • whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采起的操做;默认有三种。工具

    WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;测试

    WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;ui

    WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;spa

  • maxWait:表示当borrow一个jedis实例时,最大的等待时间,若是超过等待时间,则直接抛JedisConnectionException;

  • testOnBorrow:得到一个jedis实例的时候是否检查链接可用性(ping());若是为true,则获得的jedis实例均是可用的;

  • testOnReturn:return 一个jedis实例给pool时,是否检查链接可用性(ping());

  • testWhileIdle:若是为true,表示有一个idle object evitor线程对idle object进行扫描,若是validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

  • timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;

  • numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;

  • minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短期,而后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

  • softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。若是为-1,evicted不会根据idle time驱逐任何对象。若是minEvictableIdleTimeMillis>0,则此项设置无心义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;

  • lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即相似cache的最频繁使用队列),若是为False,则表示FIFO队列;

其中JedisPoolConfig对一些参数的默认设置以下:

testWhileIdle=true

minEvictableIdleTimeMills=60000

timeBetweenEvictionRunsMillis=30000

numTestsPerEvictionRun=-1

package com.baizhi.redis;

import redis.clients.jedis.JedisPool;

package com.atguigu.redis.test;

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

public class JedisUtils {
    //被volatile修饰的变量不会被本地线程缓存,对该变量的读写都是直接操做共享内存。
    private static volatile JedisPool jedisPool = null;

    private JedisUtils() {}

    public static JedisPool getJedisPoolInstance() {
        if(null == jedisPool)
        {
            synchronized (JedisUtils.class)
            {
                if(null == jedisPool)
                {
                    JedisPoolConfig poolConfig = new JedisPoolConfig();
                    poolConfig.setMaxActive(1000);
                    poolConfig.setMaxIdle(32);
                    poolConfig.setMaxWait(100*1000);
                    poolConfig.setTestOnBorrow(true);
                    jedisPool = new JedisPool(poolConfig,"127.0.0.1");
                }
            }
        }
        return jedisPool;
    }

    public static void release(JedisPool jedisPool,Jedis jedis) {
        if(null != jedis)
        {
            jedisPool.returnResourceObject(jedis);
        }
    }
}
复制代码

Spring-data 操做 Redis

使用spring-data操做redis

Spring-Data-Redis项目(简称SDR)对Redis的Key-Value数据存储操做提供了更高层次的抽象,相似于Spring Framework对JDBC支持同样。Spring-Data-Redis项目(简称SDR)对Redis的Key-Value数据存储操做提供了更高层次的抽象,相似于Spring Framework对JDBC支持同样。

Spring Data Redis使得在Spring应用中读写Redis数据库更加容易

链接Redis服务

在Spring Data Redis中经过org.springframework.data.redis.connection包中的RedisConnection和RedisConnectionFactory类来获取Redis链接。

img

链接redis服务集群

img

RedisTemplate的支持

熟悉Spring的JdbcTemplate对象的话,应该大概能猜出来RedisTemplate的做用了,RedisTemplate对象对RedisConnection进行了封装,它提供了链接管理,序列化等功能,它对Redis的交互进行了更高层次的抽象。另外还提供了Redis操做命令的操做视图,这极大的方便和简化了Redis的操做。

下表是具体的操做视图接口类介绍
Key类型操做
ValueOperations Redis String/Value 操做
ListOperations Redis List 操做
SetOperations Redis Set 操做
ZSetOperations Redis Sort Set 操做
HashOperations Redis Hash 操做
Value约束操做
BoundValueOperations Redis String/Value key 约束
BoundListOperations Redis List key 约束
BoundSetOperations Redis Set key 约束
BoundZSetOperations Redis Sort Set key 约束
BoundHashOperations Redis Hash key 约束

测试redisTemplate

简单的String操做

img

简单的List操做

img

简单的Set操做

img

简单的Zset操做

img

简单的Hash操做

img

其余操做

img

使用RedisSerializer

  • Spring Data Redis提供了对Key-Value的序列号,在使用RedisTemplate对象是默认使用JdkSerializationRedisSerializer实现。还提供了其它的序列化实现如:Jackson2JsonRedisSerializer,JacksonJsonRedisSerializer,GenericToStringSerializer,StringRedisSerializer,OxmSerializer。
  • 另外用户能够提供本身的序列化实现, 配置RedisTemplate

img

说明 :

这里配置了RedisTemplate和StringRedisTemplate,不一样之处在于StringRedisTemplate的Key-Value序列化使用的是StringRedisSerializer。使用StringRedisTemplate操做Redis以后的结果是读友好的。 另外对Hash类型而言,还有对应的HashKey序列化(其对应于Hash类型的字段名)。


我不能保证每个地方都是对的,可是能够保证每一句话,每一行代码都是通过推敲和斟酌的。但愿每一篇文章背后都是本身追求纯粹技术人生的态度。

永远相信美好的事情即将发生。

相关文章
相关标签/搜索