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")));