說明:虛擬機的nat模式依賴於net8網卡,nat8網卡的地址是一個網關,在window系統中.window系統訪問Linux系統必須通過nat8網卡.不然不能通訊java
說明:該報錯信息是因爲計算機關閉了虛擬化設置.須要進入bios系統中開啓便可F10保存退出.mysql
說明:1.關閉防火牆ios
2.開放mysql對外的訪問權限nginx
3.ping 主機IP地址是否成功redis
4.將nat8網卡重啓算法
5.安裝mysql開始spring
6.保證mysql數據的一致性sql
說明:數據庫中雖然實現了主從複製和讀寫分離.在必定程度上可以抗擊高併發,可是性能並非特別的完善.如今所面臨的主要問題是用戶大量的讀的操做所引起的高併發的問題?數據庫
如何處理:緩存機制json
說明:緩存機制是下降了客戶端訪問服務器的訪問頻次.而且緩存中的數據是與服務器(數據庫)中的數據是同步的.
1.緩存的數據如何存儲??
2.緩存中的數據如何持久化??
3.緩存中的數據如何實現數據同步??
4.緩存中的數據內存如何維護
1.緩存中的數據可使用Map存儲,
由於map的數據結構是key:value. key不容許重複
2.定時將緩存中的數據保存到磁盤文件中.當服務器宕機,先應該讀取磁盤持久化文件,恢復緩存的數據.
3.當數據發生」更新」操做時,及時的維護緩存的數據(攔截器/監聽器/AOP)
4.設定最大的內存,當內存超過閾值時,採用lru算法刪除最近最少使用的數據
說明:redis是現階段使用量較多的緩存數據庫.可以支持300000/秒集合運算.由於底層是基於c語言開發的.
說明:若是出現上述文件表示編譯成功
說明:若是出現上圖的提示,表示redis安裝成功
說明:啓動的命令 redis-server
vim redis.conf
4.開啓後臺啓動
redis-server redis.conf
5.關閉redis
Kill -9 9249
redis-cli shutdown
命令:redis-cli 進入客戶端
說明:學習redis命令
指令 |
說明 |
案例 |
set |
設定key的值 |
set name tom |
get |
獲取指定 key 的值 |
get name |
strlen |
獲取key值的長度 |
strlen name |
exists |
檢查給定 key 是否存在 |
exists name 返回1存在 0不存在 |
del |
刪除指定的key/key1 key2 |
del name1 name2 |
keys |
命令用於查找全部符合給定模式 pattern 的 key |
Keys * 查詢所有的key值 Keys n?me 佔位符 Keys name* 以name開頭的key |
mset |
賦值多個key-value |
mset key1 value1 key2 value2 key3 value3 同時賦值多個值 |
mget |
獲取多個key |
Mget key1 key2 key3 |
append |
對指定的key進行追加 |
append key 123456 value123456 append key " 123456" value 123456中間多一個空格 |
Type |
查看key的類型 |
Type key1 127.0.0.1:6379> TYPE key1string |
Flushdb |
清空當前數據庫 |
Flushdb 清空數據庫 |
Select |
切換數據庫 |
Select 0-15 redis一共有16個數據庫 |
FLUSHALL |
清空所有數據庫數據 |
flushall |
Incr |
自動增加1 |
Incr num 數據會自動加1 Incr string 數據庫會報錯 |
Decr |
自動減1 |
Decr name 數據會自動減1 |
incrby |
指定步長自增 |
Incrby 2 每次自增2 |
Decrby |
指定步長自減 |
Decrby 2每次減2 |
Expire |
指定key的失效時間單位是秒(s) |
EXPIRE name1 5 5秒後數據失效 |
Ttl |
查看key的剩餘存活時間 |
Ttl name -2表示失效 -1沒有失效時間 |
Pexpire |
設置失效時間(毫秒) |
Pexpire name 1000 用於秒殺業務 |
Persist |
撤銷失效時間 |
撤銷失效時間 |
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.1.RELEASE</version> </dependency> <jedis.version>2.6.2</jedis.version> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency>
/** * 1.鏈接遠程redis的客戶端 ip:6379 * 2.經過jedis操做數據的增和刪 */ @Test public void test01(){ Jedis jedis = new Jedis("192.168.126.142", 6379); jedis.set("name", "jerry"); System.out.println("獲取redis中的數據:"+jedis.get("name")); }
<!--Spring管理Jedis name= "構造參數的名稱" index="構造參數的位置" 總結:構造注入時使用index不用name.緣由因爲java只會維護形參的數據類型 不會維護形參的名稱.全部經過name屬性進行構造注入時,可能會產生風險. 因此建議使用index. addUser(int age,String sex) addUser(int arg0,String arg1) 因爲沒有導入源碼 關於type類型的說明: 通常狀況下,SPring會自動的維護參數類型,因此能夠省略不寫. 可是若是類中的構造方法重載較多,出現參數個數相同的狀況, 須要指定參數類型.Spring根據特定的參數實現構造注入. --> <bean id="jedis" class="redis.clients.jedis.Jedis"> <constructor-arg index="0" value="${redis.host}" type="java.lang.String"/> <constructor-arg index="1" value="${redis.port}" type="int"/> </bean>
1.編輯redis.properties
2.交給Spring容器管理
說明:將變化不大的數據添加到緩存中.
省市縣區,部門名稱/信息/商品的分類目錄
說明:商品分類目錄使用redis緩存實現
規定:
步驟:
1.當用戶查詢數據時,先查詢緩存
2.當緩存中沒有數據,應該查詢後臺的數據庫
3.將查詢的結果轉化爲JSON串,存入redis中
4.當用戶再次查詢時,緩存中已經含有該數據
5.將redis中的JSON串轉化爲List集合
6.將list集合返回
/** * 1.當用戶查詢數據時,先查詢緩存 2.當緩存中沒有數據,應該查詢後臺的數據庫 3.將查詢的結果轉化爲JSON串,存入redis中 4.當用戶再次查詢時,緩存中已經含有該數據 5.將redis中的JSON串轉化爲List集合 6.將list集合返回 */ @Override public List<ItemCat> findItemCatByParentId(Long parentId) { //建立List集合 List<ItemCat> itemCatList = new ArrayList<ItemCat>(); //定義key 定義前綴保證key不重複 String key = "ITEM_CAT_"+parentId; //從緩存中獲取數據 String jsonData = jedis.get(key); try { //判斷返回值是否爲空 if(StringUtils.isEmpty(jsonData)){ //表示沒有緩存 查詢數據庫 ItemCat itemCat = new ItemCat(); itemCat.setParentId(parentId); itemCat.setStatus(1); //正常的分類信息 itemCatList = itemCatMapper.select(itemCat); //將itemcatList集合轉化爲JSON串 String resultJSON = objectMapper.writeValueAsString(itemCatList); //將數據存入redis緩存中 jedis.set(key, resultJSON); }else{ //表示redis中含有數據,將JSON數據轉化爲List集合 ItemCat[] itemCats = objectMapper.readValue(jsonData,ItemCat[].class); //將返回值轉化爲List集合 itemCatList = Arrays.asList(itemCats); } } catch (Exception e) { e.printStackTrace(); } return itemCatList; }
說明:若是不添加上述的註解則會報錯
說明:因爲將JSON數據轉化爲對象時,須要調用其中的setXXX()方法.可是state和text屬性是樹形結構展示數據時的要求和實際的業務沒有關係.因此添加@JsonIgnoreProperties(ignoreUnknown=true)表示忽略未知字段.最終實現對象的轉化.
沒有使用redis緩存前耗時400毫秒
速度明顯提高
1.修改數據文件
2.修改nginx配置文件
<!--經過線程池的方式整合單臺redis --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--定義鏈接的總數 --> <property name="maxTotal" value="${redis.maxTotal}"/> <!--定義最大的空閒數量 --> <property name="maxIdle" value="${redis.maxIdle}"/> <!--定義最小空閒數量 --> <property name="minIdle" value="${redis.minIdle}"></property> </bean> <!--經過工廠模式建立jedis鏈接 須要指定 host主機 和端口號 引用鏈接池配置 --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}"/> <property name="port" value="${redis.port}"/> <!--引入線程池的配置 --> <property name="poolConfig" ref="poolConfig"/> </bean> <!--配置SpringJedisTemplate spring操做redis的模板工具API --> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <!--配置redis工廠 --> <property name="connectionFactory" ref="jedisConnectionFactory"></property> </bean>
redis.host=192.168.126.142
redis.port=6379
redis.maxTotal=1000
redis.maxIdle=30
redis.minIdle=10
@Service public class RedisService { @Autowired //注入spring的模板工具 private StringRedisTemplate redisTemplate; public void set(String key,String value){ ValueOperations<String, String> operations = redisTemplate.opsForValue(); //將數據寫入redis中 operations.set(key, value); } //經過key獲取數據 public String get(String key){ ValueOperations<String, String> operations = redisTemplate.opsForValue(); return operations.get(key); } }
說明:將jt-common編輯完成以後須要從新進行打包,不然業務層調用不生效
說明:將原有單個jedis的操做改成jedis鏈接池的形式.性能更好,更加適用於企業開發.