1、五大基本資料型別和操作
1.1 字串-string
| 命令 | 說明 |
|---|---|
| set key value | 如果key還沒有,那就可以添加,如果key已經存在了,那會覆寫原有key的值 |
| get key | 如果key還沒有,獲取為(nil),代表key沒有被使用,如果key存在,可以獲取對應key的值 |
| exists key | 判斷某個key是否存在,回傳Integer值1 代表存在,如果 exists car2 則回傳0,不存在 |
| move key db | 將當前資料庫存在的鍵值移動到其它資料庫,其中db是資料庫的序號 |
| expire key 秒鐘 | 為已經存在的key設定過期時間,注意過期之后,從記憶體中去掉了,是get不到的 |
| ttl key | 查看還有多少秒過期,-1表示永不過期,-2表示已過期 |
| type key | 命令用于回傳 key 所儲存的值的型別 |
| del key | 根據key值洗掉 |
| append key value | 根據key將其值進行字串拼接 |
| strlen key | 根據key獲取其值的字串長度,位元組數 |
| incr key | 對key對應數值進行加一操作,對應的字串值必須是數值 |
| decr key | 對key對應數值進行減一操作 |
| incrby key 數值 | 對key對應數值按照指定的值進行遞增 |
| decrby key 數值 | 對key對應數值按照指定的值進行遞減 |
| getrange key 起始位置 結束位置 | 獲取指定區間內的值,類似between,,,and的關系,起始位置為0,結束位置為-1 就是回傳所有 |
| setrange key 起始位置 具體值 | 設定指定區間內的值,具體值會從起始位置開始覆寫 |
| setex key 過期秒值 真實值 | 設定帶過期時間的key,動態設定, |
| setnx key value | 只有在 key 不存在時,才會設定 key 的值,如果已經存在了,不覆寫,設定不了; |
| setnx key value | 如果回傳0 代表沒有設定成功,key對應值已經存在,如果回傳1代表設定成功;這個就是redis的分布式鎖命令,很重要; |
| mset key1 val1 key2 val2 .... | 同時設定一個或多個 key-value 對 |
| mget key1 key2 key3 .... | 獲取所有(一個或多個)給定 key 的值, |
| msetnx key1 val1 key2 val2 ..... | 同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在 |
1.2 串列-list
list操作起來類似于堆疊;
| 命令 | 說明 |
|---|---|
| lpush key val1 val2 val3 .... | 從左側開始存放元素,先進后出 |
| lrange key 起始位置 結束位置 | 從左側開始,指定范圍獲取元素,-1代表所有 |
| rpush key val1 val2 val3 .... | 從右側開始存放元素,先進先出 |
| lpop key | 從左側一次取出一個元素 |
| rpop key | 從右側一次取出一個元素 |
| lindex key index | 按照索引下標獲得元素(從左到右,左下標從0開始,如果是-1代表最后一個,-2代表倒數第二個) |
| llen key | 獲取集合元素個數 |
| lrem key 個數 具體的值 | 從左往右洗掉指定個數等于具體值的元素,回傳的值為實際洗掉的數量,個數0,表示洗掉全部給定的值 |
| ltrim key 開始index 結束index | 截取指定范圍的值后再賦值給key |
| rpoplpush 源串列 目的串列 | 移除串列的最后一個元素,并將該元素添加到另一個串列并回傳 |
| lset key index value | 將key集合中的指定下標位置值改為value |
| linsert key before/after 值1 值2 | 在list某個已有 值1 的前后再添加具體 值2 |
小結:
- 它是一個字串鏈表,left、right都可以插入添加;
- 如果鍵不存在,創建新的鏈表;
- 如果鍵已存在,新增內容;
- 如果值全移除,對應的鍵也就消失了;
- 鏈表的操作無論是頭和尾效率都極高,但假如是對中間元素進行操作,效率就很慘淡了;
1.3 集合-set
| 命令 | 說明 |
|---|---|
| sadd key val1 val2 ... | 集合set中添加元素,如果有重復元素會自動去除 |
| smembers key | 查看集合中的元素 |
| sismember key val | 判斷val是否在set集合中,如果在回傳1 ,不在回傳0 |
| scard key | 獲取集合里面的元素個數 |
| srem key value | 洗掉集合中元素 |
| srandmember key 某個整數 | 隨機出幾個數,如果超過最大數量就全部取出 |
| srandmember key 某個整數 | 如果寫的值是負數,比如-3 ,表示需要取出3個,但是可能會有重復值, |
| spop key | 隨機出堆疊 |
| smove key1 key2 | 將key1里的某個值賦給key2 |
| sdiff key1 key2 | 在第一個set里面而不在后面任何一個set里面的項 |
| sinter key1 key2 | 在兩個set中都有的值的交集回傳 |
| sunion key1 key2 | 在兩個set中所有的值的集合回傳,會自動排除重復 |
1.4 鍵值對-hash
K V模式不變,但V是一個鍵值對;
| 命令 | 說明 |
|---|---|
| hset 父key 子key 子value | 將父key,增加子鍵值對,類似屬性 |
| hget 父key 子key | 獲取父key,某個子key的值,獲取屬性值 |
| hmset 父key 子key1 子val1 子key2 子val2 .... | 批量添加屬性 |
| hmget 父key 子key1 子key... | 批量獲取屬性 |
| hgetall 父key | 批量獲取屬性及值 |
| hdel 父key 子key | 洗掉子key屬性及值 |
| hlen 父key | 回傳父key中的子key個數,相當于java物體的屬性個數 |
| hexists 父key 子key | 判斷父key中是否包含某個子key,結果為1,代表存在 |
| hkeys 父key | 獲取父key中所有的子key |
| hvals 父key | 獲取父key中的所有的子val |
| hincrby 父key 子key 值 | 給指定的子key值增加固定的值 |
| hincrbyfloat 父key 子key 值 | 給有指定key的值增加小數 |
| hsetnx 父key 子key 子val | 如果子key存在則失敗,如果不存在則賦值 |
1.5 有序集合-zset
在set基礎上,加一個score值,之前set是k1 v1 v2 v3,現在zset是k1 score1 v1 score2 v2;
| 命令 | 說明 |
|---|---|
| zadd key score1 val1 score2 val2 score3 val3 ... | 有序集合添加帶score值的元素 |
| zscore key val | 獲取集合中某個值對應score值 |
| zrange key 0 -1 [withscores] | zrange zset1 0 -1 ,結果為所有的值,不帶分數;如:zrange zset1 0 -1 ,結果為所有的值,不帶分數 |
| zrange zset1 0 -1 withscores | 結果為所有的值和分數 |
| zrangebyscore key 開始score 結束score | 獲取score值在開始score-結束score之間的元素 |
| zrangebyscore zset1 10 40 | 獲取score值在10-40之間的元素,包含10和40 |
| zrangebyscore zset1 10 (40 | 不包含40值;( 的含義是不包含 |
| zrangebyscore zset1 (10 (40 | 不包含10,40值 |
| zrangebyscore zset1 10 50 limit 2 2 | limit 結果的起始下標,獲取的個數;limit 含義是限制獲取的條數,相當于mysql的分頁; |
| zrem key 某score下對應的value值 | 洗掉元素 |
| zcard key | 獲取key對應的值的個數;注意score 和 value是一個整體 |
| zcount key score區間 | 獲取分值區間內元素個數 |
| zrank key values值 | 獲得下標值 |
| zscore key 對應value值 | 獲得value對應分數 |
| zrevrank key value值 | 逆序獲得對應逆序的下標值 |
| zrevrange key 起始下標,結束下標 | 將之前順序進行倒序 |
| zrevrangebyscore key 結束score 開始score | 根據score值輸出元素 |
| zincrby key 增加分值 value值 | 給對應的值增加score值 |
2、Redis整合
2.1 spring-boot-starter-data-redis 依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2 redis配置
#埠號
server:
port: 8096
# redis配置
spring:
redis:
host: 127.0.0.1 #如果是redis遠程服務器,此處redis服務器ip地址
port: 6379 #默認埠
# database: 0 #指定redis資料庫,默認是0
# password: # 密碼有就寫,沒有就省略
2.3 SpringBoot框架自動配置的redisTemplate
2.3.1 清空資料庫
//自動裝配 SpringBoot框架自動配置的redisTemplate
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
//基于SpringBoot框架自動配置的redisTemplate,操作redis快取
//獲取連接
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//清空資料庫中的所有資料
log.info("清空資料庫中的所有資料");
connection.flushDb();
2.3.2 添加資料
//程式中,添加資料據到redis
log.info("------ 基于SpringBoot框架自動配置的redisTemplate 添加資料 ------");
redisTemplate.opsForValue().set("kh96_class_name","KGC_KH96");
redisTemplate.opsForValue().set("student_num",19);
2.3.3 獲取資料
//程式中,從redis獲取資料
log.info("------ 基于SpringBoot框架自動配置的redisTemplate 獲取資料 ------");
log.info("****** 根據 班級的key:{},獲取班級名稱:{} ******","kh96_class_name",redisTemplate.opsForValue().get("kh96_class_name"));
log.info("****** 根據 班級的key:{},獲取班級人數:{} ******","student_num",redisTemplate.opsForValue().get("student_num"));
2.3.4 修改值 (出現錯誤)
//程式中,基于SpringBoot框架自動配置的redisTemplate,操作redis快取,存在問題
//場景:對班級人數進行增減操作,比如將班級人數,增加10
log.info("------ 基于SpringBoot框架自動配置的redisTemplate 操作資料 ------");
redisTemplate.opsForValue().increment("student_num",10);
//直接報錯,會報500例外: redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range
//原因,通過系統默認的 redisTemplate,存放key和value值時,會自動使用Object類的序列化和反序列化,導致redis中真實存放的資料不是原始值,而是序列化后的值
資料結果:

2.4 自定義redisTemplate
2.4.1 fastjson 依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
2.4.2 自定義redisTemplate 配置類
//Redis自定義配置類,實作一個自定義序列化方式的 redisTemplate,提緩緩掉默認自動配置的 redisTemplate,實作String型別任意型別的value
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 自定義redisTemplate的模板物件
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 設定連接工廠
template.setConnectionFactory(redisConnectionFactory);
//由于要通程序式操作遠程的redis資料庫,必須支持序列化,才可以讓程式中的資料,在網路中傳輸
//定義String型別的序列化方式
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 定義fastjson序列化方式,可以序列化任何物件
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
// 需改為新的序列化方式
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
// 初始化為新的模板
template.afterPropertiesSet();
return template;
}
}
2.4.3 使用自定義redisTemplate 重新操作資料
//自動裝配自定義 redisTemplate
@Autowired
private RedisTemplate<String,Object> redisTemplate;
//其他代碼不變
操作結果:

2.5 自定義redisUtils工具類
2.5.1 自定義redisUtils工具類
---> RedisUtil 工具類
2.5.2 使用自定義redisTemplate和redisUtils工具類
@GetMapping("/testRedisUtils")
public String testSpringBootRedisUtils(){
//基于自定義的redisTemplate 和 RedisUtils 工具類,操作redis快取
//程式中,添加資料據到redis
log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 添加資料 ------");
redisUtils.set("kh96_class_name_utils","KGC_KH96");
redisUtils.set("student_num_utils",19);
//程式中,從redis獲取資料
log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 獲取資料 ------");
log.info("****** 根據 班級的key:{},獲取班級名稱:{} ******","kh96_class_name_utils",redisUtils.get("kh96_class_name_utils"));
log.info("****** 根據 班級的key:{},獲取班級人數:{} ******","student_num_utils",redisUtils.get("student_num_utils"));
//程式中,基于SpringBoot框架自動配置的redisTemplate,操作redis快取
//場景:對班級人數進行增減操作,比如姜班級人數,增加10
log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 操作資料 ------");
redisUtils.incr("student_num_utils",10);
return "工具類 RedisUtils 操作 redis 成功!";
}
2.5.3 程式中如何存放物件到 redis
核心思想:一般都是姜物件轉換為json字串,存入redis,獲取物件資料,就先獲取json字串,再轉換為對應物件即可;
@GetMapping("/testRedisUtils")
public String testSpringBootRedisUtils(){
//程式中如何存放物件到 redis
//核心思想:一般都是姜物件轉換為json字串,存入redis,獲取物件資料,就先獲取json字串,再轉換為對應物件即可
//模擬用戶登錄成功后,將用戶資訊存入redis中,方便后續從redis中獲取用戶資訊
User loginUser = User.builder().userId(1001).userName("KH96").userTel("135012030404").build();
//直接將物件存入redis即可
log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 存盤物件 ------");
//自動把物體,通過fastjson的序列化方式,轉發為JSON字串存盤
redisUtils.set(loginUser.getUserId().toString(),loginUser);
//模擬獲取登錄用戶資訊,直接從redis獲取存入的JSON字串,轉換為目標用戶物件
User realUser = JSON.parseObject(redisUtils.get(loginUser.getUserId().toString()).toString(),User.class);
log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類獲取物件:{} ",realUser);
return "工具類 RedisUtils 操作 redis 成功!";
}
資料結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517510.html
標籤:Java
上一篇:MQ詳解
下一篇:使用偏移量的方式進行分頁查詢
