1Redis的使用場景:
- 關係數據庫的緩存
- 可以做任務隊列(運行模塊1,模塊2,模塊3,模塊4,模塊5 ........)
- 大量數據運算(兩個集合求交集)
- 排行旁之類(redis非常擅長大量數據的排行榜)
- GEO地理位置(也是我們常用的附近的人)
2redis安裝部署方式
2.1前端安裝部署redis
Cd /usr/local/redis/src
運行服務端:./redis-server
另外啓動一個客戶端ssh窗口執行
運行客戶端(默認連接本機6379端口):./redis-cli
劣勢:這種部署方式不能進行集羣部署
另外一臺電腦登錄redis執行:./redis-cli –h IP地址 –P 端口
2.2後端安裝部署redis
vim redis.conf 修改daemonize no 改成 daemonize yes如下圖所示:
執行:./src/redis-server ./redis.conf
查看:ps -ef |grep -i redis 可以看到redis的進程是否已經啓動
3redis數據類型【重點內容】
- Redis使用的都是K-V數據類型
- Key:全部是字符串類型
- Value:字符串(string、hash、list(linkedlist鏈表,添加/刪除效率極高)HSET、有序的set集合,一般的set集合是無序的)
- Key的名字是自定義的,不要太長
4redis命令-string命令
Mysql關係型數據庫,二進制不安全;編碼和解碼只在客戶端發生,不在客戶端和磁盤編解碼;項目創建是GBK或者UTF8以後都不會發生其他的
而MySQL編解碼過程:
5常用命令
5.1賦值操作
如果賦予項目的KEY,新的value會覆蓋舊的value值
5.2取值
5.3刪除
5.4getset操作
5.5lncr key
計數器的使用:incr和decr只能對數值進行操作(遞增和遞減)
5.6Decr
5.7Incrby
5.8decrby
5.9string使用環境
主要用戶保存JSON格式的字符串
5.10Hash命令
Hash----------{username:“張三”,age:14}
5.11增加數字
6Jedis介紹
- Java的客戶端支持:jedis、redisson、jredis、JDBC-redis
- Redis有什麼命令,jedis就有什麼方法
package cn.itcast.demo1;
import org.junit.Test;
import redis.clients.jedis.Jedis;
Public class Demo1{
/**
*單實例鏈接redis數據庫
*/
@Test
public viod run1(){
Jedis jedis = new Jedis("192.168.56.11",6379)
jedis.set("name","張三");
System.out.println(jedis.get("name"));
}
}
6.1Jedis鏈接redis的連接池代碼
/**
* Jedis連接池
*/
@Test
public void run2(){
//1.設置連接池的配置對象
JedisPoolconfig config = new JedisPoolConfig();
//設置池中最大鏈接數【根據自己的實際情況和贏家配置情況來定最大連接數量】
config.setMaxTotal(500);//自己設置的最大連接數爲500
//設置空閒時池中保有的最大連接數【根據自己的實際情況和贏家配置情況來定最大連接數量】
config.setMaxIdle(10);
//2.設置連接池對象(解決連接到臺服務器或者服務器集羣去)
JedisPool pool = new JedisPool(config,"192.168.56.11",6379);
//3.從池中獲取連接對象
Jedis jedis = pool.getResource();
System.out.println(jedis.get("name"));
//4.連接歸還池中(說得很通俗點就是某個應用需要寫信息連接redis結束後把這個連接關閉,釋放CPU、內存,以便其他用戶連接redis集羣)
jedis.close();
}
6.2連接池工具jedisutils
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisUtils{
//1.定義一個連接池對象
private final static JedisPool POOL;
static{
//初始化操作
//1.設置連接池的配置對象
JedisPoolconfig config = new JedisPoolConfig();
//設置池中最大鏈接數【根據自己的實際情況和贏家配置情況來定最大連接數量】
config.setMaxTotal(500);//自己設置的最大連接數爲500
//設置空閒時池中保有的最大連接數【根據自己的實際情況和贏家配置情況來定最大連接數量】
config.setMaxIdle(10);
//2.設置連接池對象
POOL= new JedisPool(config,"192.168.56.11",6379);
}
/**
*從池中獲取連接
*/
public static Jedis getJedis(){
return POOL.getResource();
}
}
7持久化
7.1RDB持久化
- RDB:redis database(時間段內存中的數據寫入到磁盤中,redis會fork一個子進程,這個子進程來進行持久化,會將數據寫到一個臨時文件,主進程不進行IO進行操作;優點就是:比AOF執行更加高效,恢復比較簡單一次性操作完成;RDB最後一次持久化的數據可能丟失)
- Fork:fork的作用是複製一個與當前進程一樣的進程;新進程的所有數據(變量、環境變量、程序計數器等)數值都和原進程一致,但是一個全新的進程,並作爲進程的子進程。
- RDB持久化的策略:
1)1分鐘內修改了1萬次
2)5分鐘內修改了10萬次
3)15分鐘內修改了1次
優點:
- 適合大規模的數據恢復
- 對數據完整性和一致性要求不高
劣勢:
- 2分鐘這個時間段有可能丟失數據
- Fork比較消耗CPU、內存等資源
7.2AOF持久化
AOF:append only file 詳細見:https://redisbook.readthedocs.io/en/latest/internal/aof.html
8redis事務處理
What:可以一次執行多個命令,本質是一組命令的集合。一個事務的所有命令都會序列化,按順序地串行化執行執行而不會被其他命令插入,不許加塞。
How:一個隊列中,一次性、順序性、排他性的執行一系列命令行。
1.事務的命令展示:
2.執行命令顯示結果: