1. 程式人生 > >關於redis快取時間過期處理 ----在專案中的使用

關於redis快取時間過期處理 ----在專案中的使用

一.專案目錄

二.關於redis處理類

JedisClient.java

package com.taotao.rest.dao;

public interface JedisClient {

	/**
	 * 獲取String資料型別 
	 * @param key
	 * @return
	 */
	String get(String key);
	
	
	/**
	 * 設定String資料型別  
	 * @param key
	 * @param value
	 * @return
	 */
	String set(String key, String value);
	
	
	/**
	 * 獲取hash資料型別 
	 * 首頁內容資訊在redis中儲存的key
	 * @param hkey :首頁內容資訊在redis中儲存的key
	 * @param key
	 * @return
	 */
	String hget(String hkey, String key);
	
	
	/**
	 * 設定hash資料型別 
	 * @param hkey:首頁內容資訊在redis中儲存的key
	 * @param key: key
	 * @param value: value
	 * @return
	 */
	long hset(String hkey, String key, String value);
	
	
	long incr(String key);
	
	long decr(String key);
	
	
	/**
	 * 注入生存時間  
	 * @param key
	 * @param second
	 * @return
	 */
	long expire(String key, int second);
	
	
	/**
	 * 設定key的過期時間  
	 * @param key
	 * @return
	 */
	long ttl(String key);
	
	
	/**
	 * 刪除key
	 * @param key
	 * @return
	 */
	long del(String key);
	
	/**
	 * 刪除hash資料
	 * @param hkey
	 * @param key
	 * @return
	 */
	long hdel(String hkey, String key);
	
}



package com.taotao.rest.dao.impl;

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

import com.taotao.rest.dao.JedisClient;

import redis.clients.jedis.JedisCluster;

/**
 * 叢集版redis
 * @Title: JedisClientCluster
 * @author    xwp
 * @date    2017年1月17日下午3:40:17
 */
public class JedisClientCluster implements JedisClient {

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

    @Override
    public String set(String key, String value) {
        return jedisCluster.set(key, value);
    }

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

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

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

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

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

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

    @Override
    public long hdel(String hkey, String key) {
        
        return jedisCluster.hdel(hkey, key);
    }

}



package com.taotao.rest.dao.impl;

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

import com.taotao.rest.dao.JedisClient;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * 單機版redis
 * @Title: JedisClientSingle
 * @author    xwp
 * @date    2017年1月17日下午3:40:03
 */
public class JedisClientSingle implements JedisClient{
    
    @Autowired
    private JedisPool jedisPool; 
    
    @Override
    public String get(String key) {
        Jedis jedis = jedisPool.getResource();
        String string = jedis.get(key);
        jedis.close();
        return string;
    }

    @Override
    public String set(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        String string = jedis.set(key, value);
        jedis.close();
        return string;
    }

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

    @Override
    public long hset(String hkey, String key, String value) {
        Jedis jedis = jedisPool.getResource();
        Long result = jedis.hset(hkey, key, value);
        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 decr(String key) {  
        Jedis jedis = jedisPool.getResource();
        Long result = jedis.decr(key);
        jedis.close();
        return result; 
    }  
          

    @Override
    public long expire(String key, int second) {
        Jedis jedis = jedisPool.getResource();
        Long result = jedis.expire(key, second);
        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 del(String key) {
        Jedis jedis = jedisPool.getResource();
        Long result = jedis.del(key);
        jedis.close();
        return result;
    }

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

}

 
applicationContext-jedis.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-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
	<!-- 連線池配置 -->
	<bean id="jedisPoolConfig" 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>	
	<!-- jedis客戶端單機版 -->
	<!-- <bean id="redisClient" class="redis.clients.jedis.JedisPool">
		<constructor-arg name="host" value="192.168.13.129"></constructor-arg>
		<constructor-arg name="port" value="6379"></constructor-arg>
		<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
	</bean>
	<bean id="jedisClient" class="com.taotao.rest.dao.impl.JedisClientSingle"/> -->
	
	
	<!-- jedis叢集版配置 -->
	<bean id="redisClient" class="redis.clients.jedis.JedisCluster">
		<constructor-arg name="nodes">
			<set>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.13.129"></constructor-arg>
					<constructor-arg name="port" value="7001"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.13.129"></constructor-arg>
					<constructor-arg name="port" value="7002"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.13.129"></constructor-arg>
					<constructor-arg name="port" value="7003"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.13.129"></constructor-arg>
					<constructor-arg name="port" value="7004"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.13.129"></constructor-arg>
					<constructor-arg name="port" value="7005"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.13.129"></constructor-arg>
					<constructor-arg name="port" value="7006"></constructor-arg>
				</bean>
			</set>
		</constructor-arg>
		<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
	</bean>
	<bean id="jedisClientCluster" class="com.taotao.rest.dao.impl.JedisClientCluster"></bean>
</beans>

相關redis的操作處理,請看我另外的博文:

在相關的serviceImpl中的操作例子

package com.taotao.rest.service.impl;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.taotao.common.util.JsonUtils;
import com.taotao.mapper.TbContentMapper;
import com.taotao.pojo.TbContent;
import com.taotao.pojo.TbContentExample;
import com.taotao.pojo.TbContentExample.Criteria;
import com.taotao.rest.dao.JedisClient;
import com.taotao.rest.service.ContentService;


/**
 * 內容分類ServiceImpl
 * @Title: ContentServiceImpl
 * @author	xwp
 * @date	2017年1月14日下午11:31:56
 */
@Service
public class ContentServiceImpl implements ContentService {

	@Autowired
	private TbContentMapper contentMapper;
	@Autowired
	private JedisClient jedisClient;
	
	@Value("${INDEX_CONTENT_REDIS_KEY}")
	private String INDEX_CONTENT_REDIS_KEY;
	
	@Value("${REDIS_ITEM_EXPIRE}")
	private int REDIS_ITEM_EXPIRE;
	
	@Override
	public List<TbContent> getContentList(long contentCid) {
		//新增key= "id"
		String id = "" + contentCid;
		//新增redis的有效時間 
		jedisClient.expire(INDEX_CONTENT_REDIS_KEY, REDIS_ITEM_EXPIRE);
		//從快取中取內容
		try {
			//從redis快取中獲取key="id "的value的值
			String result = jedisClient.hget(INDEX_CONTENT_REDIS_KEY, contentCid + "");
			//System.out.println("contentCid1 : " + id + " \there1 : " + jedisClient.ttl(INDEX_CONTENT_REDIS_KEY));
			if (!StringUtils.isBlank(result)) {
				//把字串轉換成list
				List<TbContent> resultList = JsonUtils.jsonToList(result, TbContent.class);
				return resultList;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		//根據內容分類id查詢內容列表
		TbContentExample example = new TbContentExample();
		Criteria criteria = example.createCriteria();
		criteria.andCategoryIdEqualTo(contentCid);
		//執行查詢
		List<TbContent> list = contentMapper.selectByExample(example);
		//向快取中新增內容
		try {
			//把list轉換成字串
			String cacheString = JsonUtils.objectToJson(list);
			//System.out.println("contentCid : " + id + " \there : " + jedisClient.ttl(INDEX_CONTENT_REDIS_KEY));
			//如果該key不存在,返回-2,如果該key未設定存活時間,返回-1,如果設定過存活時間,則返回剩餘的存活秒數
			/**
			 * 如果沒有超時,則設定hash資料
			 */
			if (jedisClient.ttl(INDEX_CONTENT_REDIS_KEY) < 0) {
				jedisClient.hset(INDEX_CONTENT_REDIS_KEY, contentCid + "", cacheString);
			}else {
				/**
				 * 如果超時,則刪除
				 */
				jedisClient.hdel(INDEX_CONTENT_REDIS_KEY, id);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

}

新增redis的同步:

import java.util.Date;
import java.util.List;

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

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.common.pojo.EUDataGridResult;
import com.taotao.common.util.HttpClientUtil;
import com.taotao.common.util.TaotaoResult;
import com.taotao.mapper.TbContentMapper;
import com.taotao.pojo.TbContent;
import com.taotao.pojo.TbContentExample;
import com.taotao.pojo.TbContentExample.Criteria;
import com.taotao.service.ContentService;


/**
 * 內容分類ServiceImpl
 * @Title: ContentServiceImpl
 * @author	xwp
 * @date	2017年1月14日下午11:31:56
 */
@Service
public class ContentServiceImpl implements ContentService {

	@Autowired
	private TbContentMapper  contentMapper;
	@Value("${REST_BASE_URL}")
	private String REST_BASE_URL;
	@Value("${REST_CONTENT_SYNC_URL}")
	private String REST_CONTENT_SYNC_URL;
	
	@Override
	public TaotaoResult insertContent(TbContent content) {
		//補全pojo內容
		content.setCreated(new Date());
		content.setUpdated(new Date());
		contentMapper.insert(content);
		
		//新增redis快取同步邏輯
		try {
			HttpClientUtil.doGet(REST_BASE_URL + REST_CONTENT_SYNC_URL + content.getCategoryId());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return TaotaoResult.ok();
	}
}



相關推薦

關於redis快取時間過期處理 ----在專案的使用

一.專案目錄 二.關於redis處理類 JedisClient.java package com.taotao.rest.dao; public interface JedisClient { /** * 獲取String資料型別 * @param k

redis有效時間設定及時間過期處理

有效時間設定 Redis對儲存值的過期處理實際上是針對該值的鍵key處理的,即時間的設定也是設定key的有效時間。Expires字典儲存了所有鍵的過期時間,Expires也稱為過期欄位。 四種處理策略: (1)EXPIRE將key的生存時間設定為ttl 秒。 (2)P

java操作Redis快取設定過期時間

關於Redis的概念和應用本文就不再詳解了,說一下怎麼在java應用中設定過期時間。 在應用中我們會需要使用redis設定過期時間,比如單點登入中我們需要隨機生成一個token作為key,將使用者的資訊轉為json串作為value儲存在redis中,通常做法是: //生成

Redis】深入淺出Redis(三)——在專案使用Jedis對Redis操作

一、前言       在前幾篇部落格中小編向大家介紹了搭建單機版和叢集版的redis。雖然叢集搭建起來了,但是如何在專案中使用呢?在這篇部落格中,小編向大家介紹Jedis,用Jedis來對Redis進行增加、刪除、設定有效時間等操作。 二、什麼是Jedis?

千萬級使用者Redis快取叢集搭建以及專案實戰

Redis單機版搭建 3.1安裝redis ?版本說明 本教程使用redis3.0版本。3.0版本主要增加了redis叢集功能。 安裝的前提條件: 需要安裝 gcc:yum install gcc-c++ 1、下載redis的原始碼包。 2

Redis的安裝以及在專案使用Redis的一些總結和體會

第一部分:為什麼我的專案中要使用Redis 我知道有些地方沒說到位,希望大神們提出來,我會吸取教訓,大家共同進步! 註冊時郵件啟用的部分使用Redis 傳送郵件時使用Redis的訊息佇列,減輕網站壓力。 使用Lucene.Net在進行分詞時使用Redis訊息佇列和多執行緒來避免介面卡死等效能問

webpack4系列教程(四):處理專案的資原始檔(一)

傳送門: webpack4系列教程(一):初識webpack webpack4系列教程(二):建立專案,打包第一個JS檔案 webpack4系列教程(三):自動生成專案中的HTML檔案    1. Loader的使用 之前的博文已經介紹了Loader的

如何使用redis快取加索引處理資料庫百萬級併發

前言:事先說明:在實際應用中這種做法設計需要各位讀者自己設計,本文只提供一種思想。準備工作:安裝後本地數redis伺服器,使用mysql資料庫,事先插入1000萬條資料,可以參考我之前的文章插入資料,這裡不再細說。我大概的做法是這樣的,編碼使用多執行緒訪問我的資料庫,

redis增大查詢速度(專案實際應用舉例)

1、關於儲存User表的方案      1.1  使用Redis的Hash型別去儲存關係型資料庫的User表       1.2 redis的Hash的key為"SYS_USER_TABLE_SEX_MAN",field:userid   value:json 資料2、利用R

使用redis快取加索引處理資料庫百萬級併發

前言:事先說明:在實際應用中這種做法設計需要各位讀者自己設計,本文只提供一種思想。準備工作:安裝後本地數redis伺服器,使用mysql資料庫,事先插入1000萬條資料,可以參考我之前的文章插入資料,這裡不再細說。我大概的做法是這樣的,編碼使用多執行緒訪問我的資料庫,在訪問資料庫前先訪問redis快取

Android6.0執行時許可權處理(專案使用到的一種形式,沒有使用第三方庫)

相信大家都知道Android6.0之後的許可權申請跟之前的版本有一個很大的差別,那就是任何危險許可權都必須經過使用者的手動選擇是否接受來做相應的操作,而Android6.0之前安裝應用的過程中是預設選

Springboot+SpringCache+Redis快取過期時間失效問題

最近研究Spring+Redis快取時,發現Cacheable註解在方法體上標註了之後雖然能夠產生快取,但是在redis中的快取TIL是-1,介面返回的資料一直應用該快取,導致快取資料無法更新,網路上查詢發現大都是通過註解中配置方便每個方法自定義快取有效時間的方法。程式碼配置如下。 /*

vue專案,如何對static資料夾下的靜態檔案新增時間戳,以達到清除快取

例如config.js檔案是存放在static資料夾下,裡面存放的是websocket資訊,需要經常改動。改動了以後由於快取資訊,使其不生效,因此需要對引入的檔案新增時間戳。 方法如截圖所示: <script id="main"></script><script type="

redis 第 13 篇 工作記錄-在專案快取是如何使用的?快取如果使用不當會造成什麼後果?

    針對每一個技術,必須具備深入的瞭解,這個技術的更新活躍度,使用這個技術的優點,使用這個技術的缺點,不使用的缺點以及優點。如果不這樣的話,智只能說明自己平時思考的太少了,只知道幹活。 (1)為啥要使用快取 用快取,主要是倆用途,高效能和高併發 高效能

Spring專案新增Redis服務與快取同步問題

一、Redis應用場景      本專案使用redis對圖片進行快取儲存,展示圖片時,先根據圖片ID去Redis快取中查取,沒有再查資料庫,同時將該圖片set進Redis。      使用spring&nb

如何在web專案新增redis快取

redis 是什麼?這個應該是你做一下工作的前提,不明白的可以百科一下。如果你大概明白了redis的工作原理。那麼請繼續往下看: 一。首先你需要明白,為什麼要在你的專案中使用redis快取? 現在很多應用程式要儲存結構簡單更新頻繁的資料,在我看來,字典表裡的資料就是儲存結構簡單且更新頻繁的資料,因

Redis快取過期處理

1、Redis快取過期處理。         1.2、設定一天的過期時間。 redisTemplate.opsForValue().set("article_" + id, article,1, TimeUnit.DAYS);   &nb

專案redis快取的一些思路

首先,快取的物件有三種: 1:資料庫中單條的的資料(以表名跟id作為key永久儲存到redis),在有更新的地方都要更新快取(不適用於需要經常更新的資料); 2:對於一些不分頁,不需要實時(需要多表查詢)的列表,我們可以將列表結果快取到redis中,設定一定快取時間作為該資

快取第四篇:在maven專案使用redis例項

本節利用之前ssm+ehcache搭建好的ssm框架進行改造,其中的ehcache部分已經棄掉,防止ehcache快取的存在對這裡的redis快取的判斷。又整合了redis內容和日誌內容,利用控制檯日誌輸出看快取有沒有起作用。注意點比較多,我準備了差不多幾

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十五節--快取小結與ABP框架專案 Redis Cache的實現

快取 為什麼要用快取 為什麼要用快取呢,說快取之前先說使用快取的優點。 減少寄宿伺服器的往返呼叫(round-trips)。 如果快取在客戶端或是代理,將減少對伺服器的請求,減少頻寬。 減少對資料庫伺服器的往返呼叫(round-trips)。 當內容快取在web伺服器,能夠減輕對資料庫的請求。 減少網路