日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

16-1 Redis分布式缓存引入与保存缓存功能实现

發(fā)布時(shí)間:2023/12/3 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 16-1 Redis分布式缓存引入与保存缓存功能实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

16-1 Redis分布式緩存引入與保存緩存功能實(shí)現(xiàn)

現(xiàn)在功能已經(jīng)完成了,但是我們還是要考慮一下性能問(wèn)題,現(xiàn)在任何請(qǐng)求都是要到數(shù)據(jù)庫(kù)中查詢(xún)很多的數(shù)據(jù),才能知道當(dāng)前的用戶(hù)是否有權(quán)限可以訪問(wèn)當(dāng)前的url,當(dāng)我們的請(qǐng)求量很大時(shí),它對(duì)我們數(shù)據(jù)庫(kù)的請(qǐng)求量也是非常大的,這時(shí),我們就會(huì)想到對(duì)我們的權(quán)限進(jìn)行緩存,

這里就講一下權(quán)限的緩存如何進(jìn)行,

這里使用的是redis

<?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.properties" /><!-- 定義連接池 --><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" /><!-- 這個(gè)bean非常重要 --><bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton" > <!-- 上面定義的連接池 --><constructor-arg index="0" ref="jedisPoolConfig" /><constructor-arg index="1"><list> <!-- 連接池的信息 讀取配置文件 --><bean class="redis.clients.jedis.JedisShardInfo"><constructor-arg name="host" value="${redis.host}"/><constructor-arg name="port" value="${redis.port}"/><constructor-arg name="timeout" value="${redis.timeout}"/></bean></list></constructor-arg></bean></beans>

?

redis.host=127.0.0.1 redis.port=6379 redis.timeout=3000

?

?

**************************************************************************************************************************************

?

?

package com.mmall.service;import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool;import javax.annotation.Resource;// 封裝一下radis @Service("redisPool")//加注釋讓spring來(lái)管理 @Slf4j public class RedisPool {// 使用剛剛定義的spring管理的類(lèi)radis@Resource(name = "shardedJedisPool")//直接調(diào)用radis了 單例的servieceprivate ShardedJedisPool shardedJedisPool;//返回單例的實(shí)例public ShardedJedis instance() {return shardedJedisPool.getResource();}//安全關(guān)閉的方法public void safeClose(ShardedJedis shardedJedis) {try {if (shardedJedis != null) {shardedJedis.close();}} catch (Exception e) {log.error("return redis resource exception", e);}} }

?

?

********************************************************************************************************************************

?

package com.mmall.service;import com.google.common.base.Joiner; import com.mmall.beans.CacheKeyConstants; import com.mmall.util.JsonMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis;import javax.annotation.Resource;@Service @Slf4j public class SysCacheService {//引用剛定義的reaispool@Resource(name = "redisPool")private RedisPool redisPool;/**** @param toSavedValue 要保存的值* @param timeoutSeconds 要保存多少秒* @param prefix 前綴 自定義*/public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix) {//調(diào)用下面的方法saveCache(toSavedValue, timeoutSeconds, prefix, null);}//保存cachepublic void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix, String... keys) {if (toSavedValue == null) {return;}ShardedJedis shardedJedis = null;//網(wǎng)絡(luò)連接可能會(huì)有問(wèn)題 try catchtry {//1.生成對(duì)應(yīng)的keyString cacheKey = generateCacheKey(prefix, keys);//拼接key 系統(tǒng)所有權(quán)限大家一樣 但是單個(gè)用戶(hù)權(quán)限大家不一樣//2.拿到資源shardedJedis = redisPool.instance();//單例獲取redis//提供好的方法處理 一定要寫(xiě)radis 的apishardedJedis.setex(cacheKey, timeoutSeconds, toSavedValue);} catch (Exception e) {log.error("save cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);} finally {//別忘了釋放radisredisPool.safeClose(shardedJedis);}}//獲取cache// 參數(shù) 前綴 keypublic String getFromCache(CacheKeyConstants prefix, String... keys) {ShardedJedis shardedJedis = null;String cacheKey = generateCacheKey(prefix, keys);//拼接key 系統(tǒng)所有權(quán)限大家一樣 但是單個(gè)用戶(hù)權(quán)限大家不一樣try {shardedJedis = redisPool.instance();//單例獲取redisString value = shardedJedis.get(cacheKey);//獲取值return value;//返回值} catch (Exception e) {log.error("get from cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);return null;} finally {//別忘了釋放radisredisPool.safeClose(shardedJedis);}}private String generateCacheKey(CacheKeyConstants prefix, String... keys) {String key = prefix.name();//多個(gè)string可以進(jìn)行拼接if (keys != null && keys.length > 0) {key += "_" + Joiner.on("_").join(keys);}return key;} }

package com.mmall.beans;import lombok.Getter;@Getter public enum CacheKeyConstants {SYSTEM_ACLS,//緩存系統(tǒng)內(nèi)的所有權(quán)限USER_ACLS;//緩存用戶(hù)的權(quán)限}

?

?

********************************************************************************************************************************

//從緩存中獲取數(shù)據(jù)public List<SysAcl> getCurrentUserAclListFromCache() {//userIdint userId = RequestHolder.getCurrentUser().getId();//通過(guò)key獲取valueString cacheValue = sysCacheService.getFromCache(CacheKeyConstants.USER_ACLS, String.valueOf(userId));if (StringUtils.isBlank(cacheValue)) {//為空說(shuō)明出問(wèn)題了 重新獲取一次List<SysAcl> aclList = getCurrentUserAclList();if (CollectionUtils.isNotEmpty(aclList)) {//重新保存 value 600s有效期 key的值(前綴和userid)sysCacheService.saveCache(JsonMapper.obj2String(aclList), 600, CacheKeyConstants.USER_ACLS, String.valueOf(userId));}return aclList;//沒(méi)從cache中獲取到值從數(shù)據(jù)庫(kù)取出來(lái)}//緩存中有return JsonMapper.string2Obj(cacheValue, new TypeReference<List<SysAcl>>() {});} }

********************************************************************************************************************************

?

?

?

?

?

?

?

?

?

不是每個(gè)方法都要緩存的

有些必須是實(shí)時(shí)數(shù)據(jù)不就不能進(jìn)行緩存

不需要進(jìn)行特別多的數(shù)據(jù)訪問(wèn)? 就不要緩存

?

********************************************************************************************************************************

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

********************************************************************************************************************************

?

?

?

?

********************************************************************************************************************************

?

?

?

?

********************************************************************************************************************************

?

?

?

?

********************************************************************************************************************************

?

?

?

?

********************************************************************************************************************************

?

?

?

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的16-1 Redis分布式缓存引入与保存缓存功能实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。