天天看點

springboot學習筆記(八)——使用redis做緩存程式人生,與君共勉~!

前言:       

         redis是一個key-value存儲系統。和Memcached類似,它支援存儲的value類型相對更多,包括string(字元串)、list(連結清單)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些資料類型都支援push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩存在記憶體中。差別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步。

         Redis 是一個高性能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很友善。 [1] 

          Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複制。存盤可以有意無意的對資料進行寫操作。由于完全實作了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道并接收主伺服器完整的消息釋出記錄。同步對讀取操作的可擴充性和資料備援很有幫助。

                                                                       (以上來自百度百科)

         現在很多情況下,我們都開始使用redis進行緩存,技能降低資料庫伺服器壓力,也讓使用者更快的通路到我們的資料,并發上也能很好的處理。現在我們來學學springboot中使用redis注解進行開發。

開發環境:

         win10+IntelliJ IDEA +JDK1.8+redis3.5  

         springboot版本:springboot 1.5.14 ——2.0後的springboot增加了挺多新特性,暫時先不做了解

項目結構:

springboot學習筆記(八)——使用redis做緩存程式人生,與君共勉~!

項目完整案例:

https://github.com/LuckToMeet-Dian-N/springboot_Learn_8

環境搭建:

       這步是搭建redis環境,這裡接不做介紹了。如果還沒搭建的同學參考我的另一篇部落格:随筆(三)-- linux下安裝redis

按照步驟就可以裝成功了。

配置檔案:

        pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.wen</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.14.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>
           

        application.properties

# REDIS (RedisProperties)
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器位址
spring.redis.host=172.16.151.156
# Redis伺服器連接配接端口
spring.redis.port=6379
# Redis伺服器連接配接密碼(預設為空)
spring.redis.password=
# 連接配接池最大連接配接數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
# 連接配接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=2000
# 連接配接池中的最大空閑連接配接
spring.redis.pool.max-idle=8
# 連接配接池中的最小空閑連接配接
spring.redis.pool.min-idle=0
# 連接配接逾時時間(毫秒)
spring.redis.timeout=0

#資料庫類資訊
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=wuxiwen
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#展示sql語句
spring.jpa.show-sql=true
#設定方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

#時區設定
spring.jackson.time-zone=GMT+8
#日期期時格式設定置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
           

注解介紹:

@CachePut     @CachePut标注的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,并将執行結果以鍵值對的形式存入指定的緩存中。

@Cacheable    對于一個支援緩存的方法,Spring會在其被調用後将其傳回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中擷取結果,而不需要再次執行該方法。

@CacheConfig 緩存配置,可以配置一個類全局緩存的名字

@CacheEvict     @CacheEvict是用來标注在需要清除緩存元素的方法或類上的。

開始開發:

        Dao層:

package com.wen.test.Dao;

import com.wen.test.vo.Users;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@CacheConfig(cacheNames = "users")
public interface UserDao extends JpaRepository<Users,Integer>{


    @Cacheable(key ="'id:'+#p0")
    @Query("select u from Users u where u.user_id=:user_id")
    Users findUsersByUser_id(@Param("user_id") Integer user_id);

    @Modifying
    @Transactional
//    @CachePut(key = "'id:'+#p0.user_id")  //緩存重新整理
    @CacheEvict(key = "'id:'+#p0.user_id") //删除緩存
    Users save(Users users);

}
           

       vo層:

package com.wen.test.vo;

import lombok.Data;
import sun.applet.Main;


import javax.persistence.*;

@Data
@Entity
@Table(name = "users")
public class Users {
    @Id
    @GeneratedValue
    private Integer user_id;
    @Column
    private String username;
    @Column
    private String password;

}
           

        Test類:

package com.wen.test;


import com.wen.test.Dao.UserDao;
import com.wen.test.vo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    UserDao userDao;

    @Test
    public void contextLoads() throws Exception {
        /**
         * 用于更新或者增加操作時用到
         */
        Users userss = new Users();
        userss.setUsername("wen");
        userss.setUser_id(1);
        userss.setPassword("12312313");
        Users users=userDao.findUsersByUser_id(1);
	    System.out.println("第一次查詢:"+users.getUsername());
        System.out.println("------------完美分割線----------------");
        System.out.println("開始更新操作");
        userDao.save(userss);
        Users u2=userDao.findUsersByUser_id(1);
        System.out.println("第二次查詢:"+u2.getUsername());



    }


}
           

測試:

springboot學習筆記(八)——使用redis做緩存程式人生,與君共勉~!

總結:

         redis的簡單緩存操作就是這樣了。還有好多好多的東西要學。比如:redis的鎖,redis消息隊列等,一大堆的redis實作的逗逗是特别的優秀,在我們平時學習來說是一個寶庫。簡單緩存就寫到這裡咯,謝謝大家!~

程式人生,與君共勉~!

繼續閱讀