Redis基礎及與spring的整合總結

簡介

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。

在項目中使用redis,主要是從兩個角度去考慮:性能和併發。

性能:我們在碰到需要執行耗時特別久,且結果不頻繁變動的SQL,就特別適合將運行結果放入緩存。這樣,後面的請求就去緩存中讀取,使得請求能夠迅速響應。

併發:在大併發的情況下,所有的請求直接訪問數據庫,數據庫會出現連接異常。這個時候,就需要使用redis做一個緩衝操作,讓請求先訪問到redis,而不是直接訪問數據庫。

Redis五種數據類型

String:key-value(做緩存)

​ Redis中所有的數據都是字符串。命令不區分大小寫,key是區分大小寫的。Redis是單線程的。Redis中不適合保存內容大的數據。

​ get、set

​ incr:加一(生成id)

​ Decr:減一

Hash:key-fields-values(做緩存)

​ 相當於一個key對於一個map,map中還有key-value

​ 使用hash對key進行歸類。

​ Hset:向hash中添加內容

​ Hget:從hash中取內容

List:有順序可重複

常用命令如下:

192.168.25.153:6379> lpush list1 a b c d
(integer) 4
192.168.25.153:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
192.168.25.153:6379> rpush list1 1 2 3 4
(integer) 8
192.168.25.153:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "1"
6) "2"
7) "3"
8) "4"
192.168.25.153:6379>
192.168.25.153:6379> lpop list1
"d"
192.168.25.153:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
7) "4"
192.168.25.153:6379> rpop list1
"4"
192.168.25.153:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
192.168.25.153:6379>

Set:元素無順序,不能重複

常用命令如下:

192.168.25.153:6379> sadd set1 a b c c c d
(integer) 4
192.168.25.153:6379> smembers set1
1) "b"
2) "c"
3) "d"
4) "a"
192.168.25.153:6379> srem set1 a
(integer) 1
192.168.25.153:6379> smembers set1
1) "b"
2) "c"
3) "d"
192.168.25.153:6379>

SortedSet(zset):有順序,不能重複

常用命令如下:

192.168.25.153:6379> zadd zset1 2 a 5 b 1 c 6 d
(integer) 4
192.168.25.153:6379> zrange zset1 0 -1
1) "c"
2) "a"
3) "b"
4) "d"
192.168.25.153:6379> zrem zset1 a
(integer) 1
192.168.25.153:6379> zrange zset1 0 -1
1) "c"
2) "b"
3) "d"
192.168.25.153:6379> zrevrange zset1 0 -1
1) "d"
2) "b"
3) "c"
192.168.25.153:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "b"
4) "5"
5) "d"
6) "6"
192.168.25.153:6379> zrevrange zset1 0 -1 withscores
1) "d"
2) "6"
3) "b"
4) "5"
5) "c"
6) "1"
192.168.25.153:6379>

Key命令

設置key的過期時間。

Expire key second:設置key的過期時間

Ttl key:查看key的有效期

Persist key:清除key的過期時間。Key持久化。

192.168.25.153:6379> expire Hello 100
(integer) 1
192.168.25.153:6379> ttl Hello
(integer) 77

Redis與spring工程的整合

1 接口封裝

常用的操作redis的方法提取出一個接口,分別對應單機版和集羣版創建兩個實現類。

1.2 接口定義

public interface JedisClient {
  String set(String key, String value);
  String get(String key);
  Boolean exists(String key);
  Long expire(String key, int seconds);
  Long ttl(String key);
  Long incr(String key);
  Long hset(String key, String field, String value);
  String hget(String key, String field);
  Long hdel(String key, String... field);
}

1.3 單機版實現類

public class JedisClientPool implements JedisClient {
  @Autowired
  private JedisPool jedisPool;
  @Override
  public String set(String key, String value) {
    Jedis jedis = jedisPool.getResource();
    String result = jedis.set(key, value);
    jedis.close();
    return result;
  }

  @Override
  public String get(String key) {
    Jedis jedis = jedisPool.getResource();
    String result = jedis.get(key);
    jedis.close();
    return result;
  }

  @Override
  public Boolean exists(String key) {
    Jedis jedis = jedisPool.getResource();
    Boolean result = jedis.exists(key);
    jedis.close();
    return result;
  }

  @Override
  public Long expire(String key, int seconds) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.expire(key, seconds);
    jedis.close();
    return result;
  }

  @Override
  public Long ttl(String key) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.ttl(key);
    jedis.close();
    return result;
  }

  @Override
  public Long incr(String key) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.incr(key);
    jedis.close();
    return result;
  }

  @Override
  public Long hset(String key, String field, String value) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.hset(key, field, value);
    jedis.close();
    return result;
 }

  @Override
  public String hget(String key, String field) {
    Jedis jedis = jedisPool.getResource();
    String result = jedis.hget(key, field);
    jedis.close();
    return result;
  }

  @Override
  public Long hdel(String key, String... field) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.hdel(key, field);
    jedis.close();
    return result;
  }
 }

配置:applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
  xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans4.2.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context4.2.xsd
  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx4.2.xsd
  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util4.2.xsd">

  <!-- 配置單機版的連接 -->
  <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
    <constructor-arg name="host" value="101.132.69.111"/>   
    <constructor-arg name="port" value="6379"/>
  </bean>
  <bean id="jedisClientPool" class="net.wanho.jedis.JedisClientPool"/>
 </beans>

1.4 集羣版實現類

package com.taotao.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.JedisCluster;

public class JedisClientCluster implements JedisClient {
  @Autowired
  private JedisCluster jedisCluster;
  @Override
  public String set(String key, String value) {
    return jedisCluster.set(key, value);
  }

  @Override
  public String get(String key) {
    return jedisCluster.get(key);
  }

  @Override
  public Boolean exists(String key) {
    return jedisCluster.exists(key);
  }

  @Override
  public Long expire(String key, int seconds) {
    return jedisCluster.expire(key, seconds);
  }

  @Override
  public Long ttl(String key) {
    return jedisCluster.ttl(key);
  }

  @Override
  public Long incr(String key) {
    return jedisCluster.incr(key);
  }

  @Override
  public Long hset(String key, String field, String value) {
    return jedisCluster.hset(key, field, value);
  }

  @Override
  public String hget(String key, String field) {
    return jedisCluster.hget(key, field);
  }

  @Override
  public Long hdel(String key, String... field) {
    return jedisCluster.hdel(key, field);
  }
}

Spring的配置:

 <!-- 集羣版的配置 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
  <constructor-arg>
    <set>
      <bean class="redis.clients.jedis.HostAndPort">
        <constructor-arg name="host" value="192.168.100.185"/>
        <constructor-arg name="port" value="7001"/>
      </bean>
      <bean class="redis.clients.jedis.HostAndPort">
        <constructor-arg name="host" value="192.168.100.185"/>
        <constructor-arg name="port" value="7002"/>
      </bean>
      <bean class="redis.clients.jedis.HostAndPort">
        <constructor-arg name="host" value="192.168.100.185"/>
        <constructor-arg name="port" value="7003"/>
      </bean>
      <bean class="redis.clients.jedis.HostAndPort">
        <constructor-arg name="host" value="192.168.100.185"/>
        <constructor-arg name="port" value="7004"/>
      </bean>
      <bean class="redis.clients.jedis.HostAndPort">
        <constructor-arg name="host" value="192.168.100.185"/>
        <constructor-arg name="port" value="7005"/>
      </bean>
      <bean class="redis.clients.jedis.HostAndPort">
        <constructor-arg name="host" value="192.168.100.185"/>
        <constructor-arg name="port" value="7000"/>
      </bean>
    </set>
  </constructor-arg>
</bean>
<bean id="jedisClientCluster" class="net.wanho.jedis.JedisClientCluster"/>

注意:單機版和集羣版不能共存,使用單機版時註釋集羣版的配置。使用集羣版,把單機版註釋。

2 封裝代碼測試

@Test
public void testJedisClientPool() throws Exception {
    //初始化spring容器
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");
    //從容器中獲得JedisClient對象
    JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
    //使用JedisClient對象操作redis
    jedisClient.set("jedisclient", "mytest");
    String result = jedisClient.get("jedisclient");
    System.out.println(result);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章