Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,運行在內存中,由ANSI C編寫。企業開發通常采用Redis來實現緩存。同類的產品還有memcache 、memcached 、MongoDB等。
1.Redis數據結構
字符串類型 string 散列類型 hash 列表類型 list 有序可重復 集合類型 set 無序不可重復 有序集合類型 sortedset 有序不可重復
2.Redis應用場景
做緩存: 緩存的是使用頻次較高,但不是特別重要的數據,請求來時,優先查詢非關系型數據庫,如果沒有查到則查詢關系型數據庫,從關系型數據庫中查詢到結果后,將結果存放到非關系型數據庫中,並將結果返回給瀏覽器.如果查詢到了,直接將查詢結果返回給瀏覽器即可。
當用戶執行 增 刪 改操作時,優先操作關系型數據庫, (會造成Redis數據丟失)
操作完畢后,刪除非關系型數據庫中的相關數據. (需要Redis數據同步)
二.Redis持久化:
注意: 要想使用redis的持久化操作,啟動redis時必須采用配置文件
使用指定配置文件開啟服務 (會持久化) ★★★★★
啟動服務器: 在dos命令中輸入 redis-server.exe redis.windows.conf
啟動客戶端: 在dos命令中輸入 redis-cli.exe
1.RDB持久化方式: (默認)
rdb方式在持久化數據時,采用快照機制.
執行快照保存的時機:
save 900 1 save 300 10 save 60 10000
存在問題: 可能導致數據丟失
在redis的配置文件中已經定義好使用rdb方式進行持久化了,將持久化的數據存放在當前目錄的dump.rdb.
redis服務器正常關閉時也會執行持久化操作(快照保存數據)
2.AOF持久化方式:
持久化的是執行過程,每一條命令都會持久化保存
使用方式:
1.開啟AOF持久化(修改配置文件)
將配置文件中的 appendonly 改為 yes
appendfsync always (我們使用的)
# appendfsync everysec
# appendfsync no
特點:
不會導致數據丟失.
性能低
三. Jedis
Jedis是Redis官方推出的一款面向Java的客戶端,提供了很多接口供Java語言調用。可以在Redis官網下載,當然還有一些開源愛好者提供的客戶端,如Jredis、SRP等等,推薦使用Jedis。
-
jdbc: java操作mysql數據的方式
-
jedis: java操作redis數據庫的方式
四. Spring Data Redis
Spring-data-redis是spring大家族的一部分,提供了在srping應用中通過簡單的配置訪問redis服務,對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝,RedisTemplate提供了redis各種操作、異常處理及序列化,支持發布訂閱,並對spring 3.1 cache進行了實現。
spring-data-redis針對jedis提供了如下功能: 1.連接池自動管理,提供了一個高度封裝的“RedisTemplate”類 2.針對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝為operation接口 ValueOperations:簡單K-V操作 SetOperations:set類型數據操作 ZSetOperations:zset類型數據操作 HashOperations:針對map類型的數據操作 ListOperations:針對list類型的數據操作
五.Spring Data Redis操作Redis數據庫
第一步:導入相關坐標到Spring項目中
<!-- Redis緩存相關坐標 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency>
resources/redis-config.properties
# Redis settings
# server IP
redis.host=192.168.25.130
# server port
redis.port=6379
# server pass
redis.pass=
# use dbIndex
redis.database=0
# maxIdle
redis.maxIdle=300
# maxWait
redis.maxWait=3000
# testOnBorrow
redis.testOnBorrow=true
<?xml version="1.0" encoding="UTF-8"?> <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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 1.加載外部配置文件 --> <context:property-placeholder location="classpath*:properties/*.properties"/> <!-- 2.redis相關配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}"/> <property name="maxWaitMillis" value="${redis.maxWait}"/> <property name="testOnBorrow" value="${redis.testOnBorrow}"/> </bean> <!-- 3.Jedis連接工廠的配置 --> <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> <!-- 4.redis模板的配置 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="JedisConnectionFactory"/> </bean> </beans>
1.操作String類型數據
/** * @author Mr.song * @date 2019/06/12 21:09 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/applicationContext-redis.xml") public class RedisStrTest { @Autowired private RedisTemplate redisTemplate; @Test public void testSetString(){ //模板綁定存儲的數據類型為String並存入數據: key是testStr value是DinTalk redisTemplate.boundValueOps("testStr").set("DinTalk"); } @Test public void testGetString(){ //模板綁定存儲的數據類型為String並取數據:使用key testStr String testStr = (String) redisTemplate.boundValueOps("testStr").get(); System.out.println(testStr); } @Test public void testDelString(){ //直接用模板根據key刪除數據,刪除后無數據查詢返回null redisTemplate.delete("testStr"); } //使用相同的key重新設置值便是更新 }
/** * @author Mr.song * @date 2019/06/12 21:22 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/applicationContext-redis.xml") public class RedisListTest { @Autowired private RedisTemplate redisTemplate; @Test public void testSetList(){ //模板綁定存儲的數據類型為List並存入數據:key是myList,List的數據類型,數據為din..... redisTemplate.boundListOps("myList").leftPush("din"); redisTemplate.boundListOps("myList").leftPush("talk"); redisTemplate.boundListOps("myList").leftPush("cn"); } @Test public void testGetList(){ //模板綁定存儲的數據類型為List並取數據:key是myList,rang中0是開始,-1是全部 List myList = redisTemplate.boundListOps("myList").range(0, -1); myList.stream().forEach(System.out::println); //取list中的一個數據 :先進先出(相當於彈出-刪除了) //String myList = (String) redisTemplate.boundListOps("myList").rightPop(); //System.out.println(myList); //din } @Test public void testDelList(){ //直接用模板根據key刪除數據(刪除整個集合) redisTemplate.delete("myList"); //指定刪除list的數據 :刪除一個talk //redisTemplate.boundListOps("myList").remove(1,"talk"); } //使用相同的key重新設置值便是更新 }
/** * @author Mr.song * @date 2019/06/12 21:09 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/applicationContext-redis.xml") public class RedisSetTest { @Autowired private RedisTemplate redisTemplate; @Test public void testSetValue(){ //模板綁定存儲的數據類型為Set並存入數據: key是mySet value是din talk 等 redisTemplate.boundSetOps("mySet").add("www"); redisTemplate.boundSetOps("mySet").add("din"); redisTemplate.boundSetOps("mySet").add("talk"); redisTemplate.boundSetOps("mySet").add("cn"); } @Test public void testGetValue(){ //模板綁定存儲的數據類型為Set並取數據:使用key為 mySet Set mySet = redisTemplate.boundSetOps("mySet").members(); mySet.stream().forEach(System.out::println); } @Test public void testDelValue(){ //直接用模板根據key刪除數據,刪除整個Set集合 redisTemplate.delete("mySet"); //redisTemplate.boundSetOps("mySet").remove("www"); } //使用相同的key重新設置值便是更新 }
/** * @author Mr.song * @date 2019/06/12 21:09 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/applicationContext-redis.xml") public class RedisZSetTest { @Autowired private RedisTemplate redisTemplate; //ZSet集合有序,數據有分值 @Test public void testSetValue(){ //模板綁定存儲的數據類型為Set並存入數據: key是myZSet value是din talk 等,各有分值 redisTemplate.boundZSetOps("myZSet").add("din",15); redisTemplate.boundZSetOps("myZSet").add("talk",55); redisTemplate.boundZSetOps("myZSet").add("www",25); redisTemplate.boundZSetOps("myZSet").add("cn",45); } @Test public void testGetValue(){ //1.模板綁定存儲的數據類型為ZSet並取數據:使用key為 myZSet(取一定分值范圍的) //Set myZSet = redisTemplate.boundZSetOps("myZSet").rangeByScore(20, 50); //myZSet.stream().forEach(System.out::println); //2.取全部的 //Set myZSet = redisTemplate.boundZSetOps("myZSet").range(0, -1); //myZSet.stream().forEach(System.out::println); //3.取數據,帶分值 Set<DefaultTypedTuple> myZSet = redisTemplate.boundZSetOps("myZSet").rangeWithScores(0, -1); for (DefaultTypedTuple defaultTypedTuple : myZSet) { System.out.println(defaultTypedTuple.getValue());//數據 System.out.println(defaultTypedTuple.getScore());//分值 } } @Test public void testDelValue(){ //1.直接用模板根據key刪除數據,刪除整個ZSet集合 //redisTemplate.delete("myZSet"); //2.刪除部分數據 redisTemplate.boundZSetOps("myZSet").removeRangeByScore(15,25); } //使用相同的key重新設置值便是更新 }
/** * @author Mr.song * @date 2019/06/12 21:09 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/applicationContext-redis.xml") public class RedisHashTest { @Autowired private RedisTemplate redisTemplate; @Test public void testSetHash(){ //模板綁定存儲的數據類型為Hash並存入數據: key是myHash value是{din:叮}等鍵值對 redisTemplate.boundHashOps("myHash").put("din","叮"); redisTemplate.boundHashOps("myHash").put("talk","當"); redisTemplate.boundHashOps("myHash").put("song","宋"); redisTemplate.boundHashOps("myHash").put("hui","慧"); } @Test public void testGetHash(){ //模板綁定存儲的數據類型為Hash並取數據:使用key為 myHash,獲取鍵的集合 //Set myHash = redisTemplate.boundHashOps("myHash").keys(); //myHash.stream().forEach(System.out::println); //獲取value的集合(值可重復,所以是list) //List myHash = redisTemplate.boundHashOps("myHash").values(); //myHash.stream().forEach(System.out::println); //使用myHash這個key獲取到Hash並用鍵獲取值 String s = (String) redisTemplate.boundHashOps("myHash").get("din"); System.out.println(s); } @Test public void testDelHash(){ //直接用模板根據key刪除數據,刪除整個Hash集合 //redisTemplate.delete("myHash"); redisTemplate.boundHashOps("myHash").delete("din"); } //使用相同的key重新設置值便是更新 }
1. 將redis資源包上傳到Linux中 2. 執行tar -zxvf redis-3.0.0.tar.gz解壓 3. 創建/usr/local/redis目錄, //命令 mkdir redis 4. 進入解壓的redis-3.0.0,安裝redis服務,執行命令:make install PREFIX=/usr/local/redis 5. 復制配置文件將/redis-3.0.0/redis.conf 復制到redis 下的bin 目錄下 執行命令: cp redis.conf /usr/local/redis-cluster/redis-1/bin/ 6.啟動redis服務
關注微信公眾號,隨時隨地學習