Redis和SpringDataRedis


一.Redis簡介

  Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,運行在內存中,由ANSI C編寫。企業開發通常采用Redis來實現緩存。同類的產品還有memcache 、memcached 、MongoDB等。

1.Redis數據結構

​ 字符串類型 string 散列類型 hash 列表類型 list 有序可重復 集合類型 set 無序不可重復 有序集合類型 sortedset 有序不可重復

2.Redis應用場景

做緩存: 緩存的是使用頻次較高,但不是特別重要的數據,請求來時,優先查詢非關系型數據庫,如果沒有查到則查詢關系型數據庫,從關系型數據庫中查詢到結果后,將結果存放到非關系型數據庫中,並將結果返回給瀏覽器.如果查詢到了,直接將查詢結果返回給瀏覽器即可。

當用戶執行 增 刪 改操作時,優先操作關系型數據庫, (會造成Redis數據丟失)

操作完畢后,刪除非關系型數據庫中的相關數據. (需要Redis數據同步)

 

二.Redis持久化:

注意: 要想使用redis的持久化操作,啟動redis時必須采用配置文件

使用指定配置文件開啟服務 (會持久化) ★★★★★

啟動服務器: 在dos命令中輸入 redis-server.exe redis.windows.conf

啟動客戶端: 在dos命令中輸入 redis-cli.exe

1.RDB持久化方式: (默認)

rdb方式在持久化數據時,采用快照機制.

執行快照保存的時機:

save 900 1 save 300 10 save 60 10000

存在問題: 可能導致數據丟失

在redis的配置文件中已經定義好使用rdb方式進行持久化了,將持久化的數據存放在當前目錄的dump.rdb.

redis服務器正常關閉時也會執行持久化操作(快照保存數據)

2.AOF持久化方式:

持久化的是執行過程,每一條命令都會持久化保存

使用方式:

1.開啟AOF持久化(修改配置文件)

將配置文件中的 appendonly 改為 yes

appendfsync always (我們使用的)

# appendfsync everysec

# appendfsync no

特點:

不會導致數據丟失.

性能低

三. Jedis

  Jedis是Redis官方推出的一款面向Java的客戶端,提供了很多接口供Java語言調用。可以在Redis官網下載,當然還有一些開源愛好者提供的客戶端,如Jredis、SRP等等,推薦使用Jedis。

  • jdbc: java操作mysql數據的方式

  • jedis: java操作redis數據庫的方式

四. Spring Data Redis

  Spring-data-redis是spring大家族的一部分,提供了在srping應用中通過簡單的配置訪問redis服務,對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝,RedisTemplate提供了redis各種操作、異常處理及序列化,支持發布訂閱,並對spring 3.1 cache進行了實現。

  spring-data-redis針對jedis提供了如下功能: 1.連接池自動管理,提供了一個高度封裝的“RedisTemplate”類 2.針對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝為operation接口 ValueOperations:簡單K-V操作 SetOperations:set類型數據操作 ZSetOperations:zset類型數據操作 HashOperations:針對map類型的數據操作 ListOperations:針對list類型的數據操作

五.Spring Data Redis操作Redis數據庫

第一步:導入相關坐標到Spring項目中

<!-- Redis緩存相關坐標 -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.7.2.RELEASE</version>
</dependency>

第二步:在resources下編寫redis的配置文件

resources/redis-config.properties

# Redis settings 
# server IP 
redis.host=192.168.25.130
# server port 
redis.port=6379
# server pass 
redis.pass=
# use dbIndex 
redis.database=0
# maxIdle
redis.maxIdle=300
# maxWait
redis.maxWait=3000
# testOnBorrow
redis.testOnBorrow=true

resources/applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd   
            http://www.springframework.org/schema/context   
            http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 1.加載外部配置文件 -->
    <context:property-placeholder location="classpath*:properties/*.properties"/>

    <!-- 2.redis相關配置 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="maxWaitMillis" value="${redis.maxWait}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean>

    <!-- 3.Jedis連接工廠的配置 -->
    <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>

    <!-- 4.redis模板的配置 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="JedisConnectionFactory"/>
    </bean>

</beans>  

第三步:使用redisTemplate模板操作數據庫

1.操作String類型數據

/**
 * @author Mr.song
 * @date 2019/06/12 21:09
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisStrTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testSetString(){
        //模板綁定存儲的數據類型為String並存入數據: key是testStr   value是DinTalk
        redisTemplate.boundValueOps("testStr").set("DinTalk");
    }

    @Test
    public void testGetString(){
        //模板綁定存儲的數據類型為String並取數據:使用key testStr
        String testStr = (String) redisTemplate.boundValueOps("testStr").get();
        System.out.println(testStr);
    }

    @Test
    public void testDelString(){
        //直接用模板根據key刪除數據,刪除后無數據查詢返回null
        redisTemplate.delete("testStr");
    }

    //使用相同的key重新設置值便是更新
}

2.操作List類型數據

/**
 * @author Mr.song
 * @date 2019/06/12 21:22
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisListTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testSetList(){
        //模板綁定存儲的數據類型為List並存入數據:key是myList,List的數據類型,數據為din.....
        redisTemplate.boundListOps("myList").leftPush("din");
        redisTemplate.boundListOps("myList").leftPush("talk");
        redisTemplate.boundListOps("myList").leftPush("cn");
    }

    @Test
    public void testGetList(){
        //模板綁定存儲的數據類型為List並取數據:key是myList,rang中0是開始,-1是全部
        List myList = redisTemplate.boundListOps("myList").range(0, -1);
        myList.stream().forEach(System.out::println);
        //取list中的一個數據 :先進先出(相當於彈出-刪除了)
        //String myList = (String) redisTemplate.boundListOps("myList").rightPop();
        //System.out.println(myList); //din
    }

    @Test
    public void testDelList(){
        //直接用模板根據key刪除數據(刪除整個集合)
        redisTemplate.delete("myList");
        //指定刪除list的數據 :刪除一個talk
        //redisTemplate.boundListOps("myList").remove(1,"talk");
    }

    //使用相同的key重新設置值便是更新
}

3.操作Set類型數據

/**
 * @author Mr.song
 * @date 2019/06/12 21:09
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisSetTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testSetValue(){
        //模板綁定存儲的數據類型為Set並存入數據: key是mySet   value是din talk 等
        redisTemplate.boundSetOps("mySet").add("www");
        redisTemplate.boundSetOps("mySet").add("din");
        redisTemplate.boundSetOps("mySet").add("talk");
        redisTemplate.boundSetOps("mySet").add("cn");
    }

    @Test
    public void testGetValue(){
        //模板綁定存儲的數據類型為Set並取數據:使用key為 mySet
        Set mySet = redisTemplate.boundSetOps("mySet").members();
        mySet.stream().forEach(System.out::println);
    }

    @Test
    public void testDelValue(){
        //直接用模板根據key刪除數據,刪除整個Set集合
        redisTemplate.delete("mySet");
        //redisTemplate.boundSetOps("mySet").remove("www");
    }

    //使用相同的key重新設置值便是更新
}

4.操作ZSet類型數據

/**
 * @author Mr.song
 * @date 2019/06/12 21:09
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisZSetTest {

    @Autowired
    private RedisTemplate redisTemplate;

    //ZSet集合有序,數據有分值
    @Test
    public void testSetValue(){
        //模板綁定存儲的數據類型為Set並存入數據: key是myZSet  value是din talk 等,各有分值
       redisTemplate.boundZSetOps("myZSet").add("din",15);
       redisTemplate.boundZSetOps("myZSet").add("talk",55);
       redisTemplate.boundZSetOps("myZSet").add("www",25);
       redisTemplate.boundZSetOps("myZSet").add("cn",45);
    }

    @Test
    public void testGetValue(){
        //1.模板綁定存儲的數據類型為ZSet並取數據:使用key為 myZSet(取一定分值范圍的)
        //Set myZSet = redisTemplate.boundZSetOps("myZSet").rangeByScore(20, 50);
        //myZSet.stream().forEach(System.out::println);
        //2.取全部的
        //Set myZSet = redisTemplate.boundZSetOps("myZSet").range(0, -1);
        //myZSet.stream().forEach(System.out::println);
        //3.取數據,帶分值
        Set<DefaultTypedTuple> myZSet = redisTemplate.boundZSetOps("myZSet").rangeWithScores(0, -1);
        for (DefaultTypedTuple defaultTypedTuple : myZSet) {
            System.out.println(defaultTypedTuple.getValue());//數據
            System.out.println(defaultTypedTuple.getScore());//分值
        }
    }

    @Test
    public void testDelValue(){
        //1.直接用模板根據key刪除數據,刪除整個ZSet集合
        //redisTemplate.delete("myZSet");
        //2.刪除部分數據
        redisTemplate.boundZSetOps("myZSet").removeRangeByScore(15,25);
    }

    //使用相同的key重新設置值便是更新
}

5.操作Hash類型數據

/**
 * @author Mr.song
 * @date 2019/06/12 21:09
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisHashTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testSetHash(){
        //模板綁定存儲的數據類型為Hash並存入數據: key是myHash value是{din:叮}等鍵值對
        redisTemplate.boundHashOps("myHash").put("din","叮");
        redisTemplate.boundHashOps("myHash").put("talk","當");
        redisTemplate.boundHashOps("myHash").put("song","宋");
        redisTemplate.boundHashOps("myHash").put("hui","慧");
    }

    @Test
    public void testGetHash(){
        //模板綁定存儲的數據類型為Hash並取數據:使用key為 myHash,獲取鍵的集合
        //Set myHash = redisTemplate.boundHashOps("myHash").keys();
        //myHash.stream().forEach(System.out::println);
        //獲取value的集合(值可重復,所以是list)
        //List myHash = redisTemplate.boundHashOps("myHash").values();
        //myHash.stream().forEach(System.out::println);
        //使用myHash這個key獲取到Hash並用鍵獲取值
        String s = (String) redisTemplate.boundHashOps("myHash").get("din");
        System.out.println(s);
    }

    @Test
    public void testDelHash(){
        //直接用模板根據key刪除數據,刪除整個Hash集合
        //redisTemplate.delete("myHash");
        redisTemplate.boundHashOps("myHash").delete("din");
    }

    //使用相同的key重新設置值便是更新
}

 

 

附錄1:Linux系統中安裝Redis Server

1. 將redis資源包上傳到Linux中
2. 執行tar -zxvf redis-3.0.0.tar.gz解壓
3. 創建/usr/local/redis目錄, //命令 mkdir redis
4. 進入解壓的redis-3.0.0,安裝redis服務,執行命令:make install PREFIX=/usr/local/redis
5. 復制配置文件將/redis-3.0.0/redis.conf 復制到redis 下的bin 目錄下  執行命令:
   cp redis.conf /usr/local/redis-cluster/redis-1/bin/
6.啟動redis服務

 

 

關注微信公眾號,隨時隨地學習

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM