Redis項目案例

基於redis緩存實現用戶增刪改查的項目分析

需求

redis的作用是實現數據的緩存,以此來提升系統性能。
在本案例中,基本功能是實現用戶的增刪改查,主要在用戶的查詢和修改時用到了redis的緩存。

  • 業務邏輯 -查詢:首先對接收到的userid在redis緩存中查詢,如果沒有在查詢mysql數據庫,查詢到以後將查詢結果封裝成json類型發送給redis進行緩存,方便下次讀取
  • 業務邏輯 -更新:執行更新操作後,需要將redis中原來的緩存也一併刪除,並將更新過的數據重新插入redis緩存

項目運行環境

1、在運行項目時,需要打開單機版redis,以及redis圖形化工具RedisDesktopManager(方便查看數據變更信息)
2、需要關閉防火牆
3、需要有mysql或者oracle數據庫

項目搭建

在這裏插入圖片描述

1、父工程

採取maven來構建項目,父工程爲pom工程,並且添加以下座標,並對其版本進行控制

pom.xml
<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.bjsxt</groupId>
  <artifactId>parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
 
 	<!-- 對依賴的jar包的版本統一進行定義 -->
	<properties>
		<jedis.version>2.9.0</jedis.version>
		<jedis.version>2.9.0</jedis.version>
		<junit.version>4.12</junit.version>
		<spring.version>4.1.3.RELEASE</spring.version>
		<mybatis.version>3.2.8</mybatis.version>
		<mybatis.spring.version>1.2.2</mybatis.spring.version>
		<mysql.version>5.1.32</mysql.version>
		<slf4j.version>1.6.4</slf4j.version>
		<druid.version>1.0.9</druid.version>
		<jstl.version>1.2</jstl.version>
		<servlet-api.version>2.5</servlet-api.version>
		<tomcat.version>2.2</tomcat.version>
		<jsp-api.version>2.0</jsp-api.version>
		<jackson.version>2.4.2</jackson.version>
		
	</properties>


	<!-- jar包的依賴注入 ,由於該工程是一個父工程,所以jar包在該pom文件中只是聲明 -->
	<dependencyManagement>
		
		<dependencies>
		
		<!-- Jedis,實現java操作redis數據庫 -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>${jedis.version}</version>
		</dependency>
		
			<!-- 單元測試 -->
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
			</dependency>
			<!-- 日誌處理 -->
			<dependency>
				<groupId>org.slf4j</groupId>
				<artifactId>slf4j-log4j12</artifactId>
				<version>${slf4j.version}</version>
			</dependency>
			<!-- Mybatis -->
			<dependency>
				<groupId>org.mybatis</groupId>
				<artifactId>mybatis</artifactId>
				<version>${mybatis.version}</version>
			</dependency>
			<dependency>
				<groupId>org.mybatis</groupId>
				<artifactId>mybatis-spring</artifactId>
				<version>${mybatis.spring.version}</version>
			</dependency>
			<!-- MySql -->
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>${mysql.version}</version>
			</dependency>
			<!-- 連接池 -->
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>druid</artifactId>
				<version>${druid.version}</version>
			</dependency>
			<!-- 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-webmvc</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>
			<!-- JSP相關 -->
			<dependency>
				<groupId>jstl</groupId>
				<artifactId>jstl</artifactId>
				<version>${jstl.version}</version>
			</dependency>
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>servlet-api</artifactId>
				<version>${servlet-api.version}</version>
				<scope>provided</scope>
			</dependency>
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>jsp-api</artifactId>
				<version>${jsp-api.version}</version>
				<scope>provided</scope>
			</dependency>
			
			<!-- Jackson Json處理工具包 -->
			<dependency>
				<groupId>com.fasterxml.jackson.core</groupId>
				<artifactId>jackson-databind</artifactId>
				<version>${jackson.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
	
<build>
		<resources>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.xml</include>
				</includes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<includes>
					<include>**/*.xml</include>
					<include>**/*.properties</include>
				</includes>
			</resource>
		</resources>
		<!-- tomcat插件,由於子項目不一定每個都是web項目,所以該插件只是聲明,並未開啓 -->
		<pluginManagement>
			<plugins>
				<!-- 配置Tomcat插件 -->
				<plugin>
					<groupId>org.apache.tomcat.maven</groupId>
					<artifactId>tomcat7-maven-plugin</artifactId>
					<version>${tomcat.version}</version>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>

2、子工程

jar工程,進行業務功能的具體實現,下面將主要粘貼一些重要代碼

  • JedisDao 與其實現類
package com.bjsxt.jedisdao;

public interface JedisDao {
	
	 String set(String key,String value);
	 String get(String key);
	 
	 Long hset(String key,String field,String value);
	 String hget(String key,String field);
	 
	 /**
	  * 用於設置失效時間
	  * @param key
	  * @param sec
	  * @return
	  */
	 Long expire(String key,int sec);
	 /**
	  * 刪除jedis緩存
	  * @param key
	  * @return
	  */
	 Long del(String key);
}



package com.bjsxt.jedisdao.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bjsxt.jedisdao.JedisDao;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
@Service
public class JedisDaoSingleImpl implements JedisDao{
	//使用@Autowired要開啓組件掃描,不使用的話要通過pagebean的propertie注入進來
	@Autowired
	private JedisPool jedispool;
	
	@Override
	public String set(String key, String value) {
		Jedis resource=jedispool.getResource();
		return resource.set(key, value);
	}

	@Override
	public String get(String key) {
		Jedis resource=jedispool.getResource();
		return resource.get(key);
	}

	@Override
	public Long hset(String key, String field, String value) {
		Jedis resource=jedispool.getResource();
		return resource.hset(key, field, value);
	}

	@Override
	public String hget(String key, String field) {
		Jedis resource=jedispool.getResource();
		return resource.hget(key, field);
	}

	@Override
	public Long expire(String key, int sec) {
		Jedis resource = jedispool.getResource();
		
		return resource.expire(key, sec);
	}

	@Override
	public Long del(String key) {
		Jedis resource = jedispool.getResource();
		
		return resource.del(key);
	}

}

  • 業務實現類(核心代碼),實現用戶的增刪改查並使用redis緩存對系統進行優化
package com.bjsxt.service.impl;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.bjsxt.commons.JsonUtils;
import com.bjsxt.jedisdao.JedisDao;
import com.bjsxt.mapper.UsersMapper;
import com.bjsxt.pojo.Users;
import com.bjsxt.service.UserService;

import redis.clients.jedis.JedisPool;
/**
 * 業務邏輯 -查詢:首先對接受到的userid在redis數據庫中查詢,如果沒有在查詢mysql數據庫,查詢以後將拆線呢結果封裝成json類型發送給redis緩存
 *  業務邏輯 -更新:執行更新操作後,需要將redis中的緩存也一併刪除,並將更新過的數據重新插入redis緩存
 */
@Service
public class UserServiceImpl implements UserService {
	@Autowired
	private UsersMapper userMapper;	
	@Autowired
	private JedisDao jedisDao;
	//@Autowired
	//private JedisPool jedisPool;
	
	@Override
	public void addUser(Users users) {
		this.userMapper.insertUsers(users);
	}
	@Override
	public void updateUser(Users users) {
		this.userMapper.updateUser(users);
		int userid = users.getUserid();
		
		try {
			//刪除原來的redis緩存
			this.jedisDao.del(this.REDIS_USERS_PRIFX+":"+userid);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			//刪除後將更新過後的信息放入redis
			String objectToJson = JsonUtils.objectToJson(users);
			//String redis_Key = this.REDIS_USERS_PRIFX+":"+userid;
			jedisDao.set(this.REDIS_USERS_PRIFX+":"+userid, objectToJson);
			jedisDao.expire(this.REDIS_USERS_PRIFX+":"+userid,100);//如果設置失敗,最好clean一下
			//jedisPool.getResource().expire(redis_Key, 20);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//添加了一個配置文件內容爲:REDIS_USERS_PRIFX=REDIS_USERS_PRIFX
	//@Value,獲取配置文件中相關參數的值
	@Value("${REDIS_USERS_PRIFX}")
	private String REDIS_USERS_PRIFX;
	
	@Override
	public Users findByUserid(int userid) {
		
		try {
			//查看緩存
			String json=this.jedisDao.get(this.REDIS_USERS_PRIFX+":"+userid );//p拼接成json類型字符串key:value
			//在緩存中是否命中
			if (json != null && json.length()>0) {//命中
				System.out.println("-----------------調用查看redis緩存操作--------------------");
				Users users=JsonUtils.jsonToPojo(json, Users.class);
				return users;
			}
		} catch (Exception e) {//保證不影響功能正常實現,需要用try。。。catch
			e.printStackTrace();
		}
		
		
		//查詢數據庫
		Users users=this.userMapper.selByUserId(userid);
		System.out.println(users);
		System.out.println("==================查詢mysql並放入redis緩存=========================");
		try {
			//放入redis中
			String objectToJson = JsonUtils.objectToJson(users);
			//String redis_Key = this.REDIS_USERS_PRIFX+":"+userid;
			jedisDao.set(this.REDIS_USERS_PRIFX+":"+userid, objectToJson);
			jedisDao.expire(this.REDIS_USERS_PRIFX+":"+userid,60);//如果設置失敗,最好clean一下
			//jedisPool.getResource().expire(redis_Key, 1000);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return users;
		
		
	}
	
}

  • 掃描配置文件,在application-dao.xml配置文件中添加如下代碼
<!-- 配置解析properties文件的工具類 -->
  <!--   <context:property-placeholder location="classpath:db.properties"/> -->
      <context:property-placeholder location="classpath:resource/*.properties"/> 
  • 令redis生效的applicationContext-jedis.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"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 1、首先配置組件掃描,在這裏秩序依賴spring來掃描 -->
	<!--  <context:component-scan base-package="com.bjsxt.jedisdao.JedisDao"/>  -->
	
	<!-- jedisPool的配置 -->
	<bean id="poolconfig" class="redis.clients.jedis.JedisPoolConfig">
	        <!-- 最大連接數 -->
		<property name="maxTotal" value="30" />
		<!-- 最大空閒連接數 -->
		<property name="maxIdle" value="10" />
		<!-- 每次釋放連接的最大數目 -->
		<property name="numTestsPerEvictionRun" value="1024" />
		<!-- 釋放連接的掃描間隔(毫秒) -->
		<property name="timeBetweenEvictionRunsMillis" value="30000" />
		<!-- 連接最小空閒時間 -->
		<property name="minEvictableIdleTimeMillis" value="1800000" />
		<!-- 連接空閒多久後釋放, 當空閒時間>該值 且 空閒連接>最大空閒連接數 時直接釋放 -->
		<property name="softMinEvictableIdleTimeMillis" value="10000" />
		<!-- 獲取連接時的最大等待毫秒數,小於零:阻塞不確定的時間,默認-1 -->
		<property name="maxWaitMillis" value="1500" />
		<!-- 在獲取連接的時候檢查有效性, 默認false -->
		<property name="testOnBorrow" value="true" />
		<!-- 在空閒時檢查有效性, 默認false -->
		<property name="testWhileIdle" value="true" />
		<!-- 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true -->
		<property name="blockWhenExhausted" value="false" />
		
	</bean>
	
	<!-- 3、配置JedisPool -->
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
		<constructor-arg name="poolConfig">
			<ref bean="poolconfig"></ref>
		</constructor-arg>
		<constructor-arg name="host">
			<value>192.168.179.131</value>
		</constructor-arg>
		<constructor-arg name="port">
			<value>6379</value>
		</constructor-arg>
	</bean>
	<!-- 2、springJedisDaoSingleImpl -->
	 <bean id="jedisDaoSingleImpl" class="com.bjsxt.jedisdao.impl.JedisDaoSingleImpl"></bean> 
	
	<!-- a、配置JedisCluster -->
	<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
		<constructor-arg name="nodes">
			<set>
				<bean name="hostAndPort" class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host">
						<value>192.168.179.131</value>
					</constructor-arg>
					<constructor-arg name="port">
						<value>8001</value>
					</constructor-arg>
				</bean>
				<bean name="hostAndPort" class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host">
						<value>192.168.179.131</value>
					</constructor-arg>
					<constructor-arg name="port">
						<value>8002</value>
					</constructor-arg>
				</bean>
				<bean name="hostAndPort" class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host">
						<value>192.168.179.131</value>
					</constructor-arg>
					<constructor-arg name="port">
						<value>8003</value>
					</constructor-arg>
				</bean>
				<bean name="hostAndPort" class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host">
						<value>192.168.179.131</value>
					</constructor-arg>
					<constructor-arg name="port">
						<value>8004</value>
					</constructor-arg>
				</bean>
				<bean name="hostAndPort" class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host">
						<value>192.168.179.131</value>
					</constructor-arg>
					<constructor-arg name="port">
						<value>8005</value>
					</constructor-arg>
				</bean>
				<bean name="hostAndPort" class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host">
						<value>192.168.179.131</value>
					</constructor-arg>
					<constructor-arg name="port">
						<value>8006</value>
					</constructor-arg>
				</bean>
				
			</set>
			
		</constructor-arg>
		<constructor-arg name="poolConfig">
			<ref bean="poolconfig"></ref>
		</constructor-arg>
	</bean>
	<!-- 配置JedisDaoClusterImpl -->
	<!-- 	<bean id="jedisDaoClusterImpl" class="com.bjsxt.jedisdao.impl.JedisDaoClusterImpl"></bean> -->
</beans>

運行效果

第一次查詢id爲1的用戶
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
第二次查詢id爲1的用戶(相當於刷新頁面)
在這裏插入圖片描述
修改數據:

在這裏插入圖片描述
redis客戶端顯示的結果
在這裏插入圖片描述

項目源碼需要的話請留言~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章