1. 程式人生 > >23 redis&jedis(java操作redis)

23 redis&jedis(java操作redis)

一、redis

認識nosql:

    不支援sql語句來操作資料庫,而是需要用特定的語法來操作資料庫

1、關係型和非關係型資料庫比較

2.redis儲存資料的型別                                                                                                                            

    1.key-value型資料庫

        key:必須是String

        value可以是以下四種:

            1) 字串型別 string-------------------------->String

            2) 雜湊型別 hash    --------------------------->map

            3) 列表型別 list       --------------------------->支援重複元素

            4) 集合型別 set       --------------------------->不允許重複元素

            5) 有序集合型別 sortedset      ---------------->不允許重複元素,且元素有順序

    2. redis的應用場景

            •    快取(資料查詢、短連線、新聞內容、商品內容等等)

            •    聊天室的線上好友列表

            •    任務佇列。(秒殺、搶購、12306等等)

            •    應用排行榜

            •    網站訪問統計

            •    資料過期處理(可以精確到毫秒)

            •    分散式叢集架構中的session分離

3.redis常用命令操作                                                                                                                                                            

2. 字串型別 string

        1. 儲存: set key value

            127.0.0.1:6379> set username zhangsan

            OK

        2. 獲取: get key

            127.0.0.1:6379> get username

            "zhangsan"

        3. 刪除: del key

            127.0.0.1:6379> del age

            (integer) 1

3. 雜湊型別 hash

        1. 儲存: hset key field value

            127.0.0.1:6379> hset myhash username lisi

            (integer) 1

            127.0.0.1:6379> hset myhash password 123

            (integer) 1

        2. 獲取:

            * hget key field: 獲取指定的field對應的值

                127.0.0.1:6379> hget myhash username

                "lisi"

            * hgetall key:獲取所有的field和value

                127.0.0.1:6379> hgetall myhash

                1) "username"

                2) "lisi"

                3) "password"

                4) "123"

        3. 刪除: hdel key field

            127.0.0.1:6379> hdel myhash username

            (integer) 1

4. 列表型別 list:可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)

        1. 新增:

            1. lpush key value: 將元素加入列表左表

            2. rpush key value:將元素加入列表右邊

                127.0.0.1:6379> lpush myList a

                (integer) 1

                127.0.0.1:6379> lpush myList b

                (integer) 2

                127.0.0.1:6379> rpush myList c

                (integer) 3

        2. 獲取:

            * lrange key start end :範圍獲取

                127.0.0.1:6379> lrange myList 0 -1         -------------->0  -1 代表獲取所有

                1) "b"

                2) "a"

                3) "c"

        3. 刪除:

            * lpop key: 刪除列表最左邊的元素,並將元素返回

            * rpop key: 刪除列表最右邊的元素,並將元素返回

5. 集合型別 set : 不允許重複元素

        1. 儲存:sadd key value

            127.0.0.1:6379> sadd myset a

            (integer) 1

            127.0.0.1:6379> sadd myset a

            (integer) 0

        2. 獲取:smembers key:獲取set集合中所有元素

            127.0.0.1:6379> smembers myset

            1) "a"

        3. 刪除:srem key value:刪除set集合中的某個元素    

            127.0.0.1:6379> srem myset a

            (integer) 1

 6. 有序集合型別 sortedset:不允許重複元素,且元素有順序.每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

        1. 儲存:zadd key score value

            127.0.0.1:6379> zadd mysort 60 zhangsan

            (integer) 1

            127.0.0.1:6379> zadd mysort 50 lisi

            (integer) 1

            127.0.0.1:6379> zadd mysort 80 wangwu

            (integer) 1

        2. 獲取:zrange key start end [withscores]

            127.0.0.1:6379> zrange mysort 0 -1

            1) "lisi"

            2) "zhangsan"

            3) "wangwu"

            127.0.0.1:6379> zrange mysort 0 -1 withscores

            1) "zhangsan"

            2) "60"

            3) "wangwu"

            4) "80"

            5) "lisi"

            6) "500"

        3. 刪除:zrem key value

            127.0.0.1:6379> zrem mysort lisi

            (integer) 1

    7. 通用命令

        1. keys * : 查詢所有的鍵

        2. type key : 獲取鍵對應的value的型別

        3. del key:刪除指定的key value

4.redis持久化                                                                                                                                                                        

1. redis是一個記憶體資料庫,當redis伺服器重啟,資料會丟失,我們可以將redis記憶體中的資料持久化儲存到硬碟的檔案中。

2. redis持久化機制:

        1. RDB:預設方式,不需要進行配置,預設就使用這種機制

            * 在一定的間隔時間中,檢測key的變化情況,然後持久化資料

            1. 編輯redis.windows.conf檔案

                #   after 900 sec (15 min) if at least 1 key changed

                save 900 1

                #   after 300 sec (5 min) if at least 10 keys changed

                save 300 10

                #   after 60 sec if at least 10000 keys changed

                save 60 10000

            2. 重新啟動redis伺服器,並指定配置檔名稱

                D:\JavaWeb2018\day23_redis\資料\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf    

        2. AOF:日誌記錄的方式,可以記錄每一條命令的操作。可以每一次命令操作後,持久化資料

            1. 編輯redis.windwos.conf檔案

                appendonly no(關閉aof) --> appendonly yes (開啟aof)

                # appendfsync always : 每一次操作都進行持久化

                appendfsync everysec : 每隔一秒進行一次持久化

                # appendfsync no     : 不進行持久化

二、Jedis                                                                                                                            

 1.   Jedis: 一款java操作redis資料庫. --------->和jdbc作用相似

     使用步驟:

        1. 下載jedis的jar包

        2. 使用

            //1. 獲取連線

            Jedis jedis = new Jedis("localhost",6379);

            //2. 操作

            jedis.set("username","zhangsan");

            //3. 關閉連線

            jedis.close();

  2.  jedis操作redis

        1.string 資料結構操作

 /**

     * jedis快速入門,

     * string 資料結構操作

     */

    @Test

    public void testString(){

        //獲取連線

        Jedis jedis = new Jedis("localhost",6379);

        //操作資料

        jedis.set("name","zhangsan" );

        //設定指定時間過期,10秒後

        jedis.setex("age", 10, "18");

        String name = jedis.get("name");

        System.out.println(name);

        //釋放資源

        jedis.close();

    }

        2.hash 資料結構操作

 /**

     * hash 資料結構操作

     */

    @Test

    public void testHash(){

        //1. 獲取連線

        Jedis jedis = new Jedis();//如果使用空參構造,預設值 "localhost",6379埠

        //2.儲存hash

        jedis.hset("user", "name", "wutegang");

        jedis.hset("user", "age", "25");

        jedis.hset("user", "gender", "男");

        //3.獲取hash

        System.out.println(jedis.hget("user","age" ));//25

        //4.獲取user所有資料

        Map<String, String> userMap = jedis.hgetAll("user");

        //5.遍歷

        Set<String> set = userMap.keySet();

        for (String key : set) {

            System.out.println(key+":"+userMap.get(key));

        }

        //6.關閉連線

        jedis.close();

    }

    3.list 資料結構操作

 /**

     * list 資料結構操作

     */

    @Test

    public void testList(){

        //1. 獲取連線

        Jedis jedis = new Jedis();//如果使用空參構造,預設值 "localhost",6379埠

        jedis.lpush("list","a","b","c");//從左邊開始存入----------->注意存覆蓋

        jedis.rpush("list","a","b","c");//從右邊開始存入----------->注意存覆蓋

        //0,-1  獲取所有

        List<String> list = jedis.lrange("list", 0, -1);

        System.out.println(list);

        //獲取指定範圍元素

        List<String> list1 = jedis.lrange("list", 0, 2);//獲取索引0 1 2 號元素

        System.out.println(list1);

        // list 刪除最左邊元素,並彈出刪除的元素

        String element1 = jedis.lpop("list");

        System.out.println(element1);

        // list 刪除最右邊元素,並彈出刪除的元素

        String element2 = jedis.rpop("list");

        System.out.println(element2);

    }

list 資料結構操作圖解

    4.set 資料結構操作

 /**

     * set 資料結構操作

     */

    @Test

    public void testSet(){

        //1. 獲取連線

        Jedis jedis = new Jedis();//如果使用空參構造,預設值 "localhost",6379埠

        //2.儲存

        jedis.sadd("set","java","c++","pht");

        //3.獲取

        Set<String> set = jedis.smembers("set");

        for (String s : set) {

            System.out.println(s);

        }

        //關閉連線

        jedis.close();

    }

    5.sortedset 資料結構操作

 /**

     * sortedset 資料結構操作

     */

    @Test

    public void testSortedset(){

        //1. 獲取連線

        Jedis jedis = new Jedis();//如果使用空參構造,預設值 "localhost",6379埠

        //2.儲存資料,會按照第二個引數大小進行排序

        jedis.zadd("sortedset", 5,"zhangsan" );

        jedis.zadd("sortedset", 2,"lisi" );

        jedis.zadd("sortedset", 3,"wangwu" );

        //3.獲取指定範圍資料

        Set<String> sortedset = jedis.zrange("sortedset", 0, 1);

        for (String s : sortedset) {

            System.out.println(s);

        }

    }

三、jedis連線池工具類                                                                                                            

1.   jedis.properties配置檔案

host=127.0.0.1

port=6379

maxTotal=50

maxIdle=10

##最大活動物件數

#redis.pool.maxTotal=1000

##最大能夠保持idel狀態的物件數

#redis.pool.maxIdle=100

##最小能夠保持idel狀態的物件數

#redis.pool.minIdle=50

##當池內沒有返回物件時,最大等待時間

#redis.pool.maxWaitMillis=10000

##當呼叫borrow Object方法時,是否進行有效性檢查

#redis.pool.testOnBorrow=true

##當呼叫return Object方法時,是否進行有效性檢查

#redis.pool.testOnReturn=true

##“空閒連結”檢測執行緒,檢測的週期,毫秒數。如果為負值,表示不執行“檢測執行緒”。預設為-1.

#redis.pool.timeBetweenEvictionRunsMillis=30000

##向呼叫者輸出“連結”物件時,是否檢測它的空閒超時;

#redis.pool.testWhileIdle=true

## 對於“空閒連結”檢測執行緒而言,每次檢測的連結資源的個數。預設為3.

#redis.pool.numTestsPerEvictionRun=50

##redis伺服器的IP

#redis.ip=xxxxxx

##redis伺服器的Port

#redis1.port=6379

2.JedisPoolUtils

package cn.itcast.jedis.util;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

/**

 * jedis連線池工具類

 * 1.載入配置檔案,設定配置引數

 * 2.提供獲取連線的方法

 */

public class JedisPoolUtils {

    private static JedisPool jedisPool;

    //載入配置檔案,使用Properties物件

    static {

        InputStream inputStream = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");

        //建立Properties物件

        Properties pro = new Properties();

        try {

            //讀取資源

            pro.load(inputStream);

        } catch (IOException e) {

            e.printStackTrace();

        }

        //獲取 jedis.properties配置檔案,設定到JedisPoolConfig

        JedisPoolConfig config = new JedisPoolConfig();

        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));

        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));