基本概述
對於網站首頁每天有大量的人訪問,對數據庫造成很大的訪問壓力,甚至是癱瘓。那如何解決呢?我們通常的做法有兩種:一種是數據緩存、一種是網頁靜態化
redis
redis是一款開源的Key-Value數據庫,運行在內存中,由ANSI C編寫。企業開發通常採用Redis來實現緩存。同類的產品還有memcache 、memcached 、MongoDB等。
jedis
Jedis是Redis官方推出的一款面向Java的客戶端,提供了很多接口供Java語言調用。可以在Redis官網下載,當然還有一些開源愛好者提供的客戶端,如Jredis、SRP等等,推薦使用Jedis。
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類型的數據操作
RedisTemplate
spring 封裝了 RedisTemplate 對象來進行對redis的各種操作,它支持所有的 redis 原生的 api
這個bean的配置在spring-redis.xml中
安裝
因爲Redis是一個開源的使用ANSI C語言編寫,所以需要虛擬機環境有gcc環境
rpm -qa | grep gcc
yum install gcc
上傳redis-5.0.4.tar.gz
解壓
進入解壓目錄執行編譯命令:make
編譯完成後會在src文件夾內生成文件redis-server、redis-benchmark、redis-cli
將redis-server、redis-benchmark、redis-cli拷貝到/usr/ redis-5.0.4
cp redis-server ../
cp redis-benchmark ../
cp redis-cli ../
因爲我們需要遠程連接,需要將bind項註釋、保護模式改爲no、設置密碼
vim redis.conf
啓動方式一前臺啓動:在redis安裝目錄 ./redis-server redis.conf
啓動方式二後臺啓動:在redis安裝目錄 ./redis-server redis.conf &
方式二啓動完成後 輸入ctrl + c 退出 使用ps -ef | grep redis 可以查詢到進程
Spring Data Redis入門Demo
構建jar工程SpringDataRedisDemo
pom依賴信息
jar工程需要引入編譯插件
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- 緩存 -->
<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>
</dependencies>
<build>
<plugins>
<plugin><!--jar工程需要編譯插件,進行編譯-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
在src/main/resources下創建redis-config.properties
redis.host=192.168.2.123
redis.port=6379
redis.pass=root
redis.database=0#使用0號數據庫
redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true
在src/main/resources下創建spring-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: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">
<context:property-placeholder location="classpath:redis-config.properties" />
<!-- 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>
<bean id="JedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}" />
<property name="port" value="${redis.port}" />
<property name="password" value="${redis.pass}" />
<property name="database" value="${redis.database}" />
<property name="poolConfig" ref="poolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="JedisConnectionFactory" />
</bean>
</beans>
maxIdle :最大空閒數
maxWaitMillis:連接時的最大等待毫秒數
testOnBorrow:在提取一個jedis實例時,是否提前進行驗證操作;如果爲true,則得到的jedis實例均是可用的
創建測試類
Redis中存儲數據是通過key-value存儲的,對於value的類型有以下幾種:
-
字符串
-
字符串列表(list):List類型是按照插入順序排序的字符串鏈表
-
字符串集合(set):和List不同,Set是沒有記錄順序的字符集合,且不允許出現重複的元素
-
哈希(hash):String Key和String Value的map容器,該類型非常適合於存儲值對象的信息
-
有序字符串集合(sorted set):Sorted-Set和Set類型極爲相似,主要差別是Sorted-Sets中的每一個成員都會有一個分數(score)與之關聯
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring-redis.xml")
public class Test1 {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void setValue() {
redisTemplate.boundValueOps("name").set("123");
}
@Test
public void getValue() {
String str = (String) redisTemplate.boundValueOps("name").get();
System.out.println(str);
}
@Test
public void deleteValue() {
redisTemplate.delete("name");
}
}