本篇文章主要介紹了"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 1、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對象。 2、測試 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); } } 存的時候緩存中是這樣的: 基本上集成而且帶持久化就是這樣的,這僅是我我的的一點學習心得!