本篇文章主要介紹了"Spring+Redis集成+關係型資料庫持久化",主要涉及到Spring+Redis集成+關係型資料庫持久化方面的內容,對於Spring+Redis集成+關係型資料庫持久化感興趣的同學可以參考一下。上海尚學堂大數據培訓組原作spring文章,陸續大數據相關技術文章奉上,請多關註 ...
本篇文章主要介紹了"Spring+Redis集成+關係型資料庫持久化",主要涉及到Spring+Redis集成+關係型資料庫持久化方面的內容,對於Spring+Redis集成+關係型資料庫持久化感興趣的同學可以參考一下。上海尚學堂大數據培訓組原作spring文章,陸續大數據相關技術文章奉上,請多關註!
最近研究Spring-Redis集成的問題,在網上搜了很多,但是都是沒有營養的資料,最後根據Spring和Redis官方文檔加上不斷實踐,琢磨出的一點心得。 Redis是一個分散式的記憶體對象緩存系統,在我們的Web應用上集成中,有的用作持久化框架的二級緩存,有的用作一個單獨的緩存系統,兩者最終目的都是為了減小資料庫伺服器的壓力,如果將Redis用作持久化框架的二級緩存,則顯得有點大才小用,所以,我們將它獨立出來,也方便以後的Redis集群。 在Spring-Redis集成中,在Spring的官方網站上有個Project是Spring-data-redis,其中就有我們需要的東西! 我們需要的jar包有兩個:
1)spring-data-redis-1.1.1.RELEASE.jar
2)需要redis的java客戶端,比較流行的java客服端有Jedis、JRedis,這裡我們用最popular的Jedis客戶端,jedis-2.1.0.jar
一、Spring的配置文件 官方的Jedis的Spring的配置文件如下: 如果採用模板的話,配置文件如下:
在這裡我們需要進行修改,自定義自己的Spring配置文件,而且我們採用連接池的方式,從連接池中獲取連接,Spring配置文件如下:
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" > <!-- 最大活躍連接數 -->
<property name="maxActive" value="20" /> <!-- 最大閑置數量 -->
<property name="maxIdle" value="20" /> <!-- 最大等待時間 -->
<property name="maxWait" value="1000" /> <!-- 調用borrow 一個對象方法時,是否檢查其有效性 -->
<property name="testOnBorrow" value="true"/> <!-- 調用return 一個對象方法時,是否檢查其有效性 -->
<property name="testOnReturn" value="ture"/>
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<!-- redis所在的ip -->
<property name="hostName" value="192.168.1.200"/>
<!-- redis的埠 -->
<property name="port" value="6379"/>
<!-- 是否啟用連接池 -->
<property name="usePool" value="true"/>
<!-- 連接池的配置參考 -->
<property name="poolConfig" ref="jedisPoolConfig" />
</bean> 這樣,在我們需要用到jedisConnectionFactory的類中,將jedisConnectionFactory註入進去,並從這個工廠獲取JedisConnection對象。
二、測試
1)實體類:
public class Student implements Serializable { /** * */
private static final long serialVersionUID = 3951779424645593223L; private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; }
}
2)用Mybatis作為持久化框架,我們的Mapper是用註解形式寫的:
public interface StudentMapper{
@Insert("insert into user(name,age) values(#{name},#{age})")
@Options(useGeneratedKeys=true,keyProperty="id")
int insert(Student student);
@Select("select * from user where id = #{id}")
Student queryById(@Param("id")int id);
}
3)service的實現類
public class StudentServiceImpl extends BaseService implements IStudentService{
private StudentMapper studentMapper;
private JedisConnectionFactory jedisConnectionFactory;
@Override
public void add(Student student){
studentMapper = writableSQLSession.getMapper(StudentMapper.class);
int id = studentMapper.insert(student);
System.out.println(id);
JedisConnection connection = jedisConnectionFactory.getConnection();
Map<byte[],byte[]> map = new HashMap<byte[],byte[]>();
map.put(SerializableUtil.serialize("name"), SerializableUtil.serialize(student.getName()));
map.put(SerializableUtil.serialize("age"), SerializableUtil.serialize(student.getAge()));
connection.hMSet(SerializableUtil.serialize(id), map);
}
@Override
public Student queryById(int id){
JedisConnection connection = jedisConnectionFactory.getConnection();
Map<byte[],byte[]> map = connection.hGetAll(SerializableUtil.serialize(id));
if(map.size() > 0){
System.out.println("----進緩存----");
byte[] byteName = map.get(SerializableUtil.serialize("name"));
byte[] byteAge = map.get(SerializableUtil.serialize("age"));
String name = SerializableUtil.unserialize(byteName).toString();
int age = Integer.valueOf(SerializableUtil.unserialize(byteAge).toString());
System.out.println(name);
System.out.println(age);
Student student = new Student();
student.setAge(age);
student.setName(name);
return student;
}else{
System.out.println("----進資料庫----");
studentMapper = readonlySQLSession.getMapper(StudentMapper.class);
return studentMapper.queryById(id);
}
}
public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
this.jedisConnectionFactory = jedisConnectionFactory;
}
}
註意:
1)這裡我用的資料庫session是做了讀寫分離,並封裝進BaseService中,在你做的時候,把它換成你自己的資料庫Session就可以了!
2)存數據:
這裡我用的向緩存中存對象的方法是用HashMap存的,這個和普通的鍵值對存放的方式有不同。
(1)普通鍵值對存放方式:
*************************************
* key * value *
* ***********************************
* key1 * value1 *
* key2 * value2 *
* key3 * value3 *
* ***********************************
(2)hashmap存放方式
例如我們存放Student對象,id:1,name:student1,age:18,其存放方式為:
***********************************************************
* key * value *
***********************************************************
* 1 * key * value * *
***************************************
* * name * student *
* * age * 18 *
***********************************************************
這樣存的好處是鍵值對中的值也是採用鍵值對的方式進行存儲,方便我們取值。
3)取數據:
我們首先根據序列化之後的id,去緩存中取,也是採用hashmap這種方式去取值,同時判斷這個map的大小,如果有值,則取value中的值進行反序列化,然後返回對象,如果沒有,則進資料庫中去取值,然後在放入緩存中!
測試類:
public class TestRedis{
static IStudentService service;
@BeforeClass
public static void setUpBefor(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext/applicationContext.xml");
service = (IStudentService) context.getBean("studentService"); }
@Test
public void testAdd(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext/applicationContext.xml");
IStudentService service = (IStudentService) context.getBean("studentService");
Student student = new Student();
student.setName("student1");
student.setAge(29);
service.add(student);
}
@Test
public void testQuery(){
int id = 10;
Student student = service.queryById(id);
System.out.println(student);
}
}
存的時候緩存中是這樣的: 基本上集成並且帶持久化就是這樣的,這僅是我個人的一點學習心得!