Spring+Mybatis基於註解整合Redis

来源:http://www.cnblogs.com/Revel-sl/archive/2016/09/05/5841861.html
-Advertisement-
Play Games

基於這段時間折騰redis遇到了各種問題,想著整理一下。本文主要介紹基於Spring+Mybatis以註解的形式整合Redis。廢話少說,進入正題。 首先準備Redis,我下的是Windows版,下載後直接啟動redis-server就行了,見下圖: 一,先上jar包 二,創建實體類 三,dao介面 ...


  基於這段時間折騰redis遇到了各種問題,想著整理一下。本文主要介紹基於Spring+Mybatis以註解的形式整合Redis。廢話少說,進入正題。

  首先準備Redis,我下的是Windows版,下載後直接啟動redis-server就行了,見下圖:

  

一,先上jar包

  

二,創建實體類     

 1 package com.sl.user.vo;
 2 
 3 import java.io.Serializable;
 4 
 5 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
 6 import com.fasterxml.jackson.databind.annotation.JsonNaming;
 7 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 8 
 9 @JsonSerialize  
10 @JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)  
11 public class UserVO implements Serializable{
12 
13     private static final long serialVersionUID = 1L;
14     
15     private int id;
16     private String username;
17     private String password;
18     private int age;
19     
20     public UserVO(){
21         super(); 
22     }
23     
24     public UserVO(int id, String username, String password, int age) {
25         super();
26         this.id = id;
27         this.username = username;
28         this.password = password;
29         this.age = age;
30     }
31 
32     public int getId() {
33         return id;
34     }
35 
36     public void setId(int id) {
37         this.id = id;
38     }
39 
40     public String getUsername() {
41         return username;
42     }
43 
44     public void setUsername(String username) {
45         this.username = username;
46     }
47 
48     public String getPassword() {
49         return password;
50     }
51 
52     public void setPassword(String password) {
53         this.password = password;
54     }
55 
56     public int getAge() {
57         return age;
58     }
59 
60     public void setAge(int age) {
61         this.age = age;
62     }
63 
64     @Override
65     public String toString() {
66         return "UserVO [id=" + id + ", username=" + username + ", password="
67                 + password + ", age=" + age + "]";
68     }
69 
70 }

三,dao介面

 1 package com.sl.user.dao;
 2 
 3 import com.sl.user.vo.UserVO;
 4 
 5 public interface UserDao {
 6     
 7     public void addUser(UserVO user);
 8     
 9     public void deleteUser(UserVO user);
10     
11     public void updateUser(UserVO user);
12     
13     public UserVO getUserById(int id);
14     
15     public UserVO getUser(int id);
16     
17 }

四,UserMapper

 1 <?xml version="1.0" encoding="UTF-8" ?>  
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  
 3 <mapper namespace="com.sl.user.dao.UserDao" >
 4     
 5     <resultMap id="userResult" type="User">
 6         <result column="id" property="id"/>
 7         <result column="userame" property="userame"/>
 8         <result column="password" property="password"/>
 9         <result column="age" property="age"/>
10     </resultMap>
11     
12     <insert id="addUser" parameterType="User">
13         insert into t_user(username,password,age) values(#{username},#{password},#{age})
14     </insert>
15     
16     <update id="deleteUser" parameterType="User">
17         delete * from t_user where id = #{id}
18     </update>
19     
20     <update id="updateUser" parameterType="User">
21         update t_user set
22         <if test="username != null and username != ''"> username = #{username},</if>
23         <if test="password != null and password != ''"> password = #{password},</if>
24         <if test="age != null and age != ''"> age = #{age}</if>
25         where 1=1
26         <if test="id != null and id != ''">and id = #{id}</if>
27         
28     </update>
29     
30     <select id="getUser" parameterType="int" resultType="User" >
31         select * from t_user where id = #{id}
32     </select>
33     
34     <select id="getUserById" parameterType="int" resultType="java.lang.String" >
35         select username from t_user where id = #{id}
36     </select>
37     
38 </mapper>  

五,Service介面

 1 package com.sl.user.service;
 2 
 3 import com.sl.user.vo.UserVO;
 4 
 5     public interface UserService {
 6     
 7         public void addUser(UserVO user);
 8         
 9         public void deleteUser(UserVO user);
10         
11         public void updateUser(UserVO user);
12         
13         public UserVO getUserById(int id);
14         
15         public UserVO getUser(int id);
16     
17 }

六,Service實現

 1 package com.sl.user.service.impl;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.cache.annotation.CacheEvict;
 5 import org.springframework.cache.annotation.Cacheable;
 6 import org.springframework.stereotype.Service;
 7 import org.springframework.transaction.annotation.Propagation;
 8 import org.springframework.transaction.annotation.Transactional;
 9 
10 import com.sl.user.dao.UserDao;
11 import com.sl.user.service.UserService;
12 import com.sl.user.vo.UserVO;
13 
14 @Service("userService")
15 @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
16 public class UserServiceImpl implements UserService{
17     
18     @Autowired
19     private UserDao userDao;
20     
21     @Override
22     @CacheEvict(value="User",key="addUser",allEntries=true) 
23     public void addUser(UserVO user) {
24         userDao.addUser(user);
25     }
26 
27     @Override
28     @CacheEvict(value = {"getUser", "getUserById"}, allEntries = true)  
29     public void deleteUser(UserVO user) {
30         userDao.deleteUser(user);
31     }
32 
33     @Override
34     @CacheEvict(value = {"getUser", "getUserById"}, allEntries = true)  
35     public void updateUser(UserVO user) {
36         userDao.updateUser(user);
37     }
38 
39     @Override
40     @Cacheable(value="User",key="getUserById")
41     public UserVO getUserById(int id) {
42         return userDao.getUserById(id);
43     }
44     
45     @Override
46     @Cacheable(value="User",key="'getUser'")
47     public UserVO getUser(int id) {
48         return userDao.getUser(id);
49     }
50 
51 }

七,Ctrl層

 1 package com.sl.user.web;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.stereotype.Controller;
 8 import org.springframework.web.bind.annotation.RequestMapping;
 9 import org.springframework.web.bind.annotation.ResponseBody;
10 
11 import com.sl.user.service.UserService;
12 import com.sl.user.vo.UserVO;
13 
14 @Controller
15 @RequestMapping("/userCtrl")
16 public class UserCtrl {
17     
18     @Autowired
19     private UserService userService;
20     
21     @RequestMapping("/addUser")
22     public void addUser(UserVO user){
23         userService.addUser(user);
24     }
25     
26     @RequestMapping("/deleteUser")
27     public void deleteUser(UserVO user){
28         userService.deleteUser(user);
29     }
30     
31     @RequestMapping("/updateUser")
32     public void updateUser(UserVO user){
33         userService.updateUser(user);
34     }
35     
36     @ResponseBody
37     @RequestMapping("/getUserById")
38     public Map<String,Object> getUserById(UserVO user){
39         Map<String,Object> map = new HashMap<String,Object>();
40         map.put("msg",userService.getUserById(4));
41         return map;
42     }
43     
44     @ResponseBody
45     @RequestMapping("/getUser")
46     public Map<String,Object> getUser(UserVO vo){
47         Map<String,Object> map = new HashMap<String,Object>();
48         Object user = userService.getUser(4);
49         map.put("msg",user.toString());
50         return map;
51     }
52     
53 }

八,Redis關鍵類,用於CRUD操作

  1 package com.sl.user.redis;
  2 import java.io.ByteArrayInputStream;  
  3 import java.io.ByteArrayOutputStream;  
  4 import java.io.IOException;  
  5 import java.io.ObjectInputStream;  
  6 import java.io.ObjectOutputStream;  
  7   
  8 import org.springframework.cache.Cache;  
  9 import org.springframework.cache.support.SimpleValueWrapper;  
 10 import org.springframework.dao.DataAccessException;  
 11 import org.springframework.data.redis.connection.RedisConnection;  
 12 import org.springframework.data.redis.core.RedisCallback;  
 13 import org.springframework.data.redis.core.RedisTemplate;
 14 
 15 public class RedisUtil implements Cache{
 16     
 17     private RedisTemplate<String, Object> redisTemplate;    
 18     private String name;    
 19     public RedisTemplate<String, Object> getRedisTemplate() {  
 20         return redisTemplate;    
 21     }  
 22        
 23     public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {  
 24         this.redisTemplate = redisTemplate;    
 25     }  
 26        
 27     public void setName(String name) {  
 28         this.name = name;    
 29     }  
 30        
 31     @Override    
 32     public String getName() {  
 33         return this.name;    
 34     }  
 35   
 36     @Override    
 37     public Object getNativeCache() {  
 38         return this.redisTemplate;    
 39     }  
 40     
 41     /**
 42      * 從緩存中獲取key
 43      */
 44     @Override    
 45     public ValueWrapper get(Object key) {  
 46 System.out.println("get key");  
 47       final String keyf =  key.toString();  
 48       Object object = null;  
 49       object = redisTemplate.execute(new RedisCallback<Object>() {  
 50       public Object doInRedis(RedisConnection connection)    
 51                   throws DataAccessException {  
 52           byte[] key = keyf.getBytes();  
 53           byte[] value = connection.get(key);  
 54           if (value == null) {  
 55              return null;  
 56             }  
 57           return toObject(value);  
 58           }  
 59        });  
 60         return (object != null ? new SimpleValueWrapper(object) : null);  
 61       }  
 62     
 63      /**
 64       * 將一個新的key保存到緩存中
 65       * 先拿到需要緩存key名稱和對象,然後將其轉成ByteArray
 66       */
 67      @Override    
 68      public void put(Object key, Object value) {  
 69 System.out.println("put key");  
 70        final String keyf = key.toString();    
 71        final Object valuef = value;    
 72        final long liveTime = 86400;    
 73        redisTemplate.execute(new RedisCallback<Long>() {    
 74            public Long doInRedis(RedisConnection connection)    
 75                    throws DataAccessException {    
 76                 byte[] keyb = keyf.getBytes();    
 77                 byte[] valueb = toByteArray(valuef);    
 78                 connection.set(keyb, valueb);    
 79                 if (liveTime > 0) {    
 80                     connection.expire(keyb, liveTime);    
 81                  }    
 82                 return 1L;    
 83              }    
 84          });    
 85       }  
 86   
 87       private byte[] toByteArray(Object obj) {    
 88          byte[] bytes = null;    
 89          ByteArrayOutputStream bos = new ByteArrayOutputStream();    
 90          try {    
 91            ObjectOutputStream oos = new ObjectOutputStream(bos);    
 92            oos.writeObject(obj);    
 93            oos.flush();    
 94            bytes = bos.toByteArray();    
 95            oos.close();    
 96            bos.close();    
 97           }catch (IOException ex) {    
 98                ex.printStackTrace();    
 99           }    
100           return bytes;    
101         }    
102   
103        private Object toObject(byte[] bytes) {  
104          Object obj = null;    
105            try {  
106                ByteArrayInputStream bis = new ByteArrayInputStream(bytes);    
107                ObjectInputStream ois = new ObjectInputStream(bis);    
108                obj = ois.readObject();    
109                ois.close();    
110                bis.close();    
111            } catch (IOException ex) {    
112                ex.printStackTrace();    
113             } catch (ClassNotFoundException ex) {    
114                ex.printStackTrace();    
115             }    
116             return obj;    
117         }  
118        
119        /**
120         * 刪除key
121         */
122        @Override    
123        public void evict(Object key) {    
124 System.out.println("del key");  
125          final String keyf = key.toString();    
126          redisTemplate.execute(new RedisCallback<Long>() {    
127          public Long doInRedis(RedisConnection connection)    
128                    throws DataAccessException {    
129              return connection.del(keyf.getBytes());    
130             }    
131           });    
132         }  
133        
134         /**
135          * 清空key
136          */
137         @Override    
138         public void clear() {    
139 System.out.println("clear key");  
140            redisTemplate.execute(new RedisCallback<String>() {    
141                 public String doInRedis(RedisConnection connection)    
142                         throws DataAccessException {    
143                   connection.flushDb();    
144                     return "ok";    
145                }    
146            });    
147         }  
148   
149         @Override  
150         public <T> T get(Object key, Class<T> type) {  
151             return null;  
152         }  
153       
154         @Override  
155         public ValueWrapper putIfAbsent(Object key, Object value) {  
156             return null;  
157         }  
158       
159 }

九,Spring整合mybatis和redis配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:p="http://www.springframework.org/schema/p"
 5     xmlns:context="http://www.springframework.org/schema/context" 
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xmlns:mvc="http://www.springframework.org/schema/mvc"
 8     xmlns:aop="http://www.springframework.org/schema/aop"
 9     xmlns:cache="http://www.springframework.org/schema/cache"
10     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
11        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
12        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
13        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
14        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
15        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
16     
17     <!-- 掃描dao,service -->
18     <context:component-scan base-package="com.sl.user.service" />
19     <context:component-scan base-package="com.sl.user.service.*" />
20     <context:component-scan base-package="com.sl.user.redis" />
21     <!-- 啟用註解 -->
22     <context:annotation-config/>
23     <!-- 啟動緩存註解 -->
24     <cache:annotation-driven/>
25     
26     <!-- MyBatis start -->
27         <!-- 配置dataSource DriverManagerDataSource-->
28         <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
29             <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
30             <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
31             <property name="username" value="root"></property>
32             <property name="password" value="root"></property>
33         </bean>
34     
35         <!-- MyBatis配置 SqlSessionFactoryBean -->
36         <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
37             <property name="dataSource" ref="dataSource"></property>
38             <property name="configLocation" value="classpath:config/mybatis.xml"></property>
39             <property name="mapperLocations" value="classpath:mapper/UserMapper.xml"></property>
40         </bean>
41         
42         <!-- mybatis自動掃描載入Sql映射文件/介面 : MapperScannerConfigurer 
43                    sqlSessionFactory
44                 basePackage:指定sql映射文件/介面所在的包(自動掃描) -->
45         <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
46             <property name="sqlSessionFactory" ref="sessionFactory"></property>
47             <property name="basePackage" value="com.sl.user.dao"></property>
48         </bean>
49                 
50          <!-- 事務管理  DataSourceTransactionManager-->
51          <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
52              <property name="dataSource" ref="dataSource"></property>
53          </bean>
54          
55          <!-- 使用聲明式事務 transaction-manager:引用上面定義的事務管理器-->
56          <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>
57          
58      <!-- MyBatis end -->
59      
60      <!-- 配置redis部分 start -->
61      
62          <!-- 配置redis連接池  JedisPoolConfig-->
63          <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
64              <property name="maxIdle" value="300" />  
65             <property name="maxTotal" value="600" />  
66          </bean> 
67          
68          <!-- 配置CoonnectionFactory JedisConnectionFactory-->
69          <bean id="connFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
70               <property name="hostName" value="127.0.0.1"></property>
71               <property name="port" value="6379"></property>
72               <property name="poolConfig" ref="poolConfig"></property>
73          </bean>
74         
75          <!-- 配置redisTemplate StringRedisTemplate-->
76          <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
77             <property name="connectionFactory" ref="connFactory"/>
78          </bean>
79          
80          <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">    
81              <property name="caches">    
82                 <set>    
83                     <bean class="com.sl.user.redis.RedisUtil">    
84                          <property name="redisTemplate" ref="redisTemplate" />    
85                          <property name="name" value="User"/>    
86                          <!-- User名稱要在類或方法的註解中使用 -->  
87                     </bean>  
88                 </set>    
89              </property>    
90          </bean>
91 
92 </beans>

十,SpringMVC配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 3     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
 6        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
 7        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
 8        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
 9        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
10 
11     <mvc:annotation-driven/>
12     <!-- 啟用spring mvc 註解 -->
13     <context:annotation-config/>
14     <!-- 設置使用註解的類所在的jar包 -->
15     <context:component-scan base-package="com.sl.user.*"></context:component-scan>
16 
17     <!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前尾碼 -->
18     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
19         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
20         <property name="prefix" value="/views/"/>
21         <property name="suffix" value=".jsp"/>
22     </bean>
23 
24     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
25         <!-- JSON轉換器 -->
26         <property name="messageConverters">
27             <list>
28                 <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
29                     <property name="supportedMediaTypes">
30                         <list>
31                             <value>application/json;charset=utf-8</value>
32                             <value>text/json;charset=utf-8</value>
33                         </list>
34                     </property>
35                 </bean>
36             </list>
37         </property>
38     </bean>
39 
40 </beans>

十一,mybatis配置文件

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Blocks理解: Blocks可以訪問局部變數,但是不能修改 如果修改局部變數,需要加__block 2、如果局部變數是數組或者指針的時候只複製這個指針,兩個指針指向同一個地址,block只修改指針上的內容。如: 例子裡面確實沒有修改mArrayCount這個局部變數啊。mArrayCount是一 ...
  • 開始Java的學習,從Android,開始吧。《第一代碼》開始閱讀和調試demo例子。 下麵是 《第一行代碼》的思維導圖: ...
  • 本文主要介紹Android中從Gallery獲取圖片 設計項目佈局 打開packages\apps\Gallery下的清單文件,可以看到其中包含下麵的代碼: 邏輯部分代碼如下: ...
  • 基於 HDP2.4安裝(五):集群及組件安裝 創建的hadoop集群,修改預設配置,將hbase 存儲配置為 Azure Blob Storage 目錄: 簡述 配置 驗證 簡述: hadoop-azure 提供hadoop 與 azure blob storage 集成支持,需要部署 hadoop ...
  • 基於linux 創建HDInsight HBase集群,選擇最小配置,zk(3)、NN(2)、WN(2),集群節點預設組件服務規劃如下 NN0: Active NameNode /HDFS ZKFailoverController/HDFS App Timeline Server /YARN Act ...
  • 使用Saprk SQL 操作Hive的數據 前提準備: 1、啟動Hdfs,hive的數據存儲在hdfs中; 2、啟動hive -service metastore,元數據存儲在遠端,可以遠程訪問; 3、在spark的conf目錄下增加hive-site.xml配置文件,文件內容: 編寫Scala測試 ...
  • 1 begin 2 3 declare @i int ; 4 5 set @i=77541214; 6 7 update dbo.test set code='AMHD'+CONVERT(varchar,@i),@i=@i+1; 8 9 end ...
  • 《原創,僅供學習交流》 在關聯規則的研究中,有很多串列的演算法,經典的是Apriori演算法和FP_growth演算法。也有很多並行演算法, 如CD( count distribution ) 、DD ( data distribution ) 、CaD( candidate distribution)、F ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...