Redis 是一個基于內存的key-value結構的數據庫
一、redis的安裝
1.1、安裝步驟
1)安裝Redis依賴
Redis是基于c語言編寫的,因此需要安裝對應的gcc環境
yum install -y gcc tcl
2)進入/usr/local/src/目錄上傳并解壓安裝包
解壓:
tar -zxvf 安裝包名
3)解壓成功后進入解壓的文件目錄
運行編譯指令:
make && make install
注意:如果沒有報錯,表示安裝成功,默認安裝路徑為/user/lcoal/bin
目錄下
1.2、啟動方式
1)前臺啟動
前臺啟動,會阻塞整個窗口,窗口關閉或者停止,Redis也會停止
redis-server
2)后臺啟動
修改Redis的配置文件,配置文件就在解壓的安裝包下,名稱為redis.conf,修改配置文件,一般先進行備份
# 將守護進程修改為yes就可以在后臺運行
daemonize yes
修改成功后啟動redis時,只需要在命令后面加上配置文件名
redis-server redis.con
1.3、開機自啟
通過配置設置開機自啟,創建一個系統服務文件
1)創建系統服務文件:
vi /etc/systemd/system/redis.service
2)設置文件內容為:
[Unit]
Description=redis-server
After=network.target
?
[Service]
Type=forking
# 這行配置內容要根據redis的安裝目錄自定義路徑
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true
?
[Install]
WantedBy=multi-user.target
3)重載系統服務:
systemctl daemon-reload
之后就可以使用systemctl命令操作redis
1.4、Redis其他配置
# 設置訪問Redis的訪問密碼
requirepass 密碼
?
# 監聽端口
port 6379
?
# 設置允許訪問的地址,默認是127.0.0.1,會導致只能在本地訪問,設置為0.0.0.0就可以在任何IP下訪問
bind 0.0.0.0
?
# 數據庫數量,設置為1,代表只使用一個數據庫,默認有16個庫
databases 1
?
# 設置redis最大使用的內存
maxmemory 512mb
?
# 日志文件,默認為空,不記錄日志,可以指定日子文件名
logfile "文件名"
1.4、使用Docker安裝
普通安裝redis后,redis默認只能夠本地連接(127.0.0.1),不能進行遠程訪問;
常規步驟:
-
安裝redis鏡像:拉取官方的最新版本的鏡像
docker pull redis:latest
-
查看redis鏡像:查看是否已安裝了 redis
docker images
-
運行容器
docker run -itd --name myRedis -p 6379:6379 redis
-
查看容器安裝成功
docker ps
支持遠程訪問:
-
安裝redis鏡像:拉取官方的最新版本的鏡像
docker pull redis:latest
-
新建data和conf兩個文件夾,位置隨意
mkdir -p /root/docker/redis/data mkdir -p /root/docker/redis/conf
-
增加配置文件 redis.conf
在剛才新建的redis/conf中新建文件redis.conf,內容如下:
#bind 127.0.0.1 //允許遠程連接 protected-mode no appendonly yes //持久化 requirepass 123456 //密碼
注意:
1、以上文件(redis.conf)內容行與行之間不能帶有空格,否則新建容器后,容器狀態為stopped,無法啟動;
2、如果配置了redis密碼,在配置時除了需要redis的ip端口號外,也需要配置redis密碼;
-
創建redis容器并啟動:
docker run --name myRedis -p 6379:6379 -v /root/docker/redis/data:/data -v /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf
-
啟動成功,查看狀態
docker ps
二、常用指令
2.1、常用數據類型
Redis存儲的是key-value結構的數據,其中key是字符串類型,value有五種常用到的數據類型
-
String —— 字符串類型(最常用)
-
Hash —— 字典類型(最常用)
-
List —— 列表類型
-
Set —— 集合類型
-
ZSet —— 有序集合類型
2.2、字符串常用命令
字符串類型string:普通字符串,Redis中最簡單的數據類型
指令 | 說明 |
---|---|
set key value | 設置指定key的值 |
get key | 獲取指定key的值 |
setex key seconds value | 設置置頂key的值,并將key的過期時間設置為seconds秒 |
setnx key value | 只有在key不存在時設置value的值 |
e g:
// 設置指定key所對應值
set name lihua
?
// 獲取指定key的值
get name
?
// 設置指定key的有效時間為20秒
setex age 20 zhang
?
// 當設置的key不存在時才會設置對應的值,存在時不設置
setnx score 98 // 不存在時返回1,存在時返回0
2.3、哈希常用命令
哈希hash:也叫散列,類似于java中的HashMap結構,hash特別適合存儲對象
指令 | 說明 |
---|---|
hset key field value | 將哈希表中的字段field的值設置為value |
hget key field | 獲取存儲在哈希表中指定字段的值 |
hdel key field | 刪除存儲在哈希表中指定字段的值 |
hkeys key | 獲取哈希表中的所有字段 |
hvals key | 獲取哈希表中所有值 |
e g:
// 設置ID屬性為2的人的name屬性為zhang
hset 2 name zhang
?
// 獲取ID屬性為2的問的name屬性的值
hget 2 name
?
// 刪除id屬性為2的人的name屬性的值
hdel 2 name
?
// 獲取ID屬性為2的人的所有字段
hkeys 2
?
// 獲取ID屬性為2的人的所有字段值
hvals 2
2.4、列表常用命令
列表list:按照插入順序排序,可以有重復元素,類似java中的linkelist
指令 | 說明 |
---|---|
lpush key value1 [value2] | 將一個或多個值插入到列表的頭部 |
lrange key start stop | 獲取列表指定范圍內的元素 |
rpop key | 移除并獲取列表最后一個元素 |
llen key | 獲取類表的長度 |
eg:
// 向對應key中插如兩個值
lpush mylist 23 43
?
// 獲取對應key的指定范圍內的元素(頭部到尾部使用0 -1表示)
lrange mylist 0 -1
?
// 刪除并獲取列表中的最后一個
rpop mylist
?
// 獲取指定列表的長度
llen mylist
2.5、集合常用命令
集合set:無序集合,沒有重復元素,類似于java中的HashSet
指令 | 說明 |
---|---|
sadd key member1 [member2] | 向集合中添加一個或多個成員 |
smembers key | 返回集合中的所有成員 |
scard key | 獲取集合的成員數 |
sinter key1 [key2] | 返回所有指定集合的交集 |
sunion key1 [key2] | 返回所有集合的并集 |
srem key member1 [member2] | 刪除集合中一個或多個成員 |
e g:
// 向集合中添加兩個成員
sadd myset 223 344
?
// 返回集合中的所有元素
smembers myset
?
// 獲取集合的成員數
scard myset
?
// 返回兩個集合的交集
sinter myset1 myset2
?
// 返回兩個集合的并集
sunion myset2 myset2
?
// 刪除集合中的元素
srem myset 223
2.6、有序集合常用命令
有序集合sorted set |zset:集合中每個元素關聯一個double類型的分數,根據分數生序排序,沒有重復元素
指令 | 說明 |
---|---|
zadd key score1 member1 [score2 member2] | 向有序集合中體添加一個或多個成員 |
zrange key start stop [withscores] | 通過索引區間返回有序集合中的指定區間的元素 |
zincrby key increament member | 有序集合中對指定成員的分數加上增量increament |
zrem key member [member] | 移除有序集合中的一個或者多個元素 |
eg:
// 向有序集合中添加一個成員并指定a的score值為10.0
zadd zset 10.0 a
?
// 查看有序集合中的所有成員的元素
zrange zset 0 -1
?
// 查看有序集合中的所有成員的元素和分數
zrange zset 0 -1 withscore
?
// 對有序成員中的a元素的分數值加5
zincrby zset 5.0 a
?
// 刪除有序集合中的指定元素
zrem zset b
2.7、通用命令
Redis的通用命令就是部分數據類型的,都可以使用的命令
命令 | 說明 |
---|---|
keys pattem | 查找所有符合給定模式pattem的key |
exists key | 檢查給定的key是否存在 |
type key | 返回key所存儲的數據類型 |
del key1 [key2] | 刪除指定存在的key |
eg:
// 返回所有的key
keys *// 返回以set開頭的所有key
keys set*
?
// 檢查具體key是否存在
exists tex
?
// 返回對應key存儲的數據類型
type tex
?
// 刪除key
del tex
三、在java程序中操作redis
在java程序中一般使用Spring Data Redis操作redis數據庫
3.1、redis的java客戶端
Redis的java客戶端有很多,常用的有幾種:
-
Jedis
-
Lettuce
-
Spring Data Redis
Spring Data Redis是Spring的一部分,對Redis底層開發包進行了高度封裝
3.2、Spring Data Redis的使用方法
操作步驟:
-
導入Spring Data Redis的maven坐標
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
-
配置Redis數據源
redis:host: IP地址port: 端口號password: 密碼database: 10 # 表示使用10號數據庫,redis默認創建16個數據庫
-
編寫配置類,創建RedisTemplate對象
import lombok.extern.slf4j.Slf4j;
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.StringRedisSerializer;
?
/*** Redis配置類*/
@Configuration
@Slf4j
public class RedisConfiguration {
?@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){log.info("開始創建Redis模版對象···");RedisTemplate redisTemplate = new RedisTemplate();// 設置redis的鏈接工廠對象redisTemplate.setConnectionFactory(redisConnectionFactory);// 設置redis key的序列化對象redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}
-
通過RedisTemplate對象中的opsFor***來獲取具體對象操作Redis,這里列舉個別
/*** Redis測試類*/
@SpringBootTest
public class RedisTemplateText {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void textRedisType(){/*** 操作字符串類類型數據*/// 添加字符串類型數據-并設置有效時間redisTemplate.opsForValue().set("name","zhangshanc",20, TimeUnit.MILLISECONDS);// 對應key不存在時設置對應的key的值--對應redis中的setnx指令redisTemplate.opsForValue().setIfAbsent("age","12");
?/*** 操作哈希類型數據--其他指令見名知意*/// 添加hash類型的數據使用put--對應redis中的指令為hsetredisTemplate.opsForHash().put("11","name","tom");}
}
注意:redis中通用類型的數據直接使用RedisTemplate對象直接操作