1.nosql:泛指非關係型數據庫(不以關係來建模的數據庫)【由行和列組成的二維表的數據庫就是關係型數據庫】
2.鍵值(key-value):主要用於內容緩存,優勢查找速度快
Redis是一個key-value的nosql,主要用來作緩存!
3.Redis數據保存在內存中,存取速度快,併發能力強。
4.是一種數據結構化存儲方法的集合。數據結構:數組,list,map,tree等;
Redis提供了一堆方法,調用特定的方法把數據保存爲特定的數據結構。
5.Redis官方不支持windows,有團隊製做了windows版本的。java
數據存儲:
存放到內存中,而且還能不按期持久化到硬盤.
Value類型:
相較於memcached支持Value更多
客戶端支持:
支持多種客戶端-跨語言
超大併發支持:
支持集羣面試
存儲過時:存儲數據時設置一個有效期,時間到了就沒了.
場景:訂單,vip,短信驗證碼,遊戲道具,優惠券,紅包等等redis
面試題:Memcached和Redis的相同點和不一樣點? 用過Memcached嗎?
用過redis,
相同點:
都是key-value類型Nosql,都存放數據到內存中,讀寫效率高,並且都支持存儲過時.
不一樣點:
redis相較於Memcached還支持持久化到磁盤,數據安全更高.
redis相較於Memcached支持value類型更多.spring
使用redis
1.選擇合適的java客戶端(jedis)
2.使用java客戶端操做redis服務器
①鏈接
②鏈接池sql
使用鏈接池的做用? 1.限定了最大鏈接數,防止鏈接過多大值系統崩潰
2.不用重複建立和關閉鏈接,這兩個都是耗資源操做,節約了資源
3.不用重複建立和關閉鏈接,這兩個都是耗時操做,減小訪問時間,加強用戶體驗數據庫
鏈接池配置:
最小鏈接數
config.setMaxIdle(2);//最小鏈接(閒時最大鏈接)
最大鏈接數
config.setMaxTotal(10);//最大鏈接
最大超時時間
config.setMaxWaitMillis(2*1000);//最大等
測試鏈接是否暢通
config.setTestOnBorrow(true);//獲取鏈接時測試是否暢通windows
注:配置文件:bind ip 綁定ip,只能這個ip來訪問,保證安全數組
默認不會丟失數據appendonly yse
appendonly 改成no後會丟失數據
修改save知足改成no以後也不會丟失數據緩存
redis持久化策略 安全
面試題: 淘汰策略:放開配置的最大內存(maxmemory <bytes>),
放開選擇的淘汰策略(allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰)。
複習事務四大特徵:(面試題!!!!) redis有事務,可是沒有用
原子性:多個操做要麼都成功,要麼都失敗!
一致性:多個操做,若是後面的失敗了,前面要進行回滾達到數據一致.
隔離型:多個事務相互不影響
持續性:一旦開始就不能終止
JedisUtil
public enum JedisUtil { INSTANCE; public static JedisPool pool=null; //鏈接池單例 static { //1.建立鏈接池配置對象 JedisPoolConfig config = new JedisPoolConfig(); //2.進行配置-四個 config.setMaxIdle(2);//最小鏈接(閒時最大鏈接) config.setMaxTotal(10);//最大鏈接 config.setMaxWaitMillis(2*1000);//最大等待時間 config.setTestOnBorrow(true);//獲取鏈接時測試是否暢通 //3.經過配置對象建立鏈接池 pool = new JedisPool(config, "127.0.0.1", 6379, 2*1000,"root"); } //獲取鏈接 public Jedis getResource(){ return pool.getResource(); } //釋放連接 public void closeJedis(Jedis jedis){ if (jedis!=null){ jedis.close(); } } }
RedisClientJedisTest
public class RedisClientJedisTest { @Test public void testSet()throws Exception{ //建立鏈接 Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("root"); //執行操做 jedis.set("name","ls"); //關閉鏈接 jedis.close(); } @Test public void testGet()throws Exception{ //建立鏈接 Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("root"); //執行操做 System.out.println(jedis.get("name")); //關閉鏈接 jedis.close(); } /** * 鏈接池-設置並獲取值 * @throws Exception */ @Test public void testPool()throws Exception{ //若是建立一個對象後要作不少配置,不如先建立他的配置對象後,再經過配置對象建立它。 //1.建立鏈接池配置對象 JedisPoolConfig config = new JedisPoolConfig(); //2.進行配置-四個 config.setMaxIdle(2);//最小鏈接(閒時最大鏈接) config.setMaxTotal(10);//最大鏈接 config.setMaxWaitMillis(2*1000);//最大等待時間 config.setTestOnBorrow(true);//獲取鏈接時測試是否暢通 //3.經過配置對象建立鏈接池 JedisPool pool = new JedisPool(config, "127.0.0.1", 6379, 2 * 1000,"root"); //4.經過鏈接池獲取鏈接 Jedis connection = pool.getResource(); //5.執行操做-設置和獲取值 connection.set("name","zs"); System.out.println(connection.get("name")); //6.釋放連接 connection.close(); //7.摧毀鏈接(測試環境)真實環境應該是在spring中配置的一個單例 pool.destroy(); } }
RedisClientJedisOprsTest
public class RedisClientJedisOprsTest { @Test public void testKey()throws Exception{ //清空全部數據-flushall //獲取鏈接 Jedis jedis = JedisUtil.INSTANCE.getResource(); System.out.println("清空數據:"+jedis.flushAll()); System.out.println("判斷key爲age的值是否存在:"+jedis.exists("age")); System.out.println("設置key爲age的值"+jedis.set("age", "18")); System.out.println("設置key爲age的值"+jedis.set("name", "zl")); System.out.println("設置key爲age的值"+jedis.set("sex", "nan")); System.out.println("設置key爲age的值"+jedis.set("num", "001")); System.out.println("再次判斷key爲age的值是否存在:"+jedis.exists("age")); System.out.println("設置後獲取key爲age的值"+jedis.get("age")); System.out.println("刪除前判斷key爲age的值是否存在:"+jedis.exists("age")); System.out.println("刪除key爲age的值"+jedis.del("age")); System.out.println("刪除後判斷key爲age的值是否存在:"+jedis.exists("age")); System.out.println("獲取全部的key:"); Set<String> keys = jedis.keys("*"); for (String key : keys) { System.out.println(key+"--->"+jedis.get(key)); } jedis.expire("name",20); Thread.sleep(5000); System.out.println("過時剩餘時間:"+jedis.ttl("name")); //釋放資源 JedisUtil.INSTANCE.closeJedis(jedis); System.out.println("釋放鏈接"); } @Test public void testString()throws Exception{ //清空全部數據-flushall //獲取鏈接 Jedis jedis = JedisUtil.INSTANCE.getResource(); System.out.println("清空數據:"+jedis.flushAll()); System.out.println("add..."); jedis.set("name","ly"); System.out.println(jedis.get("name")); System.out.println("updtate..."); jedis.set("name","lsj"); System.out.println(jedis.get("name")); jedis.set("age","30"); System.out.println("append..."); jedis.append("name","=ly"); System.out.println(jedis.get("name")); System.out.println(jedis.get("age")); System.out.println("del..."); jedis.del("age"); System.out.println("get..."); System.out.println(jedis.get("name")); System.out.println(jedis.get("age")); //釋放資源 JedisUtil.INSTANCE.closeJedis(jedis); System.out.println("釋放鏈接"); } @Test public void testString2()throws Exception{ //清空全部數據-flushall //獲取鏈接 Jedis jedis = JedisUtil.INSTANCE.getResource(); System.out.println("清空數據:"+jedis.flushAll()); jedis.mset("name","ww","age","50","sex","男"); List<String> list = jedis.mget("name","age","sex"); for (String s : list) { System.out.println(s); } //釋放資源 JedisUtil.INSTANCE.closeJedis(jedis); System.out.println("釋放鏈接"); } @Test public void testString3()throws Exception{ //清空全部數據-flushall //獲取鏈接 Jedis jedis = JedisUtil.INSTANCE.getResource(); System.out.println("清空數據:"+jedis.flushAll()); jedis.setex("name",20,"lsj"); jedis.set("age","20"); System.out.println("自增前"+jedis.get("age")); jedis.incr("age"); System.out.println("自增1後前"+jedis.get("age")); jedis.decr("age"); System.out.println("自減1後前"+jedis.get("age")); //jedis.incrBy(, ) jedis.incrBy("age",10); System.out.println("自增10後前"+jedis.get("age")); jedis.decrBy("age",10); System.out.println("自減10後前"+jedis.get("age")); //釋放資源 JedisUtil.INSTANCE.closeJedis(jedis); System.out.println("釋放鏈接"); } }