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類型的字段名)。


我不能保證每個地方都是對的,可是能夠保證每一句話,每一行代碼都是通過推敲和斟酌的。但願每一篇文章背後都是本身追求純粹技術人生的態度。

永遠相信美好的事情即將發生。

相關文章
相關標籤/搜索