Spring+Redis集成+關係型數據庫持久化

本篇文章主要介紹了"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);      }  }  存的時候緩存中是這樣的: 基本上集成而且帶持久化就是這樣的,這僅是我我的的一點學習心得!
相關文章
相關標籤/搜索