Redis初識、Redis的安裝與啟動、Redis命令及Java客戶端詳解
前言
在高并發(fā)場景成為常態(tài)的后端系統(tǒng)中,Redis 已成為不可或缺的核心組件。本文主要是講Redis基礎(chǔ):從基礎(chǔ)概念入手,教你Linux環(huán)境安裝與常用命令實戰(zhàn),系統(tǒng)掌握 Redis 的核心能力,為進階學(xué)習(xí)與實際項目應(yīng)用夯實基礎(chǔ)。
本文記錄在學(xué)習(xí)Redis過程中的關(guān)鍵技術(shù)實踐與踩坑思考,包含個人在實際學(xué)習(xí)中的具體過程與遇到的問題以及知識點總結(jié)
1.初識Redis
1.1NoSQL
| SQL | NoSQL | |
|---|---|---|
| 數(shù)據(jù)結(jié)構(gòu) | 結(jié)構(gòu)化 | 非結(jié)構(gòu)化 |
| 數(shù)據(jù)關(guān)聯(lián) | 關(guān)聯(lián)的 | 無關(guān)聯(lián)的 |
| 查詢方法 | SQL查詢 | 非SQL |
| 事務(wù)特性 | ACID | BASE |
| 存儲方式 | 磁盤 | 內(nèi)存 |
| 擴展性 | 垂直 | 水平 |
| 使用場景 | 數(shù)據(jù)結(jié)構(gòu)固定、相關(guān)業(yè)務(wù)對數(shù)據(jù)安全性一致性要求高 | 數(shù)據(jù)結(jié)構(gòu)不固定、對數(shù)據(jù)安全性一致性要求不高、對性能要求高 |
NoSQL的數(shù)據(jù)結(jié)構(gòu):
- 鍵值結(jié)構(gòu)(Redis)
- 文檔類型(MongoDB)
- 列類型(HBase)
- Graph類型(Neo4j)
1.2Redis
遠程詞典服務(wù)器,基于內(nèi)存的鍵值型NoSQL數(shù)據(jù)庫
特征:
- 鍵值型,value支持多種不同數(shù)據(jù)結(jié)構(gòu),功能豐富
- 單線程,每個命令具備原子性
- 低延遲,速度快(基于內(nèi)存、IO多路復(fù)用、良好的編碼)
- 支持數(shù)據(jù)持久化
- 支持主從集群、分片集群
- 支持多語言客戶端
1)安裝Redis
官網(wǎng):Redis - The Real-time Data Platform
打開虛擬機,打開終端 我這里用的是VMware+Finalshell
切換為root管理員:輸入
su -,回車后輸入密碼安裝Redis所需的gcc依賴
yum install -y gcc tcl
上傳壓縮包并解壓
把Redis安裝包放到
/usr/local/src下進入該目錄下
cd /usr/local/src/
解壓
tar -zxvf redis-6.2.6.tar.gz
進入redis安裝目錄
cd redis-6.2.6
運行編譯命令
make && make install

沒有錯誤就證明安裝好了
默認安裝路徑是
/usr/local/bin
reids-cli:是redis提供的命令行客戶端
redis-server:是redis的服務(wù)端啟動腳本
redis-sentinel:是redis的哨兵啟動腳本
哨兵是 Redis 的一種高可用方案,用來:
- 監(jiān)控主節(jié)點
- 自動故障轉(zhuǎn)移
- 自動選舉新的主節(jié)點
2)啟動Redis
Redis的啟動方式:
- 默認啟動
- 指定配置啟動
- 開機自啟
一.默認啟動
安裝完成后,在任意目錄輸入
redis-server
即可啟動

如圖這樣就啟動成功了
此為前臺啟動,會阻塞整個會話窗口,窗口關(guān)閉或者按下Ctrl + C就會將Redis停止
二.指定配置啟動
要想讓Redis后臺啟動,就必須修改Redis的配置文件,該文件就在/usr/local/src/redis-6,2,6,名為redis.conf
首先備份一份配置文件,先進到該目錄下
cd /usr/local/src/redis-6.2.6/
備份配置文件
cp redis.conf redis.conf.bck
開始修改配置文件
vi redis.conf
常見配置

其他配置

tips:快速查找
輸入
/關(guān)鍵字按下Enter匹配到第一個關(guān)鍵字所在地方按n調(diào)到下一個匹配,按N調(diào)到上一個匹配
找到要修改的地方后,按下i,左下角出現(xiàn)-- INSERT --,表示進入插入模式,按Esc回到普通模式
1.修改bind

2.修改daemonize

3.添加密碼

4.記錄日志,指定日志文件
![]()
最后 保存文件
按Esc退出插入模式,輸入:
:wq
按下回車進行保存
想要指定配置啟動,只需在啟動Redis時指定配置文件:
redis-server redis.conf
若處于redis安裝目錄下,即可省略配置文件的全路名

本次啟動后沒有剛才那些信息,用:
ps -ef|grep redis
可以檢查redis是否成功啟動
停止進程用:(后面的數(shù)改錯自己對應(yīng)的PID)
kill -9 75659
也可以用:
redis-cli -a 密碼 shutdown
三.開機自啟
首先新建一個系統(tǒng)服務(wù)文件:
vi /etc/systemd/system/redis.service
內(nèi)容如下:
[Unit] Description=redis-server After=network.target [Service] Type=forking ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf PrivateTmp=true [Install] WantedBy=multi-user.target
然后重載系統(tǒng)服務(wù):
systemctl daemon-reload
接下來用下面這組命令來操作redis了:
# 啟動 systemctl start redis # 停止 systemctl stop redis # 重啟 systemctl restart redis # 查看狀態(tài) systemctl status redis
執(zhí)行下面的命令,可以讓redis開機自啟:
systemctl enable redis
3)Redis客戶端
安裝好Redis后,操作Redis實現(xiàn)數(shù)據(jù)的CRUD需要用到Redis客戶端:
- 命令行客戶端
- 圖形化桌面客戶端
- 編程客戶端
Redis安裝完成后就自帶了命令行客戶端:redis-cli
redis-cli [options] [commonds]
常見的options有:
-h 127.0.0.1:指定要連接的redis客戶端IP地址,默認是127.0.0.1-p 6379:指定要連接的redis節(jié)點的端口,默認是6379-a 123456:指定redis的訪問密碼也可以使用客戶端之后再輸入密碼
AUTH 密碼
commonds是redis的操作命令:
ping:給redis服務(wù)端做心跳測試,服務(wù)端正常會返回PONG
不指定commond時,會進入redis-cli的交互控制臺
配置圖形化桌面客戶端:
這里我用的是Another Redis
**1.**首先輸入exit退出剛才的命令行客戶端
2.開放6379端口
不開放端口,外部設(shè)備就連不上你的服務(wù)
先看看防火墻開沒開:
systemctl status firewalld
如果防火墻在運行就需要開放端口:
firewall-cmd --permanent --add-port=6379/tcp firewall-cmd --reload
--permanent意思是:把規(guī)則寫入配置文件(永久保存)firewall-cmd --reload作用是:重新讀取配置文件,應(yīng)用新的防火墻規(guī)則
3.連接ARDM
Host: 虛擬機IP
Port: 6379
Password: 你設(shè)置的密碼
2.Redis命令
2.1數(shù)據(jù)結(jié)構(gòu)介紹
Redis是一個key-value的數(shù)據(jù)庫,key一般是String類型,value的類型多種多樣:

2.2通用命令
KEYS:查看符合模版的所有的keyDEL:刪除一個指定的keyEXISTS:判斷key是否存在EXPIRE:給一個key設(shè)置一個有效期,有效期到底key就會自動刪除TTL:查看一個key的剩余有效期
通過help [command]可以查看一個命令的具體用法

2.3String類型
字符串類型,其value是字符串,根據(jù)字符串的類型不同,又可以分成三類:
- string:普通字符串
- int:整數(shù)類型,可以做自增自減操作
- float:浮點類,可以做自增自減操作型
不管是哪種格式,底層都是字節(jié)數(shù)組形式存儲,只不過編碼方式不同
字符串類型的最大空間不能超過512m
String常見命令:
SET:添加或修改已經(jīng)存在的一個String類型的鍵值對
GET:根據(jù)key獲取String類型的value
MSET:批量添加多個String類型的鍵值對
MGET:根據(jù)多個key獲取多個String類型的value
INCR:讓一個整型的key自增
INCRBY:讓一個整型的key自增并指定步長
eg:
incrby num 2讓num自增2INCRBYFLOAT:讓一個浮點類型的key自增并指定步長
SETNX:添加一個String類型的鍵值對,前提是key不存在,否則不執(zhí)行
SETEX:添加一個String類型的鍵值對,并且指定有效期
2.4key的層級格式
Redis的key允許有多個單詞形成層級結(jié)構(gòu),多個單詞用:隔開,eg:
項目名:業(yè)務(wù)名:類型:id
(格式不固定)
2.5Hash
Hash結(jié)構(gòu)可以將對象中的每個字段獨立存儲,可以針對單個字段做CRUD

Redis的常見命令:
- HSET key field value:添加或修改Hash類型key的field的值
- HGET key field:獲取一個Hash類型key的field的值
- HMSET:批量添加Hash類型key的field的值
- HMGET:批量獲取Hash類型key的field的值
- HGETALL:獲取一個hash類型的key中的所有的field和value
- HKEYS:獲取一個hash類型的key中的所有的field
- HVALS:獲取一個hash類型的key中的所有的value
- HINCRBY:讓一個hash類型key的字段自增并指定步長
- HSETNX:添加一個hash類型的key的field值,前提是這個field不存在,否則不執(zhí)行
2.6List類型
與Java中的LinkedList類型,可以視為雙向鏈表,既支持正向檢索也支持反向檢索
特征:
- 有序
- 元素可以重復(fù)
- 插入和刪除快
- 查詢速度一般
List常見命令:
- LPUSH key element … :向列表左側(cè)插入一個或多個元素
- LPOP key:移除并返回列表左側(cè)的第一個元素,沒有則返回nil
- RPUSH key element … :向列表右側(cè)插入一個或多個元素
- RPOP key:移除并返回列表右側(cè)的第一個元素
- LRANGE key start end:返回一段角標范圍內(nèi)的所有元素
- BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil
在Redis中,
nil表示空值
2.7Set類型
與Java中的HashSet類似
特征:
- 無序
- 元素不可重復(fù)
- 查找快
- 支持交集、并集、差集等功能
Set常用命令:
- SADD key member …:向set中添加一個或多個元素
- SREM key member …:移除set中的指定元素
- SCARD key:返回set中元素的個數(shù)
- SISMEMBER key member:判斷一個元素是否存在于set中
- SMEMBERS:獲取set中的所有元素
- SINTER key1 key2 …:求key1和key2的交集
- SDIFF key1 key2 …:求key1和key1的差集
- SUNION key1 key2 …:求key1和key1的并集
2.8SortedSet類型
Redis的SortedSet是一種可排序的set集合,SortedSet中的每一個元素都帶有一個score屬性,可以基于score屬性進行排序,底層的實現(xiàn)是一個跳表+hash表
特征:
- 可排序
- 元素不重復(fù)
- 查詢速度快
(因為SortedSet的可排序特性,經(jīng)常被用來實現(xiàn)排行榜)
SortedSet的常見命令:
- ZADD key score member:添加一個或多個元素到sorted set,如果已經(jīng)存在則更新其score值
- ZREM key member:刪除sorted set中的一個指定元素
- ZSCORE key member:獲取sorted set中的指定元素的score值
- ZRANK key member:獲取sorted set中的指定元素的排名
- ZCARD key:獲取sorted set中的元素個數(shù)
- ZCOUNT key min max:統(tǒng)計score值在給定范圍內(nèi)的所有元素的個數(shù)
- ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值
- ZRANGE key min max:按照score排序后,獲取指定排名范圍內(nèi)的元素
- ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內(nèi)的元素
- ZDIFF、ZINTER、ZUNION:求差集、交集、并集
3.Redis的Java客戶端
在Redis官網(wǎng)中提供了各種語言的客戶端**https://redis.io/clients/**

3.1Jedis快速入門
Jedis官網(wǎng)地址redis/jedis: Redis Java client
具體步驟:
引入依賴
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>7.1.0</version> </dependency>建立連接
private Jedis jedis; @BeforeEach void setUp(){ //1.建立連接 jedis = new Jedis("192.168.227.128",6379); //2.設(shè)置密碼 jedis.auth("123456"); //3.選擇庫 jedis.select(0); }測試string
@Test public void testJedis(){ //存入數(shù)據(jù) String result = jedis.set("name", "張三"); System.out.println("result = " + result); //獲取數(shù)據(jù) String name = jedis.get("name"); System.out.println("name = " + name); }關(guān)閉資源
@AfterEach void tearDown(){ if(jedis != null){ jedis.close(); } }為啥要判空?
因為如果 jedis 還沒創(chuàng)建成功就是 null,直接 close() 會報空指針異常
3.2Jedis連接池
Jedis本身線程是不安全的,并且頻繁的創(chuàng)建和銷毀連接會有性能損耗,因此推薦用Jedis連接池代替Jedis的直連方式
為什么 Jedis 不安全?
因為:一個 Jedis 對象 = 一個 TCP 連接,多個線程共用同一個連接是危險的
可以理解為:三個人同時對著同一根電話線說話,聲音會混在一起。
使用連接池JedisPool
每個線程:從池里拿一個 Jedis,用完歸還
public class JedisConnectionFactory {
private static JedisPool jedisPool;
static{
//配置連接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8);//最大連接數(shù)
poolConfig.setMaxIdle(8);//最大空閑連接
poolConfig.setMinIdle(0);//最小空閑連接
poolConfig.setMaxWaitMillis(10000);//最大等待時間
//創(chuàng)建連接池對象
jedisPool = new JedisPool(poolConfig,"192.168.227.128",6379,1000,"123456");
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
public class JedisTest {
private Jedis jedis;
@BeforeEach
void setUp(){
//1.建立連接
jedis = JedisConnectionFactory.getJedis();
//2.選擇庫
jedis.select(0);
}
@Test
public void testJedis(){
//存入數(shù)據(jù)
String result = jedis.set("name", "張三");
System.out.println("result = " + result);
//獲取數(shù)據(jù)
String name = jedis.get("name");
System.out.println("name = " + name);
}
@AfterEach
void tearDown(){
if(jedis != null){
jedis.close();//把連接歸還給連接池
}
}
}3.3SpringDateRedis
SpringDate是Spring中數(shù)據(jù)操作的模塊,包含對各種數(shù)據(jù)庫的集成,其中對Redis的集成模塊就叫SpringDateRedis
官網(wǎng)地址:https://spring.io/projects/spring-data-redis
- 提供了對不同 Redis 客戶端的整合(Lettuce 和 Jedis)
- 提供了 RedisTemplate 統(tǒng)一 API 來操作 Redis
- 支持 Redis 的發(fā)布訂閱模型
- 支持 Redis 哨兵和 Redis 集群
- 支持基于 Lettuce 的響應(yīng)式編程
- 支持基于 JDK、JSON、字符串、Spring 對象的數(shù)據(jù)序列化及反序列化
- 支持基于 Redis 的 JDK Collection 實現(xiàn)
SpringDateRedis中提供了RedisTemplate工具類,其中封裝了各種對Redis的操作

3.4RedisTemplate入門
具體步驟:
引入依賴
SpringBoot提供了對SpringDateRedis的支持,只需在創(chuàng)建項目時勾選依賴即可
配置文件
在application.yml文件里配置
spring: data: redis: host: 192.168.227.128 port: 6379 password: 123456 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: 100ms(新版SpringBoot中spring和redis間需要加個data)
注入RedisTemplate
@Autowired private RedisTemplate redisTemplate;編寫測試
@SpringBootTest class RedisDemoApplicationTests { @Autowired private RedisTemplate redisTemplate; @Test void testString() { //寫入一條String數(shù)據(jù) redisTemplate.opsForValue().set("name", "zs"); //獲取String數(shù)據(jù) System.out.println(redisTemplate.opsForValue().get("name")); } }
3.5RedisSerializer
RedisTemplate可以接收任意Object作為值寫入Redis,只不過寫入前會把Object序列化為字節(jié)形式
當執(zhí)行這條語句時:
redisTemplate.opsForValue().set("name", "zs");Spring 會:
Java對象 → 序列化 → byte[] → 發(fā)送給Redis
會把對象序列化,

占用內(nèi)存,可讀性還差
為啥默認用JDK序列化?
因為 SpringBoot 設(shè)計時考慮:Redis 不只是存 String
,更常用來存 Java 對象JDK 序列化可以直接把對象變成二進制存進去
為了解決這種問題,我們可以自定義RedisTemplate的序列化方式
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//創(chuàng)建RedisTemplate對象
RedisTemplate<String,Object> template = new RedisTemplate<>();
//設(shè)置連接工廠
template.setConnectionFactory(redisConnectionFactory);
//創(chuàng)建json序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//設(shè)置key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//設(shè)置value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
//返回
return template;
}
}
3.6StringRedisTemplate

為了節(jié)省內(nèi)存空間,我們并不會使用JSON序列化器來處理value,而是統(tǒng)一使用String序列化器,要求只能存儲String類型的key和value
當要存儲Java對象時,手動完成對象的序列化和反序列化
Spring默認提供了一個SpringRedisTemplate類,它的key和value的序列化方式默認就是String方式,省去了自定義RedisTemplate的過程
@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testString() {
//寫入一條String數(shù)據(jù)
stringRedisTemplate.opsForValue().set("name", "zs");
//獲取String數(shù)據(jù)
System.out.println(stringRedisTemplate.opsForValue().get("name"));
}
@Test
public void testSaveUser() {
//創(chuàng)建對象
User user = new User("張三", 20);
//手動序列化
String json = mapper.writeValueAsString(user);
//寫入數(shù)據(jù)
stringRedisTemplate.opsForValue().set("user:100",json);
//獲取數(shù)據(jù)
String jsonUser = stringRedisTemplate.opsForValue().get("user:100");
//手動反序列化
User user1 = mapper.readValue(jsonUser, User.class);
System.out.println("user1 = " + user1);
}
}
ObjectMapper 是 Jackson 提供的 “對象 ↔ JSON 轉(zhuǎn)換器”。
它的作用就是:
Java對象 ? JSON字符串

3.7RedisTemplate操作Hash類型
@Test
public void testHash(){
stringRedisTemplate.opsForHash().put("user:400","name","李四");
stringRedisTemplate.opsForHash().put("user:400","age","20");
Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
System.out.println("entries = " + entries);
}總結(jié)
到此這篇關(guān)于Redis初識、Redis的安裝與啟動、Redis命令及Java客戶端的文章就介紹到這了,更多相關(guān)Redis安裝與啟動、命令及Java客戶端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在CentOS 7環(huán)境下安裝Redis數(shù)據(jù)庫詳解
Redis是一個開源的、基于BSD許可證的,基于內(nèi)存的、鍵值存儲NoSQL數(shù)據(jù)本篇文章主要介紹了在CentOS 7環(huán)境下安裝Redis數(shù)據(jù)庫詳解,有興趣的可以了解一下。2016-11-11
淺談redis內(nèi)存數(shù)據(jù)的持久化方式
這篇文章主要介紹了淺談redis內(nèi)存數(shù)據(jù)的持久化方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Redis教程(二):String數(shù)據(jù)類型
這篇文章主要介紹了Redis教程(二):String數(shù)據(jù)類型,本文講解了String數(shù)據(jù)類型概述、相關(guān)命令列表、命令使用示例三部分內(nèi)容,需要的朋友可以參考下2015-04-04
redis實現(xiàn)存儲帖子的點贊狀態(tài)和數(shù)量的示例代碼
使用Redis來實現(xiàn)點贊功能是一種高效的選擇,因為Redis是一個內(nèi)存數(shù)據(jù)庫,適用于處理高并發(fā)的數(shù)據(jù)操作,這篇文章主要介紹了redis實現(xiàn)存儲帖子的點贊狀態(tài)和數(shù)量的示例代碼,需要的朋友可以參考下2023-09-09
Redis?鍵值對(key-value)數(shù)據(jù)庫實現(xiàn)方法
Redis 的鍵值對中的 key 就是字符串對象,而 value 可以是字符串對象,也可以是集合數(shù)據(jù)類型的對象,比如 List 對象,Hash 對象、Set 對象和 Zset 對象,這篇文章主要介紹了Redis?鍵值對數(shù)據(jù)庫是怎么實現(xiàn)的,需要的朋友可以參考下2024-05-05

