redis是現在主流的緩存工具了,因為使用簡單、高效且對服務器要求較小,用於大數據量下的緩存。
Redis 特點
1、Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
2、Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
3、Redis支持數據的備份,即master-slave模式的數據備份。
Redis 優勢
1、性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
2、豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
3、原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
4、豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis 項目部署
一、整體思路
1、參考Ehcache實現MyBatis二級緩存代碼(Maven引用對應jar查閱)
2、使用Spring管理Redis連接池
3、模仿EhcacheCache,實現RedisCache
二、pom.xml中加入Maven
org.springframework.data
spring-data-redis
1.6.2.RELEASE
redis.clients
jedis
2.8.0
org.mybatis
mybatis-ehcache
1.0.0
三、引入applicationContext.xml中引入redis配置
classpath:jdbc.properties
classpath:redis.properties
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>
四、創建緩存實現類RedisCache
/**
*
* @描述: 使用第三方內存數據庫Redis作為二級緩存
* @版權: Copyright (c) 2016
* @作者: xiad
* @版本: 1.0
* @創建日期: 2016年3月2日
* @創建時間: 下午8:02:57
*/
public class RedisCache implements Cache
{
private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
private static JedisConnectionFactory jedisConnectionFactory;
private final String id;
/**
* The {@code ReadWriteLock}.
*/
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public RedisCache(final String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
}
logger.debug("MybatisRedisCache:id=" + id);
this.id = id;
}
@Override
public void clear()
{
JedisConnection connection = null;
try
{
connection = jedisConnectionFactory.getConnection();
connection.flushDb();
connection.flushAll();
}
catch (JedisConnectionException e)
{
e.printStackTrace();
}
finally
{
if (connection != null) {
connection.close();
}
}
}
@Override
public String getId()
{
return this.id;
}
@Override
public Object getObject(Object key)
{
Object result = null;
JedisConnection connection = null;
try
{
connection = jedisConnectionFactory.getConnection();
RedisSerializer
五、創建中間類RedisCacheTransfer,完成靜態注入
/**
*
* @描述: 靜態注入中間類
* @版權: Copyright (c) 2016
* @作者: xiad
* @版本: 1.0
* @創建日期: 2016年3月2日
* @創建時間: 下午8:02:57
*/
public class RedisCacheTransfer
{
@Autowired
public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
RedisCache.setJedisConnectionFactory(jedisConnectionFactory);
}
}
六、配置文件redis.properties
# Redis settings
redis.host=192.168.25.132
redis.port=6379
redis.pass=
redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true
七、mapper中加入MyBatis二級緩存
.....
八、Mybatis全局配置
br> PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
九、打印Sql日誌,方便測試
#定義LOG輸出級別為INFO
log4j.rootLogger=INFO,Console,File
####定義日誌輸出目的地為控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以靈活地指定日誌輸出格式,下面一行是指定具體的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
####文件大小到達指定尺寸的時候產生一個新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定輸出目錄
log4j.appender.File.File = logs/ssm.log
#定義文件最大大小
log4j.appender.File.MaxFileSize = 10MB
#輸出所以日誌,如果換成DEBUG表示輸出DEBUG以上級別日誌
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
####顯示本項目SQL語句部分
log4j.logger.com.strive.cms=DEBUG
十、測試代碼
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class MyBatisCacheSecondTest
{
private static final Logger logger = LoggerFactory.getLogger(MyBatisCacheSecondTest.class);
@Autowired
private SiteService service;
/*
* 二級緩存測試
*/
@Test
public void testCache2() {
PageInfopage1 = service.querySite("", 1, 2, "", "");
logger.info(page1.getList().get(1).getName());
PageInfopage2 = service.querySite("", 2, 2, "", "");
logger.info(page2.getList().get(0).getName());
PageInfopage3 = service.querySite("", 1, 2, "", "");
logger.info(page3.getList().get(0).getName());
}
}
首次運行結果
後續運行結果
同條件的查詢語句可以發現,已經不再查詢Mysql,而是直接取Redis數據。
查看Redis數據庫 keys *, 會發現多了很多數據,結果如下 :
至此,Redis基本配置成功。如果大家有興趣,可以自行系統的學習redis緩存,學完之後,你會發現redis的諸多精闢之處。
加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群號是:338549832 對了 小白勿進 最好是有開發經驗
注:加群要求
1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
閱讀更多 java開發者 的文章