引入依賴
compile 'org.springframework.boot:spring-boot-starter-data-redis'
使用redis有兩種方法
1.Jedis
Jedis jedis = new Jedis("localhost");
2.RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
如果使用RedisTemplate的話,要在application.properties中配置資訊,這裡我使用Jedis比較簡單
redis的自動配置
在application.properties檔案下
#redis的springboot的自動配置
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=127.0.0.1
# Redis伺服器連線埠
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連線池中的最大空閒連線
spring.redis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.pool.min-idle=0
# 連線超時時間(毫秒)
spring.redis.timeout=0
Jedis使用
package com.test.booleanjava.helloRS.util;
import redis.clients.jedis.Jedis;
/**
* @author booleanjava
* Date: 2019/7/2 19:48
* description:redis的工具類
*/
public class RedisUtil {
static Jedis jedis = new Jedis("localhost");
/**
* 插入key,如果存在就更新
* @param key
* @param value
* @return
*/
public static String set(String key, String value){
return jedis.set(key, value);
}
/**
* 獲取key的值
* @param key
* @return
*/
public static String get(String key) {
return jedis.get(key);
}
/**
* 刪除key
* @param key
* @return
*/
public static Long del(String key){
return jedis.del(key);
}
/**
* 設定一個有過期時間的key(秒)
* @param key
* @param seconds
* @param value
* @return
*/
public static String setex(final String key, final int seconds, final String value){
return jedis.setex(key, seconds, value);
}
/**
* 如果不存在就執行操作,用作簡單分散式鎖
*
* @param key
* @param value
* @return true表示執行,false表示沒有執行
*/
public static Boolean setnx(final String key, final String value){
return jedis.setnx(key, value) == 1;
}
}
RedisTemplates使用
package com.test.booleanjava.helloRS.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
* @author boolean
* Date: 2019/7/2 19:48
* description:
*/
@Component
public class Redisplus {
@Autowired
private RedisTemplate redisTemplate;
public void set(String key, String value){
redisTemplate.opsForValue().set(key, value);
}
}
測試
package com.test.booleanjava.helloRS.controller;
import com.test.booleanjava.helloRS.entity.User;
import com.test.booleanjava.helloRS.util.Redisplus;
import com.test.booleanjava.helloRS.service.IUserService;
import com.test.booleanjava.helloRS.util.RedisUtil;
import com.test.base.core.util.LogUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
* @author booleanjava
* Date: 2019/7/2 19:48
* description:
*/
@RestController
@RequestMapping("/helloRS/redisHello")
public class RedisHello {
private final static Logger logger = LoggerFactory.getLogger(RedisHello.class);
private final static String USERKEY = "com.test.booleanjava.helloRS.controller.setex";
private final static String LOCKKEY = "com.test.booleanjava.helloRS.controller.lock";
@Autowired
private IUserService iUserService;
@Autowired
private Redisplus redisplus;
@Autowired
private RedisTemplate redisTemplate;
RedisSerializer redisSerializer =new StringRedisSerializer();
@RequestMapping("/hello")
public String hello(){
LogUtil.info("redis的展示:[{}]", redisTemplate);
return "hello, redis";
}
@RequestMapping("/set")
public String set(){
Date date = new Date();
redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.opsForValue().set("q", "1");
redisTemplate.opsForValue().get("q");
System.out.println(redisTemplate.opsForValue().get("q"));
RedisUtil.set("a1", String.valueOf(1));
logger.info("redis的展示:[{}]", redisTemplate);
return "hello, set一下redis";
}
@RequestMapping("/setex")
public String setex( ){
// String key = "1min";
// int seconds = 10;
// String value = "陳";
// RedisUtil.setex(key, seconds, value);
// String rs = RedisUtil.get(key);
// logger.info("獲取的值:[{}]", rs);
String value = RedisUtil.get(USERKEY);
if (value != null) {
logger.info("快取的user值:[{}]", value);
return value;
}
User user = iUserService.query().eq("name", "chen").one();
logger.info("user的值:[{}]",user.toString());
if (user != null ) {
RedisUtil.setex(USERKEY, 60, user.toString());
}
return "hello,booleanjava,設定了有時限的key";
}
@RequestMapping("/del")
public String del(String key) {
redisTemplate.delete(key);
return "hello, del一下redis";
}
/**
* 做分佈鎖,
*先加鎖,寫業務,最後解鎖
* @return
*/
@RequestMapping("/lock")
public String lock() {
//加鎖
RedisUtil.setnx(LOCKKEY,LOCKKEY);
//寫業務程式碼,一人我飲酒醉
//解鎖
RedisUtil.del(LOCKKEY);
return "hello, lock一下redis";
}
}
原始碼
https://github.com/blackdogss/HelloWorld/tree/master/helloRS
深入
背景
網際網路公司大部分通常使用myslq作為資料庫儲存資料,但是mysql存資料是以影響IO為代價的,所以mysql是系統的常見瓶頸,為解決這個問題,redis這種非關係型資料庫就出現了,存在即合理。redis喜歡在記憶體操作,比mysql在磁碟瞎忙高效多了,因此深受人們喜愛。
資料結構
redis有五種資料結構
1.String 字串
2.Hash雜湊
3.List列表
4.Set集合
5.Sorted Set
最常用的就是String型別,通常使用它做快取,減輕直接訪問資料庫的壓力。Hash的話可以用來做使用者id,List可以用來做粉絲列表,Set的話可以做共同好友,Sorted Set可以做排行榜。
分散式鎖
redis處理上面列舉的例子,還有就是可以做分散式鎖,在分散式系統中,介面面臨的是多程式多執行緒訪問,如果依賴java的鎖是不能解決問題的,因為程式之間不共享記憶體;利用資料庫加鎖又顯得笨重,因此還得用redis來加鎖。redis怎麼加鎖,主要還是利用setnx命令,該命令作用是如果key存在就不執行操作,不存在的話就設定value,這種特性就是為鎖打造的啊。