當前位置:首頁 » 文件管理 » redis資料庫緩存

redis資料庫緩存

發布時間: 2022-11-05 21:33:40

『壹』 redis緩存原理

redis緩存原理是sql語句時key值,查詢結果resultSet是value,當同一個查詢語句訪問時(select * from t_proct),只要曾經查詢過,調用緩存直接返回resultSet,節省了資料庫讀取磁碟數據的時間。

redis的存儲分為內存存儲、磁碟存儲和log文件三部分,配置文件中有三個參數對其進行配置。

save seconds updates,save配置,指出在多長時間內,有多少次更新操作,就將數據同步到數據文件。這個可以多個條件配合,比如默認配置文件中的設置,就設置了三個條件。

appendonly yes/no ,appendonly配置,指出是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為redis本身同步數據文件是按上面的save條件來同步的,所以有的數據會在一段時間內只存在於內存中。

(1)redis資料庫緩存擴展閱讀

redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。

Redis支持主從同步。數據可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹復制。

存檔可以有意無意的對數據進行寫操作。由於完全實現了發布/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的消息發布記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。

redis的官網地址,redis.io。(域名後綴io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地)

『貳』 windows環境下Redis+Spring緩存實例

一、Redis了解

1.1、Redis介紹:

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

Redis資料庫完全在內存中,使用磁碟僅用於持久性。相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。Redis可以將數據復制到任意數量的從伺服器。

1.2、Redis優點:

(1)異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。

(2)支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。

(3)操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis伺服器將獲得更新後的值。

(4)多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發布/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。

1.3、Redis缺點:

(1)單線程

(2)耗內存

二、64位windows下Redis安裝

Redis官方是不支持windows的,但是Microsoft Open Tech group 在 GitHub上開發了一個Win64的版本,下載地址:https://github.com/MSOpenTech/redis/releases。注意只支持64位哈。

小寶鴿是下載了Redis-x64-3.0.500.msi進行安裝。安裝過程中全部採取默認即可。

安裝完成之後可能已經幫你開啟了Redis對應的服務,博主的就是如此。查看資源管理如下,說明已經開啟:

已經開啟了對應服務的,我們讓它保持,下面例子需要用到。如果沒有開啟的.,我們命令開啟,進入Redis的安裝目錄(博主的是C:Program FilesRedis),然後如下命令開啟:

redis-server redis.windows.conf

OK,下面我們進行實例。

三、詳細實例

本工程採用的環境:Eclipse + maven + spring + junit

3.1、添加相關依賴(spring+junit+redis依賴),pom.xml:

4.0.0 com.luo redis_project 0.0.1-SNAPSHOT 3.2.8.RELEASE 4.10 org.springframework spring-core ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-context-support ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-aspects ${spring.version} org.springframework spring-tx ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-web ${spring.version} junit junit ${junit.version} test org.springframework spring-test ${spring.version} test org.springframework.data spring-data-redis 1.6.1.RELEASE redis.clients jedis 2.7.3

3.2、spring配置文件application.xml:

<"1.0" encoding="UTF-8"> classpath:properties/*.properties

3.3、Redis配置參數,redis.properties:

#redis中心#綁定的主機地址redis.host=127.0.0.1#指定Redis監聽埠,默認埠為6379redis.port=6379#授權密碼(本例子沒有使用)redis.password=123456 #最大空閑數:空閑鏈接數大於maxIdle時,將進行回收redis.maxIdle=100 #最大連接數:能夠同時建立的「最大鏈接個數」redis.maxActive=300 #最大等待時間:單位msredis.maxWait=1000 #使用連接時,檢測連接是否成功 redis.testOnBorrow=true#當客戶端閑置多長時間後關閉連接,如果指定為0,表示關閉該功能redis.timeout=10000

3.4、添加介面及對應實現RedisTestService.Java和RedisTestServiceImpl.java:

package com.luo.service; public interface RedisTestService { public String getTimestamp(String param);}

package com.luo.service.impl; import org.springframework.stereotype.Service;import com.luo.service.RedisTestService; @Servicepublic class RedisTestServiceImpl implements RedisTestService { public String getTimestamp(String param) { Long timestamp = System.currentTimeMillis(); return timestamp.toString(); } }

3.5、本例採用spring aop切面方式進行緩存,配置已在上面spring配置文件中,對應實現為MethodCacheInterceptor.java:

package com.luo.redis.cache; import java.io.Serializable;import java.util.concurrent.TimeUnit;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations; public class MethodCacheInterceptor implements MethodInterceptor { private RedisTemplate redisTemplate; private Long defaultCacheExpireTime = 10l; // 緩存默認的過期時間,這里設置了10秒 public Object invoke(MethodInvocation invocation) throws Throwable { Object value = null; String targetName = invocation.getThis().getClass().getName(); String methodName = invocation.getMethod().getName(); Object[] arguments = invocation.getArguments(); String key = getCacheKey(targetName, methodName, arguments); try { // 判斷是否有緩存 if (exists(key)) { return getCache(key); } // 寫入緩存 value = invocation.proceed(); if (value != null) { final String tkey = key; final Object tvalue = value; new Thread(new Runnable() { public void run() { setCache(tkey, tvalue, defaultCacheExpireTime); } }).start(); } } catch (Exception e) { e.printStackTrace(); if (value == null) { return invocation.proceed(); } } return value; } /** * 創建緩存key * * @param targetName * @param methodName * @param arguments */ private String getCacheKey(String targetName, String methodName, Object[] arguments) { StringBuffer sbu = new StringBuffer(); sbu.append(targetName).append("_").append(methodName); if ((arguments != null) && (arguments.length != 0)) { for (int i = 0; i < arguments.length; i++) { sbu.append("_").append(arguments[i]); } } return sbu.toString(); } /** * 判斷緩存中是否有對應的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 讀取緩存 * * @param key * @return */ public Object getCache(final String key) { Object result = null; ValueOperations operations = redisTemplate .opsForValue(); result = operations.get(key); return result; } /** * 寫入緩存 * * @param key * @param value * @return */ public boolean setCache(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations operations = redisTemplate .opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } public void setRedisTemplate( RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; }}

3.6、單元測試相關類:

package com.luo.baseTest; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; //指定bean注入的配置文件 @ContextConfiguration(locations = { "classpath:application.xml" }) //使用標準的JUnit @RunWith注釋來告訴JUnit使用Spring TestRunner @RunWith(SpringJUnit4ClassRunner.class) public class SpringTestCase extends { }

package com.luo.service; import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired; import com.luo.baseTest.SpringTestCase; public class RedisTestServiceTest extends SpringTestCase { @Autowired private RedisTestService redisTestService; @Test public void getTimestampTest() throws InterruptedException{ System.out.println("第一次調用:" + redisTestService.getTimestamp("param")); Thread.sleep(2000); System.out.println("2秒之後調用:" + redisTestService.getTimestamp("param")); Thread.sleep(11000); System.out.println("再過11秒之後調用:" + redisTestService.getTimestamp("param")); } }

3.7、運行結果:

四、源碼下載:redis-project().rar

以上就是本文的全部內容,希望對大家的學習有所幫助。

『叄』 移動雲雲資料庫Redis有什麼產品功能緩存應用怎麼樣

首先雲資料庫Redis是一款內存型資料庫,雲資料庫Redis應用場景還挺多的,可用於游戲緩存、互聯網緩存、電商高並發,所以緩存應用是redis最為普遍的用途,各行各業都適用!

『肆』 redis怎麼作為mysql的緩存

1,redis是一種內存性的數據存儲服務,所以它的速度要比mysql快。
2,redis只支持String,hashmap,set,sortedset等基本數據類型,但是不支持聯合查詢,所以它適合做緩存。
3,有時候緩存的數據量非常大,如果這個時候服務宕機了,且開啟了redis的持久化功能,重新啟動服務,數據基本上不會丟。
4,redis可以做內存共享,因為它可以被多個不同的客戶端連接。
5,做為mysql等資料庫的緩存,是把部分熱點數據先存儲到redis中,或第一次用的時候載入到redis中,下次再用的時候,直接從redis中取。
6,redis中的數據可以設置過期時間expire,如果這個數據在一定時間內沒有被延長這個時間,那個一定時間之後這個數據就會從redis清除。
所以,redis只是用來緩存資料庫中經常被訪問的數據,可以增加訪問速度和並發量。而mysql只是提供一種數據備份和數據源的作用。

『伍』 Redis是什麼緩存機制

redis(RemoteDictionaryServer)遠程數據服務

內存高速緩存資料庫。C語言編寫,數據模型為key-value,NoSql資料庫。

希望對你有所啟發。apeit-程序猿IT中redis章節講的不錯,由淺入深,適合入門學習。

『陸』 一個面試問題,為什麼用redis做緩存

redis不是資料庫,只是一種緩存軟體,為了緩解伺服器頻繁讀資料庫帶來的內存資源消耗,redis將需要和資料庫交互的信息暫存,當下次同樣的http請求,就能直接讀取redis裡面的內容,而不用讀資料庫。這樣減少了資料庫壓力又能提高伺服器響應時間。望您能採納呀。

『柒』 redis怎麼緩存sql數據

利用redis做緩存伺服器來緩解資料庫查詢壓力是非常有效也是非常有必要的, 當用戶第一次點擊頁面的時候查詢資料庫, 然後將查詢結果緩存在redis伺服器中,緩存時間隨你的數據改變時間而定,這樣可大大降低資料庫壓力;下面是具體函數方法;

public function getSqlVal(){
//獲取參數列表,這個參數隨你需求而定,一般可能需要傳入dbname,查詢方式如fetchAll,查詢語句等
$argv = func_get_args();
//假設這里現在只傳入dbName和sql語句
$dbName = $argv[0];
$sql = $argv[1];
//現在把這個參數列表轉成md5之後作為存redis的key值
$md5SqlKey = MD5(serialize($argv));

//下面通過一個redis函數來進行存取數據
$res = getRedisData($md5SqlKey);
//如果取到數據,說明已經緩存在redis伺服器中, 直接取數據就好, 如果沒有數據, 則再去資料庫查詢數據,再講查詢的數據存在redis伺服器中
if(!empty($res)) {
return $res;
}
//後面是查詢資料庫操作,查詢結果返回在$res中
getRedisData($md5SqlKey,$res); //講返回結果存在redis中
return $res;

}

public function getSqlVal(){
//獲取參數列表,這個參數隨你需求而定,一般可能需要傳入dbname,查詢方式如fetchAll,查詢語句等
$argv = func_get_args();
//假設這里現在只傳入dbName和sql語句
$dbName = $argv[0];
$sql = $argv[1];
//現在把這個參數列表轉成md5之後作為存redis的key值
$md5SqlKey = MD5(serialize($argv));

//下面通過一個redis函數來進行存取數據
$res = getRedisData($md5SqlKey);
//如果取到數據,說明已經緩存在redis伺服器中, 直接取數據就好, 如果沒有數據, 則再去資料庫查詢數據,再講查詢的數據存在redis伺服器中
if(!empty($res)) {
return $res;
}
//後面是查詢資料庫操作,查詢結果返回在$res中
getRedisData($md5SqlKey,$res); //講返回結果存在redis中
return $res;

}

『捌』 該怎麼解決 Redis 緩存穿透和緩存雪崩問題

緩存雪崩: 由於緩存層承載著大量請求,有效地 保護了存儲層,但是如果緩存層由於某些原因不能提供服務,比如 Redis 節點掛掉了,熱點 key 全部失效了,在這些情況下,所有的請求都會直接請求到資料庫,可能會造成資料庫宕機的情況。
預防和解決緩存雪崩問題,可以從以下三個方面進行著手:
1、使用 Redis 高可用架構:使用 Redis 集群來保證 Redis 服務不會掛掉
2、緩存時間不一致: 給緩存的失效時間,加上一個隨機值,避免集體失效
3、限流降級策略:有一定的備案,比如個性推薦服務不可用了,換成熱點數據推薦服務
緩存穿透: 緩存穿透是指查詢一個根本不存在的數據,這樣的數據肯定不在緩存中,這會導致請求全部落到資料庫上,有可能出現資料庫宕機的情況。
預防和解決緩存穿透問題,可以考慮以下兩種方法:
1、緩存空對象: 將空值緩存起來,但是這樣就有一個問題,大量無效的空值將佔用空間,非常浪費。
2、布隆過濾器攔截: 將所有可能的查詢key 先映射到布隆過濾器中,查詢時先判斷key是否存在布隆過濾器中,存在才繼續向下執行,如果不存在,則直接返回。布隆過濾器有一定的誤判,所以需要你的業務允許一定的容錯性。

『玖』 Redis緩存雪崩就這么簡單

在實際項目開發中,我們都知道Redis不可能把所有的數據都緩存起來( 內存昂貴且有限 ),所以Redis需要對數據設置過期時間,並採用的是惰性刪除+定期刪除兩種策略對過期鍵刪除。

如果緩存數據 設置的過期時間是相同 的,並且Redis恰好將這部分數據全部刪光了。這就會導致在這段時間內,這些緩存 同時失效 ,全部請求到資料庫中。

這就是緩存雪崩

緩存雪崩如果發生了,很可能就把我們的資料庫 搞垮 ,導致整個服務癱瘓,造成的後果很嚴重。

對緩存數據設置相同的過期時間,導致某段時間內緩存失效。」

對於「Redis掛掉了」,我們可以有以下的思路:

熱點內容
負數冪演算法 發布:2024-10-06 18:29:48 瀏覽:350
iphone手機id密碼是多少位 發布:2024-10-06 18:29:46 瀏覽:839
易經隔骨演算法真的准嗎 發布:2024-10-06 18:29:44 瀏覽:44
資料庫有損壞 發布:2024-10-06 18:29:43 瀏覽:311
數據結構對演算法的影響 發布:2024-10-06 18:21:28 瀏覽:32
伺服器託管ip不變 發布:2024-10-06 18:21:20 瀏覽:422
網盤加密軟體 發布:2024-10-06 18:16:17 瀏覽:123
兒童配置保險怎麼買 發布:2024-10-06 18:07:32 瀏覽:733
ipad存儲器 發布:2024-10-06 18:00:07 瀏覽:534
c語言void返回值 發布:2024-10-06 18:00:02 瀏覽:320