SpringBoot從0到1整合銀聯無跳轉支付功能附原始碼
(1)概念
是一款高效能的nosql系列的菲關係型資料庫
菲關係型資料庫特點
- 資料之間沒有關聯關係
- 資料儲存在記憶體中
一般情況將資料儲存在關係型資料庫中,在nosql資料庫中備份儲存關係型資料庫的資料
應用場景
- 快取
- 聊天室線上好友列表
- 任務佇列(秒殺,搶購,12306等)
- 應用排行榜
- 網站訪問統計
- 資料過期處理(可以精確到毫秒)
- 分散式叢集架構中的Session分離
redis.windows.conf:配置檔案
redis-cli.exe:客戶端
redis-server.exe:伺服器端
資料結構
儲存的是:key=value格式的資料,其中key都是字串,value有五種不同的資料結構
- 字串型別string
- 雜湊型別hash:map格式
- 列表型別list:Linkedlist
- 集合型別set:hashset
- 有序集合型別sortedset
(2)操作
- 字串型別string
儲存:set key value
獲取:get key
刪除:del key
- 雜湊型別hash
儲存:hset key field value
獲取:hget key field,hgetall key獲取所有的
刪除:hdel key field
- 列表型別list
是簡單的字串列表,按照插入順序排序,可以在頭部(左邊)或尾部(右邊)新增一個元素
新增:lpush,rpush key value:從列表的左邊或右邊新增進去
獲取:
lrange key start end:範圍的獲取
刪除:
lpop key:刪除列表最左邊的元素,並將元素返回
rpop key:刪除列表最右邊的元素,並將元素返回
- 集合型別set
Redis的Set是string型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料。
Redis 中 集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。
向集合新增一個或多個成員
獲取集合的成員數
移除並返回集合中的一個隨機元素
返回所有給定集合的並集
儲存:sadd key value
獲取:smembers key:獲取集合中所有元素
刪除:srem key value:刪除set集合中的某個元素
參考:
- 有序集合型別sortedset
Redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重複。
儲存:zadd key score value:
獲取:zrange key start end
檢視分數:zrange key start end withscores
刪除:zrem key value
通用命令:
keys *:查詢所有鍵
type key: 獲取鍵對應value的型別
del key:刪除指定的key value
(3)持久化
redis是一個記憶體資料庫,當redis伺服器重啟,資料會丟失。可以將redis記憶體中的資料持久化儲存到硬碟中。
持久化機制:
1、RDB:預設方式,不需要進行配置。在一定時間間隔彙總,檢測key的變化情況,然後持久化資料到
save 900 1
after 900 sec (15 min) if at least 1 key changed
save 300 10
after 300 sec (5 min) if at least 10 keys changed
save 60 10000
after 60 sec if at least 10000 keys changed
重新啟動redis伺服器,並指定配置檔案的名稱
redis-server.ext reids.windows.conf
2、AOF:不推薦使用。日誌記錄的方式,可以記錄每一條命令的操作,每一次命令操作後持久化資料
- 編輯redis.windows.conf檔案
- appendonly no(關閉aof)改成yes,開啟aof
- # appendfsync always:每一次操作都進行持久化,效能低
appendfsync everysec:每隔一秒操作一次持久化
# appendfsync no:不進行持久化
(3)Java客戶端 Jedis
是一款java操作redis資料庫的工具
使用步驟:
- 下載Jedis的jar包
- 使用
- //獲取連線
- Jedis jedis = new Jedis(“localhost”,6379);
- //操作
- jedis.set("username","zhangshan");
- //關閉連線
- jedis.close()
Jedis操作各種redis中的資料結構
導座標:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
- 字串型別string
set/get
//使用空參構造,預設值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.set("username","zhangsan");
//可以使用setex()方法儲存可以指定過期時間的key value
//引數key:任意名稱,第二引數:時間,單位是秒,第三引數:值
jedis.setex("activatecode",20,"hehah");
//將activatecode:hehah鍵值對存入redis,並在20秒後自動刪除
System.out.println(jedis.get("username"));
jedis.close();
- 雜湊型別hash:map格式
hset/hget
/**
* hash資料結構操作
*/
@Test
public void test2(){
//使用空參構造,預設值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.hset("user","name","lisi");
jedis.hset("user","age","23");
jedis.hset("user","gender","male");
System.out.println(jedis.hget("user","name"));
//獲取hash的所有map資料
Map<String,String> user = jedis.hgetAll("user");
Set<String> keySet = user.keySet();
for (String key:keySet){
System.out.println(key + ":" + user.get(key));
}
jedis.close();
}
- 列表型別list:Linkedlist
lpush/rpush
lpop/rpop
lrange start end:範圍獲取
/**
* list資料結構操作
*/
@Test
public void test3(){
//使用空參構造,預設值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.lpush("mylist","a","b","c");
jedis.rpush("mylist","a","b","c");
//獲取範圍:0 -1:所有的元素
List<String> mylist = jedis.lrange("mylist",0,-1);
System.out.println(mylist);
//list左彈出
String element1 = jedis.lpop("mylist");
System.out.println(element1);
//list右彈出
String element2 = jedis.rpop("mylist");
System.out.println(element2);
//獲取範圍:0 -1:所有的元素
List<String> mylist2 = jedis.lrange("mylist",0,-1);
System.out.println(mylist2);
jedis.close();
}
- 集合型別set:hashset,不允許重複元素
sadd
smembers
/**
* set資料結構操作
*/
@Test
public void test4(){
//使用空參構造,預設值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.sadd("myset","java","php","c++");
Set<String > myset = jedis.smembers("myset");
System.out.println(myset);
jedis.close();
}
- 有序集合型別sortedset
zadd
/**
* sortedset資料結構操作
*/
@Test
public void test5(){
//使用空參構造,預設值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
//score:分數,應用場景:如英雄的出場次數,關注程度等
jedis.zadd("mysortedset",12,"亞瑟");
jedis.zadd("mysortedset",15,"後裔");
jedis.zadd("mysortedset",25,"孫悟空");
Set<String> myset = jedis.zrange("mysortedset",0,-1);
System.out.println(myset);
jedis.close();
}
(4)Jedis連線池:JedisPool
使用
- 建立JedisPool連線池物件
- 呼叫方法getResource()方法獲取連線
/**
* jedis連線池使用
*/
@Test
public void test6(){
//建立配置物件
JedisPoolConfig config = new JedisPoolConfig();
//最大連線數
config.setMaxTotal(50);
//最大空閒連線
config.setMaxIdle(10);
//建立Jedis連線池物件
JedisPool jedisPool = new JedisPool("localhost",6379);
//獲取連線
Jedis jedis = jedisPool.getResource();
jedis.set("mylist","hhhh");
System.out.println(jedis.get("mylist"));
//連線歸還到連線池中
jedis.close();
}
升級,使用工具類
在src下建:jedis.properties檔案
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
/**
* JedisPool工具類
*/
public class JedisPoolUtil {
private static JedisPool jedisPool;
static {
//讀取配置檔案
InputStream inputStream = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
//建立Properties物件
Properties properties = new Properties();
//關聯檔案
try{
properties.load(inputStream);
}catch (Exception e){
e.printStackTrace();
}
//獲取資料,設定到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
//初始化JedisPool
jedisPool = new JedisPool(config,
properties.getProperty("host"),
Integer.parseInt(properties.getProperty("port")));
}
public static Jedis getJedis(){
return jedisPool.getResource();
}