1. 程式人生 > 程式設計 >SpringBoot從0到1整合銀聯無跳轉支付功能附原始碼

SpringBoot從0到1整合銀聯無跳轉支付功能附原始碼

(1)概念

是一款高效能的nosql系列的菲關係型資料庫

菲關係型資料庫特點

  1. 資料之間沒有關聯關係
  2. 資料儲存在記憶體中

一般情況將資料儲存在關係型資料庫中,在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資料庫的工具

使用步驟:

  1. 下載Jedis的jar包
  2. 使用
  • //獲取連線
  • 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

使用

  1. 建立JedisPool連線池物件
  2. 呼叫方法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();
    }