Author:eden李秉秉秉秉
Version:9.0.1
一、Redis介紹
1.1 引言
由於用戶量增大,請求數量也隨之增大,數據壓力過大
多台服務器之間,數據不同步。
多台服務器之間的鎖,已經不存在互斥性了
1.2 NoSQL
Redis就是一款NoSQL
NoSQL -> 非關系型數據庫 -> Not Only SQL
Key-Value:Redis
文檔型:ElasticSearch、Solr、MongoDB
面向列:Hbase,Cassandra
圖形化:Neo4j
除了關系型數據庫都是非關系型數據庫。
NoSQL只是一種概念,泛指非關系型數據庫,和關系型數據庫做一個區分
1.3 Redis介紹
有一位意大利人,在開發一款LLOOGG的統計頁面,因為MySQL的性能不好,自己研發了一款非關系型數據庫,並命名Redis。
Redis(Remote Dictionary Server)即遠程字典服務,Redis是由C語言去編寫,Redis是一款基於Key-Value的NoSQL,而且Redis是基於內存存儲數據的,Redis還提供了多種持久化機制,性能可以達到110000/s讀取數據,以及81000/s寫入數據,Redis還提供了主從、哨兵以及集群的搭建方式,可以更方便的橫向擴展以及垂直擴展
二、Redis安裝
2.1 安裝Redis
version: '3.1'
services:
redis:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis
environment:
- TZ=Asia/Shanghai
ports:
- 6379:6379
2.2 使用Redis-cli連接Redis
進去Redis容器的內部
docker exec -it 容器id bash
在容器內部,使用redis-cli連接
2.3 使用圖形化界面連接Redis
下載地址:https://github.com/lework/RedisDesktopManager-Windows/releases/tag/2020.5
傻瓜式安裝
三、Redis常用命令
3.1 Redis存儲數據的結構
常用的5種數據結構
key-string: 一個key對應一個值。
key-hash:一個key對應一個Map。
key-list:一個key對應一個列表。
key-set:一個key對應一個集合。
key-zset:一個key對應一個有序的集合。
另外三種數據結構:
HyperLogLog:計算近似值的。
GEO:地理位置。
BIT:一般存儲的也是一個字符串,存儲的是一個byte[]
五種常用的存儲數據結構圖
key-string:最常用的,一般用於存儲一個值。
key-hash:存儲一個對象數據的。
key-list:使用list結構實現棧和隊列結構。
key-set:交集、差集和並集的操作。
key-zset:排行榜、積分存儲等操作。
3.2 String常用命令
# 1. 添加值
set key value
# 2. 取值
get key
# 3. 批量操作
mset key value [key value...]
mget key [key...]
# 4. 自增命令(自增1)
incr key
# 5. 自減命令(自減1)
decr key
# 6. 自增或自減指定數量
incrby key increment
decrby key decrement
# 7. 設置值得同時,指定生存時間(每次向Redis添加數據時,盡量都設置上生存時間)
setex key second value
# 8. 設置值,如果當前key不存在的話(如果這個key存在,什么事都不做;如果這個key不存在,和set命令一樣)
setnx key value
# 9. 在key對應的value后追加內容
append key value
# 10. 查看value字符串的長度
strlen key
3.3 Hash常用命令
# 1. 存儲數據
hset key field value
# 2. 獲取數據
hget key field
# 3. 批量操作
hmset key field value [field value ...]
hmget key field [field...]
# 4. 自增(指定自增的值)
hincrby key field increment
# 5. 設置值(如果key-field不存在,那么就正常添加,如果存在,什么事都不做)
hsetnx key field value
# 6. 檢查field是否存在
hexists key field
# 7. 刪除key對應的field,可以刪除多個
hdel key field [field]
# 8. 獲取當前hash結構中的全部field和value
hgetall key
# 9. 獲取當前hash結構中的全部field
hkeys key
# 10. 獲取當前hash結構中的全部value
hvals key
# 11. 獲取當前hash結構中field的數量
hlen key
3.4 List常用命令
# 1. 存儲數據(從左側插入數據,從右側插入數據)
lpush key value [value ...]
rpush key value [value ...]
# 2. 存儲數據(如果key不存在,什么事都不做,如果key存在,但是不是list結構,什么都不做)
lpushx key value
rpushx key value
# 3. 修改數據(在存儲數據時,指定好你的索引位置,覆蓋之前索引位置的數據,index超出整個列表的長度,也會失敗)
lset key index value
# 4. 彈棧方式獲取數據(左側彈出數據,右側彈出數據)
lpop key
rpop key
# 5. 獲取指定索引范圍的數據(start從0開始,stop輸入-1,代表最后一個,-2代表倒數第二個)
lrange key start stop
# 6. 獲取指定索引位置的數據
lindex key index
# 7. 獲取整個列表的長度
llen key
# 8. 刪除列表中的數據(它是刪除當前列表中的count個value值,count>0從左側向右側刪除,count<0從右側向左側刪除,count==0刪除列表中的全部value)
lrem key count value
# 9. 保留列表中的數據(保留你指定個索引范圍內的數據,超過整個索引范圍被移除掉)
ltrim key start stop
# 10. 將一個列表中的最后一個數據,插入到另外一個列表的頭部位置
rpoplpush list1 list2
3.5 Set常用命令(不允許重復、無序)
# 1. 存儲數據
sadd key member [member...]
# 2. 獲取數據(獲取全部數據)
smembers key
# 3. 隨機獲取一個數據(獲取的同時,移除數據,count默認為1,代表彈出數據的數量)
spop key [count]
# 4. 交集(取多個set集合交集)
sinter setl set 2 ...
# 5. 並集(獲取全部集合中的數據)
sunion setl set 2 ...
# 6. 差集(獲取多個集合中不一樣的數據)
sdiff setl set2...
# 7. 刪除數據
srem key member [member...]
# 8. 查看當前的set集合中是否包含這個值
sismember key member
3.6 zset常用命令
# 1. 添加數據(score必須是數值。member不允許重復的。)
zadd key score member [score member...]
# 2. 修改member的分數(如果member是存在於key中的,正常增加分數,如果memeber不存在,這個命令就相當於zadd)
zincrby key increment member
# 3. 查看指定的member的分數
zscore key member
# 4. 獲取zset中數據的數量
zcard key
# 5. 根據score的范圍查詢member數量
zcount key min max
# 6. 刪除zset中的成員
zrem key member [member...]I
# 7. 根據分數從小到大排序,獲取指定范國內的數據(withscores如果添加這個參數,那么會返回member對應的分數)
zrange key start stop [withscores]
# 8. 根據分數從大到小排序,獲取指定范圍內的數據(withscores如果添加這個參數,那么會返回member對應的分數)
zrevrange key start stop [withscores]
# 9. 根據分數的返回去獲取member(withscores代表同時返回score,添加1imit,就和MySQL中一樣,如果不希望等於min或者max的值被查詢出來可以采用‘(分數’相當於<但是不等於的方式,最大值和最小值使用+inf和-inf來標識)
zrangebyscore key min max [withscores] [limit offset count]
# 10. 根據分數的返回去獲取member(withscores代表同時返回score,添加limit,就和MySQL中一樣)
zrangebyscore key max min [withscores] [limit offset count]
3.7 key常用命令
# 1. 查看Redis中的全部的key(pattern:*,XXX*,*XXX)
keys pattern
# 2. 查看某一個key是否存在(1-key存在,0-key不存在)
exists key
# 3. 刪除key
del key [key...]
# 4. 設置key的生存時間,單位為秒,單位為毫秒,設置還能活多久
expire key second
pexpire key milliseconds
# 5. 設置key的生存時間,單位為秒,單位為毫秒,設置能活到什么時間點
expireat key timestamp
pexpireat key milliseconds
# 6. 查看key的剩余生存時間,單位為秒,單位為毫秒(-2-當前key不存在,-1-當前key沒有設置生存時間,具體剩余的生存時
間)
ttl key
pttl key
# 7. 移除key的生存時間(1 - 移除成功,0 - key不存在生存時間,key不存在)
persist key
# 8. 選擇操作的庫
select 0~15
# 9. 移動key到另外一個庫中
move key db
3.8 庫的常用命令
# 1. 清空當前所在的數據庫
flushdb
# 2. 清空全部數據庫
flushall
# 3. 查看當前數據庫中有多少個key
dbsize
# 4. 查看最后一次操作的時間
lastsave
# 5. 實時監控Redis服務接收到的目錄
monitor
四、Java連接Redis
Jedis連接Redis,Lettuce連接Redis。
4.1 Jedis連接Redis
創建maven項目
導入需要的依賴
<dependencies>
<!--1、Jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!--2、Junit測試-->
<dependency>
<groupId>junit</groupId>
<version>4.12</version>
</dependency>
<!--3、Lombok-->
<dependency>
<artifactId>1ombok</artifactId>
<version>1.16.20</version>
</dependency>
</dependencies>
測試
public class Demo1 {
@Test
public void set() {
//1.連接Redis
Jedis jedis = new Jedis("192.168.199.109", 6379);
//2.操作Redis - 因為Redis的命令是什么,Jedis的方法就是什么
jedis.set("name", "李四");
//3. 釋放資源
jedis.close():
}
@Test
public void get (){
//1.連接Redis
Jedis jedis = new Jedis("192.168.199.109", 6379);
//2.操作Redis-因為Redis的命令是什么,Jedis的方法就是什么
String value = jedis.get("name") :
System.out.println(value);
//3. 釋放資源
jedis.close():
}
}
4.2 Jedis存儲一個對象到Redis以byte[]形式
准備一個實體類
@Data
@NoArgsConstructor
@A11ArgsConstructor
public class User implements Serializable {
private Integer id;
private String name;
private Date birthday;
}
導入spring-context依賴
<!--4.導入spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
創建Demo測試類,編寫內容
public class Demo2{
//存儲對象-以byte[]形式存儲在Redis中
@Test
public void setByteArray(){
// 1. 連接Redis服務
Jedis jedis = new Jedis("192.168.199.109",6379);
//-------------------------
// 2.1 准備key(String)-value(User)
String key ="user";
User value=new User(1,"張三",new Date());
// 2.2 將key和value轉換為byte[]
byte[] byteKey = SerializationUtils.serialize(key);
byte[] byteValue = SerializationUtils.serialize(value);
// 2.3 將key和value存儲到Redis
jedis.set(byteKey,byteValue);
//---------------------------
// 3. 釋放資源
jedis.close();
}
//獲取對象 - 以byte[]形式在Redis中獲取
@Test
public void getByteArray(){
// 1. 連接Redis服務
Jedis jedis = new Jedis("192.168.199.109",6379);
//-----------------------------
// 2.1 准備key
String key = "user";
// 2.2 將key轉換為byte[]
byte[]bytekey=SerializationUtils.serialize(key);
// 2.3 jedis去Redis中獲取value
byte[]value=jedis.get(byteKey);
// 2.4 將value反序列化為User對象
User user = (User) SerializationUtils. deserialize(value);
// 2.5 輸出
System.out.println("user:"+user);
//------------------------------
// 3. 釋放資源
jedis.close();
}
}
4.3 Jedis存儲一個對象到Redis以String的形式
導入依賴
<!--5.導入fastJSON-->
<dependency>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
測試
public class Demo3{
//存儲對象-以String形式存儲
@Test
public void setString(){
//1.連接Redis
Jedis jedis = new Jedis("192.168.199.109",6379);
//2.1准備key(String)-value(User)
String stringKey = "stringUser";
User value = new User(2,"李四",new Date());
//2.2使用fastJSON將value轉化為json字符串
String stringValue = JSON. toJSONString(value);
//2.3存儲到Redis中
jedis.set(stringKey,stringValue);
//3.釋放資源
jedis.close();
//獲取對象-以String形式獲取
@Test
public void getString(){
//1.連接Redis
Jedis jedis = new Jedis("192.168.199.109",6379);
//2.1准備一個key
String key = "stringUser";
//2.2去Redis中查詢value
String value = jedis . get ( key );
//2.3將value反序列化為User
User user = JSON.parseObject(value,User.class);
//2.4輸出
System.out.println("user:"+user);
//3. 釋放資源
jedis.close();
}
}