1. 程式人生 > 資訊 >電池級碳酸鋰均價突破 50 萬元 / 噸,同比漲幅超 510%

電池級碳酸鋰均價突破 50 萬元 / 噸,同比漲幅超 510%

windows

下載

https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100

然後解壓

開啟服務

然後開啟客服端

Linux

下載地址

https://download.redis.io/releases/redis-6.2.5.tar.gz

https://mirrors.huaweicloud.com/redis/ 映象

然後傳到伺服器上

移動到opt目錄下

mv redis-6.2.5.tar.gz /opt

解壓安裝包

tar -zxvf redis-6.2.5.tar.gz

解壓完進去

安裝

yum install gcc-c++

然後配置環境

make

make 確認一下 可有可無

make install

這就安裝完畢了


預設安裝路徑

/usr/local/bin

然後在這個裡面建一個資料夾把 redis.conf 複製過去

mkdir lybconfig

cp /opt/redis-6.2.5/redis.conf lybconfig/

修改一下redis.conf改成以後臺方式啟動

儲存退出

開啟服務

redis-server lybconfig/redis.conf 用哪個開啟服務

開啟客戶端

redis-cli -p 6379

關閉服務

五大基本型別

Redis命令中心(Redis commands) -- Redis中國使用者組(CRUG)

看存在不

move name 1 刪除

EXPIRE name 10 多久過期 expire

ttl name 離過期還有多久

127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> TYPE age #檢視型別
string

String

get name顯示全部

127.0.0.1:6379> APPEND name love #往後面追加 有了追加 沒有新建
(integer) 7
127.0.0.1:6379> get name
"lyblove"
127.0.0.1:6379> STRLEN name #獲得字串長度strlen
(integer) 7
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> INCR views #加一 in cr
(integer) 1
127.0.0.1:6379> DECR views #減一 de cr
(integer) 0
127.0.0.1:6379> INCRBY views 10 #帶步長的
(integer) 10
127.0.0.1:6379> decrby views 10 #帶步長
(integer) 0

擷取 從 0開始
127.0.0.1:6379> GETRANGE name 3 -1 #獲取[3,最後] getrange range區間,範圍
"love"
127.0.0.1:6379> GETRANGE name 3 4 #[3,4]
"lo"

127.0.0.1:6379> get name
"lyblove"
127.0.0.1:6379> SETRANGE name 0 xxx #修改 他是相當於依次替換
(integer) 7
127.0.0.1:6379> get name
"xxxlove"
127.0.0.1:6379> SETEX a 20 "asdasd" #這個和EXPIRE 不一樣EXPIRE是設定存在的 這個不管純不存在都會替換並新增過期時間
OK
127.0.0.1:6379> setnx name aaa #不存在name 就設定 存在了沒有用
(integer) 0
127.0.0.1:6379> get name
"xxxlove"
127.0.0.1:6379> mset k1 1 k2 2 k3 3 #批量設定
OK
127.0.0.1:6379> mget k1 k2 k3 #批量獲取
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> MSETNX k1 2222 k9 9 #這個是都要成功 原子性 nx不存在時
(integer) 0
127.0.0.1:6379> mget k1 k9 #沒設定成功
1) "1"
2) (nil)
127.0.0.1:6379> getset name lyb #先獲取再設定
(nil)
127.0.0.1:6379> get name
"lyb"


List

lpush list one #放左邊 left

lrange list 0 -1顯示全部

放入值
---------------------------------------------------------------------------------------
127.0.0.1:6379> lpush list one #放左邊 left
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #顯示全部 l 是 list
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list 000 #放右邊
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "000"
---------------------------------------------------------------------------------------
刪除值
127.0.0.1:6379> LPOP list #左刪除
"three"
127.0.0.1:6379> RPOP list #右刪除
"000"
---------------------------------------------------------------------------------------
獲取
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 0 #獲取 list[0]
"two"
127.0.0.1:6379> LINDEX list 1 #獲取 list[1]
"one"
127.0.0.1:6379> llen list #長度
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "one"
2) "one"
3) "one"
4) "two"
5) "one"
127.0.0.1:6379> LREM list 1 one #移除一個 one 具體的值
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "one"
2) "one"
3) "two"
4) "one"

---------------------------------------------------------------------------------------
擷取
127.0.0.1:6379> rpush list 0 1 2 3 4 5
(integer) 6
127.0.0.1:6379> LRANGE list 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
127.0.0.1:6379> ltrim list 1 3 #擷取 [1,3]
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "1"
2) "2"
3) "3"
---------------------------------------------------------------------------------------
移動
127.0.0.1:6379> RPUSH list 0 1 2 3 4 5 6 last
(integer) 8
127.0.0.1:6379> RPOPLPUSH list newlist # right pop | l push 把list的取出來放到newklist
"last"
127.0.0.1:6379> LRANGE list 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
127.0.0.1:6379> LRANGE newlist 0 -1
1) "last"
---------------------------------------------------------------------------------------
修改
127.0.0.1:6379> LRANGE list 0 -1
1) "0"
2) "1"
127.0.0.1:6379> lset list 0 first #修改第0個改成 這個
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "first"
2) "1"
127.0.0.1:6379> LINSERT list before 1 one #在索引為1的前面插入
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "first"
2) "one"
3) "1"

set

集合

SADD sets aaa #新增

smembers k顯示

127.0.0.1:6379> SADD sets aaa  #新增
(integer) 1
127.0.0.1:6379> SADD sets bbb
(integer) 1
127.0.0.1:6379> SADD sets bbb
(integer) 0
127.0.0.1:6379> smembers sets #檢視全部
1) "bbb"
2) "aaa"
127.0.0.1:6379> scard sets #看有多少個
(integer) 2
-----------------------------------------------------------------------------------
127.0.0.1:6379> sadd k1 a b c
(integer) 3
127.0.0.1:6379> sadd k2 c d e
(integer) 3
127.0.0.1:6379> sdiff k1 k2 #sdiff就是相當於減 看k1 -k2
1) "b"
2) "a"
127.0.0.1:6379> sdiffstore k k1 k2 #這個是相當於k1-k2 放到k裡面
(integer) 2
127.0.0.1:6379> smembers k
1) "b"
2) "a"
127.0.0.1:6379> SINTER k1 k2 #取交集 s inter
1) "c"
127.0.0.1:6379> SINTERSTORE m k1 k2 #這個是相當於取交集 放到m裡面 s inter store 和上面一樣
(integer) 1
127.0.0.1:6379> SMEMBERS m
1) "c"


127.0.0.1:6379> sadd k1 a b c d
(integer) 4
127.0.0.1:6379> sadd k2 b d e g
(integer) 4
127.0.0.1:6379> SUNION k1 k2 #這個是取合集
1) "e"
2) "g"
3) "d"
4) "b"
5) "c"
6) "a"
127.0.0.1:6379> SUNIONSTORE k k1 k2 #這個也和上面一樣 就是合集放到k裡面
(integer) 6
127.0.0.1:6379> SMEMBERS k
1) "e"
2) "g"
3) "d"
4) "b"
5) "c"
6) "a"

-----------------------------------------------------------------------------------
127.0.0.1:6379> sismember k1 a #就是判斷k1 裡面有沒有a 有了就是1 沒有就是0
(integer) 1
127.0.0.1:6379> sismember k1 z
(integer) 0
-----------------------------------------------------------------------------------
127.0.0.1:6379> smove k1 k2 a #把 a裡面的k1 放到 k2 裡面 沒有不操作
(integer) 1
127.0.0.1:6379> spop k1 2 #刪除k1 的2個 隨機刪除
1) "a"
2) "c"
-----------------------------------------------------------------------------------
127.0.0.1:6379> SMEMBERS k1
1) "e"
2) "d"
3) "b"
4) "a"
5) "c"
127.0.0.1:6379> srandmember k1 #隨機顯示一個數但是不刪除
"e"
127.0.0.1:6379> srandmember k1 10
1) "e"
2) "d"
3) "b"
4) "a"
5) "c"
127.0.0.1:6379> srandmember k1 -10
1) "b"
2) "a"
3) "d"
4) "c"
5) "a"
6) "a"
7) "d"
8) "e"
9) "d"
10) "a"

127.0.0.1:6379> SREM k1 b #刪除指定的
(integer) 1
127.0.0.1:6379> SMEMBERS k1
1) "e"
2) "d"
3) "a"
4) "c"

hash

雜湊 有名字有地方

一一對應

名字+地方 = 一個值

一個雜湊可以有多個地方 一個地方一個值

#——————————————————————————————————————————————————————————————————————————————————————
127.0.0.1:6379> hset h1 filed a
(integer) 1
127.0.0.1:6379> hset h1 filed b #可以改值
(integer) 0
127.0.0.1:6379> hget h1 filed #獲取
"b"
127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World" #同時設定多個
OK
127.0.0.1:6379> hgetall k2 #獲取全部的
1) "filed2"
2) "b"
3) "filed1"
4) "a"
127.0.0.1:6379> HKEYS k1 #獲取全部的地方
1) "filed"
2) "filed2"
127.0.0.1:6379> HVALS k1 #獲取全部的值
1) "9.1"
2) "10"
127.0.0.1:6379> hmget k1 filed filed1 #獲取指定地方的值 這個是多個
1) "9.1"
2) (nil)
127.0.0.1:6379> HEXISTS h1 filed #看雜湊裡面有沒有這個地址
(integer) 1 #有
127.0.0.1:6379> HEXISTS h1 filedd
(integer) 0 #沒有
127.0.0.1:6379> HLEN k1 #看有多少值
(integer) 2
127.0.0.1:6379> HSETNX k1 filed xxx #這個地方要是有值就不改 沒值就寫進去
(integer) 0
127.0.0.1:6379> hstrlen k1 filed #獲取指定地方的字串長度
#——————————————————————————————————————————————————————————————————————————————————————
127.0.0.1:6379> hdel h1 filed #刪除雜湊的這個地方
(integer) 1

127.0.0.1:6379> hset k1 filed 6
(integer) 1
127.0.0.1:6379> HINCRBY k1 filed 3 #這個相當於 加3 進行計算
(integer) 9
127.0.0.1:6379> HINCRBYFLOAT k1 filed 0.1 #這個相當於 小數計算
"9.1"

zset

三種特殊型別

地理空間 Geospatial

底成是zset

127.0.0.1:6379> geoadd china 116.397128 39.916527 beijing 121.478423671875 31.22694067865231 shanghai
(integer) 2 #就是 china相當於一個數據庫 後面的是他的資料
127.0.0.1:6379> GEODIST china beijing shanghai #china資料庫中的 北京和上海的距離 預設是m
"1069764.8271"
127.0.0.1:6379> GEODIST china beijing shanghai km #改成km
"1069.7648"
127.0.0.1:6379> GEORADIUS china 116.3 39.9 100 km #這個座標100km子內的城市 前提是資料錄入進去了
1) "beijing"
127.0.0.1:6379> GEORADIUS china 116.3 39.9 1 km #沒有就是空
(empty array)
127.0.0.1:6379> GEORADIUS china 116.3 39.9 100 km withdist #具體多遠 再加count 1 就是顯示幾個
1) 1) "beijing"
2) "8.4883"
127.0.0.1:6379> GEORADIUSBYMEMBER china beijing 10000 km #以一個城市為中心附近的
1) "shanghai"
2) "beijing"
——————————————————————————————————————————————————————————————————————————————————————————————-
127.0.0.1:6379> zrange china 0 -1
1) "shanghai"
2) "beijing"
127.0.0.1:6379> zrem chin beijing #要移除
(integer) 0

基數統計 Hyperloglog

有0.81%的錯誤

有點像集合 不重複

127.0.0.1:6379> PFADD one aaa b ccc d #新增
(integer) 1
127.0.0.1:6379> PFCOUNT one #看數量
(integer) 4
127.0.0.1:6379> pfadd two bbb ddd z b
(integer) 1
127.0.0.1:6379> PFCOUNT two
(integer) 4
127.0.0.1:6379> PFMERGE one two
OK
127.0.0.1:6379> PFCOUNT one
(integer) 7
127.0.0.1:6379> pfmerge three one two #加進去可以是多個 three還沒被建立會自動建立
OK
127.0.0.1:6379> pfcount three
(integer) 7

Bitmaps

可以理解為 1做了 0沒做

setbit sign 6 1

#設定這周的打卡情況 
#0-6 周幾 0沒打卡 1打卡了
127.0.0.1:6379> setbit sign 0 1 #寫進去值
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
#看看這天打卡沒
127.0.0.1:6379> getbit sign 1 #獲取值
(integer) 1
127.0.0.1:6379> getbit sign 2
(integer) 0

127.0.0.1:6379> bitcount sign #統計字串被設定為1的bit數
(integer) 6

事務

單條是保證原子性

但是整個事務不保證原子性

127.0.0.1:6379> multi  #開啟事務
OK
#中間的各種事務
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> exec #執行事務
1) OK
2) OK
3) "v2"
4) OK
127.0.0.1:6379> DISCARD #放棄事務
  • 編譯型異常事務中所有命令都不會執行 (程式碼有問題 ,命令有問題)

  • 執行時異常(1/0)錯誤的不執行,其他的照樣執行

watch相當於加了個樂觀鎖

127.0.0.1:6379> WATCH k1  #開啟
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incrby k1 10
QUEUED
127.0.0.1:6379(TX)> EXEC
1) (integer) 120

#還沒執行就被修改了
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incrby k1 10 #另一邊127.0.0.1:6379> INCRBY k1 100
QUEUED
127.0.0.1:6379(TX)> EXEC
(nil)

unwatch

重新整理一個事務中已被監視的所有key。

如果執行EXEC 或者DISCARD, 則不需要手動執行UNWATCH

Jedis

先保證redis服務是開啟的

建立一個maven專案

導包

<dependencies>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
</dependencies>

建立一個類

裡面的命令和redis裡面的一樣不過換成了方法

package com.hkd;

import redis.clients.jedis.Jedis;

public class TestPing {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1",6379);
System.out.println(jedis.ping());

}
}

裡面的事務

package com.hkd;

import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

/*
事務
*/
public class TestTx {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1",6379);
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","lyb");
jsonObject.put("age",20);
String string = jsonObject.toJSONString();
jedis.flushAll();
Transaction multi = jedis.multi();

try {
multi.set("user1",string);
multi.set("user2",string);
//int i = 1/0;
multi.exec();
} catch (Exception e) {
multi.discard();
e.printStackTrace();
} finally {
System.out.println(jedis.get("user1"));
System.out.println(jedis.get("user2"));
jedis.close();
}
}

}

Spring-Boot整合redis

Spring-Boot 2.x以後預設使用的是Lettuce

使用jedis:Jedis在實現上是直接連線的redis server,如果在多執行緒環境下是非執行緒安全的,這個時候只有使用連線池,為每個Jedis例項增加物理連線 使用Lettuce:Lettuce的連線是基於Netty的,連線例項(StatefulRedisConnection)可以在多個執行緒間併發訪問,應為StatefulRedisConnection是執行緒安全的,所以一個連線例項

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

@Autowired
RedisTemplate redisTemplate;
@Test
void contextLoads() {
/*
基本操作
redisTemplate.opsForValue()相當於一個String型別的操作
redisTemplate.opsForList()操作List
redisTemplate.opsForHash() Hash
剩下的都一樣
redisTemplate.opsFor...()


事務的操作
redisTemplate.multi();
redisTemplate.exec();

redis連線物件
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
connection.flushDb();
connection.flushAll();
*/

//要是寫中文會出問題 因為牽扯到一個序列化的問題
redisTemplate.opsForValue().set("name","lyb1");
System.out.println(redisTemplate.opsForValue().get("name"));


}

自定義RedisTemplate

就是為了不亂碼

package com.hkd.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;


import java.net.UnknownHostException;

@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);

//序列化配置
Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectJackson2JsonRedisSerializer.setObjectMapper(objectMapper);

//String的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setValueSerializer(objectJackson2JsonRedisSerializer);
template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
template.afterPropertiesSet();

return template;
}
}

Redis工具類

D:\桌面\學習\筆記

Redis持久化

因為redis不是一個數據庫 他的資料是放在記憶體裡面的(斷電即失)

所有要把他存起來也就是持久化

然後有兩種方法各有千秋

RDB機制(Redis DataBase) 預設

好處 存取效率高恢復快 壞處 丟的資料可能比較多(比aof多 )

你用redis寫資料,資料是在記憶體裡面的(斷電即失)

然後RDB機制會再執行一個執行緒fork 滿足一定條件會把資料儲存到一個檔案裡面這樣就可以儲存資料了

但是萬一還沒有到下一次儲存的時間突然斷電了就會丟失一部分資料

就是用快照的方式儲存下來

RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟。也是預設的持久化方式,這種方式是就是將記憶體中資料以快照的方式寫入到二進位制檔案中,預設的檔名為dump.rdb。

就是把裡面的資料儲存到檔案裡面然後下次讀的時候再讀取檔案

多少秒 改幾次 的情況下儲存一次

快照 觸發機制

  • 1.滿足設定的觸發條件

  • 2.使用了flushall命令

  • 3.關閉redis的時候(shutdown)

滿足條件就儲存下來

就算關機了也沒時

資料恢復

因為資料存在dump.rdb

redis會讀取這個檔案把資料讀進去

這個檔案是在一個特定的位置下的 ,一般不用管 /usr/local/bin

AOF機制(Append Only File)

好處是資料丟失的少(最多丟一秒資料) 缺點是恢復資料慢 生成的檔案大

將所有的命令都記下來 只記寫入 不計讀 讀對資料不影響

有點像歷史記錄

然後恢復的時候全部重新執行一遍 肯定慢

預設關閉

要是開啟這個設定需要重啟redis

重啟完

要是這個檔案被破壞了就啟動不了redis了

怎麼修復

redis-check-aof --fix appendonly.aof

訊息訂閱

PSUBSCRIBE pattern [pattern ...] #訂閱一個或多個符合給定模式的頻道;

PUBSUB subcommand [argument [argument ...]] #檢視訂閱與釋出系統狀態;

PUBLISH channel message #將資訊傳送到指定的頻道;

PUNSUBSCRIBE [pattern [pattern ...]] #退訂所有給定模式的頻道;

UBSCRIBE channel [channel ...] #訂閱給定的一個或多個頻道的資訊;

UNSUBSCRIBE [channel [channel ...]] #指退訂給定的頻道;

訂閱端
127.0.0.1:6379> SUBSCRIBE lyb
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "lyb"
3) (integer) 1
1) "message"
2) "lyb"
3) "hello" Ctrl-C 退出
釋出端 發之後會收到
127.0.0.1:6379> PUBLISH lyb "hello"
(integer) 1

UNSUBSCRIBE () 退訂 某一個 要不然就是全退

主從複製