Redis 学习笔记

NoSQL 概念

NoSQL = Not Only SQL(不仅仅是 SQL)

NoSQL 特点:

  1. 方便扩展
  2. 大数据量高性能
  3. 数据类型是多样型的
  4. 传统 RDBMS 和 NoSQL

NoSQL 四大分类:

  • KV 键值对

  • 文档型数据库(bson 格式)

    • MongoDB:是一个基于分布式文件存储的数据库
    • ConthDB
  • 列存储数据库

    • HBase
    • 分布式文件系统
  • 图关系数据库

    • 专注于构建关系图谱
    • Neo4j, InfoGrid
分类 数据模型 优点 缺点 典型应用场景
键值 (Key-Value) 存储数据库 Key 指向 Value 的键值对,通常用 hash 表来实现 查找速度快 数据无结构化 (通常只被当作字符串或者二进制数据) 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等
列存储数据库 以列簇式存储,将同一列数据存在一起 查找速度快,可扩展性强,更容易进行分布式扩展 功能相对局限 分布式的文件系统
文档型数据库 Key-Value 对应的键值对,Value 为结构化数据 数据结构要求不严格,表结构可变 (不需要像关系型数据库一样需预先定义表结构) 查询性能不高,而且缺乏统一的查询语法 Web 应用
图形 (Graph) 数据库 图结构 利用图结构相关算法 (如最短路径寻址,N 度关系查找等) 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案 社交网络,推荐系统等

大数据时代的 3V + 3高:

3V:海量 Volume、多样 Variety、实时 Velocity
3高:高并发、高可拓、高性能

Redis 概念

Redis (Remote Dictionary Server),远程字典服务。是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

免费和开源,是当前最热门的结构化数据库之一。

Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。

相关链接:Redis 官网中文官网


使用场景
1、内存存储、持久化
2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(浏览量)

特性
1、多样的数据类型
2、持久化
3、集群
4、事务

Redis 基础

Redis 是单线程的,基于内存操作,CPU 不是 Redis 的性能瓶颈,Redis 的性能瓶颈是机器的内存和网络带宽。
Redis 6.0 之后改为多线程。

Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件 MQ。它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets),与范围查询,bitmaps,hyperloglogs 和地理空间(geospatial)索引半径查询。Redis 内置了复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化,并通过 Redis 哨兵(Sentinel)和自动分区(Cluster)提供高可用性。

基本命令

相关文章:Redis 常用命令大全Redis 常用命令 - 博客园 (cnblogs.com)

# 启动 redis 服务
/usr/local/bin/redis-server
# 启动 redis 客户端实例
/usr/local/bin/redis-cli
# 连接远程 redis 服务器:
redis-cli -h host -p port -a password

# 设置 key-value
set key value
# 获取值
get key
# 删除
del key
# 判断 key 是否存在
exists key
# 查看当前数据库的所有 key
keys *
# 查看字段类型
type key
# 查看前缀为 "prefix_" 的所有 keys
keys prefix_*

# 设置 10 秒过期
expire key 10
# 设置 10 毫秒过期
pexpire key 10
# 删除过期时间
persist key

# 切换数据库
# redis 有 16 个数据库,默认使用 0 号数据库,切换数据库的命令为:
select index(index 表示数据库编号)
# 清空当前选中的数据库
flushdb
# 清空所有数据库
flushall

1)连接操作命令

  • quit:关闭连接(connection)
  • auth:简单密码认证
  • help cmd: 查看 cmd 帮助,例如:help quit

2)持久化

  • save:将数据同步保存到磁盘
  • bgsave:将数据异步保存到磁盘
  • lastsave:返回上次成功将数据保存到磁盘的 Unix 时戳
  • shundown:将数据同步保存到磁盘,然后关闭服务

3)远程服务控制

  • info:提供服务器的信息和统计
  • monitor:实时转储收到的请求
  • slaveof:改变复制策略设置
  • config:在运行时配置 Redis 服务器

4)对 value 操作的命令

  • exists (key):确认一个 key 是否存在
  • del (key):删除一个 key
  • type (key):返回值的类型
  • keys (pattern):返回满足给定 pattern 的所有 key
  • randomkey:随机返回 key 空间的一个
  • keyrename (oldname, newname):重命名 key
  • dbsize:返回当前数据库中 key 的数目
  • expire:设定一个 key 的活动时间(s)
  • ttl:获得一个 key 的活动时间
  • select (index):按索引查询
  • move (key, dbindex):移动当前数据库中的 key 到 dbindex 数据库
  • flushdb:删除当前选择数据库中的所有 key
  • flushall:删除所有数据库中的所有 key

String

应用场景:缓存,限流,计数器,分布式锁,分布式 session

# 给数据库中名称为 key 的 string 赋予值 value
set (key, value)
# 返回数据库中名称为 key 的 string 的 value
get (key)
# 给名称为 key 的 string 赋予上一次的 value
getset (key, value)
# 返回库中多个 string 的 value
mget (key1, key2,…, key N)
# 添加 string,名称为 key,值为 value
setnx (key, value)
# 向库中添加 string,设定过期时间 time
setex (key, time, value)
# 批量设置多个 string 的值
mset (key N, value N)
# 如果所有名称为 key i 的 string 都不存在
msetnx (key N, value N)
# 名称为 key 的 string 增 1 操作
incr (key)
# 名称为 key 的 string 增加 integer
incrby (key, integer)
# 名称为 key 的 string 减 1 操作
decr (key)
# 名称为 key 的 string 减少 integer
decrby (key, integer)
# 名称为 key 的 string 的值附加 value
append (key, value)
# 返回名称为 key 的 string 的 value 的子串
substr (key, start, end)

List

应用场景:关注人时间轴列表

# 在名称为 key 的 list 尾添加一个值为 value 的元素
rpush (key, value)
# 在名称为 key 的 list 头添加一个值为 value 的 元素
lpush (key, value)
# 返回名称为 key 的 list 的长度
llen (key)
# 返回名称为 key 的 list 中 start 至 end 之间的元素
lrange (key, start, end)
# 截取名称为 key 的 list
ltrim (key, start, end)
# 返回名称为 key 的 list 中 index 位置的元素
lindex (key, index)
# 给名称为 key 的 list 中 index 位置的元素赋值
lset (key, index, value)
# 删除 count 个 key 的 list 中值为 value 的元素
lrem (key, count, value)
# 返回并删除名称为 key 的 list 中的首元素
lpop (key)
# 返回并删除名称为 key 的 list 中的尾元素
rpop (key)
# lpop 命令的 block 版本
blpop (key1, key2,… key N, timeout)
# rpop 的 block 版本
brpop (key1, key2,… key N, timeout)
# 返回并删除名称为 srckey 的 list 的尾元素,并将该元素添加到名称为 dstkey 的 list 的头部
rpoplpush (srckey, dstkey)
# 在特定元素 pivot 前/后插入新的元素 element
linsert (key, before|after, pivot, element)

Set

应用场景:点赞,标签,好友关系

# 向名称为 key 的 set 中添加元素 member
sadd (key, member)
# 删除名称为 key 的 set 中的元素 member
srem (key, member)
# 随机返回并删除名称为 key 的 set 中一个元素
spop (key)
# 移到集合元素
smove (srckey, dstkey, member)
# 返回名称为 key 的 set 的基数
scard (key)
# member 是否是名称为 key 的 set 的元素
sismember (key, member)
# 求交集
sinter (key1, key2,…key N)
# 求交集并将交集保存到 dstkey 的集合
sinterstore (dstkey, (keys))
# 求并集
sunion (key1, (keys))
# 求并集并将并集保存到 dstkey 的集合
sunionstore (dstkey, (keys))
# 求差集
sdiff (key1, (keys))
# 求差集并将差集保存到 dstkey 的集合
sdiffstore (dstkey, (keys))
# 返回名称为 key 的 set 的所有元素
smembers (key)
# 随机返回名称为 key 的 set 的一个元素
srandmember (key)

Hash

应用场景:存储用户信息,用户主页访问量,组合查询

# 向名称为 key 的 hash 中添加元素 field
hset (key, field, value)
# 返回名称为 key 的 hash 中 field 对应的 value
hget (key, field)
# 返回名称为 key 的 hash 中 field i 对应的 value
hmget (key, (fields))
# 向名称为 key 的 hash 中添加元素 field
hmset (key, (fields))
# 将名称为 key 的 hash 中 field 的 value 增加 integer
hincrby (key, field, integer)
# 名称为 key 的 hash 中是否存在键为 field 的域
hexists (key, field)
# 删除名称为 key 的 hash 中键为 field 的域
hdel (key, field)
# 返回名称为 key 的 hash 中元素个数
hlen (key)
# 返回名称为 key 的 hash 中所有键
hkeys (key)
# 返回名称为 key 的 hash 中所有键对应的 value
hvals (key)
# 返回名称为 key 的 hash 中所有的键(field)及其对应的 value
hgetall (key)

Zset

应用场景:排行榜

# 添加一个元素(1表示score,用作排序使用)
zadd zset 1 one
zadd zset 2 two
zadd zset 3 three
# 分数+1
zincrby zset 1 one
# 获取分数
zscore zset two
# 获取全部的值
zrange zset 0 -1
# 获取全部值并附带分数
zrange zset 0 -1 withscores
# 分数在某个范围的值
zrangebyscore zset 10 25 withscores
# 分页
zrangebyscore zset 10 25 withscores limit 1 2
# 指定范围的值从大到小排序
Zrevrangebyscore zset 10 25 withscores
# 元素数量
zcard zset
# 获得指定分数范围内的元素个数
Zcount zset
# 删除一个或多个元素
Zrem zset one two
# 按照排名范围删除元素
Zremrangebyrank zset 0 1
# 按照分数范围删除元素
Zremrangebyscore zset 0 1

Geospatial 地理位置

# 添加地理位置的坐标
geoadd Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
# 获取地理位置的坐标
geopos Sicily Palermo
# 计算两个位置之间的距离
geodist Sicily Palermo Catania
# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
georadius Sicily 15 37 100 km
# 根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合
georadiusbymember Sicily Catania 100 km
# geohash:返回一个或多个位置对象的 geohash 值

Hyperloglog 基数统计

# 向一个集合添加元素
pfadd mykey a b c d
# 向合并 mykey 和 mykey2 中的元素到集合 mykey3 中,并且没有重复元素
pfmerge mykey3 mykey mykey2
# 查看 mykey 的基数(即重复元素只算一次)
pfcount mykey3

Bitmaps 二状态请求

应用场景:一般用于二状态的情况,例如判断用户是否登录,是否打卡等二状态需求。

# 设置第 0 位的值为 0
setbit mybitmap 0 0
# 获得第 0 位的值
getbit mybitmap 0
# 统计值为 1 的数量
bitcount mybitmap

订阅与发布

# 订阅频道
subscribe chat1
# 发布消息
publish chat1 "hell0 ni hao"
# 查看频道
pubsub channels
# 查看某个频道的订阅者数量
pubsub numsub chat1
# 退订指定频道
unsubscrible chat1, unsubscribe java.*
# 订阅一组频道
psubscribe java.*

Redis 事务

Redis 单条命令保证原子性,但是事务不保证原子性,并且没有隔离级别的概念。

  • 开启事务(multi)
  • 命令入队(…)
  • 执行事务(exec)
  • 放弃事务(discard)

事务异常

  • 编译异常:进入队列之前发生异常,服务器记录进入队列失败的的数据,在执行 exec 命令时不会执行失败的那条命令并放弃这个事务
  • 运行时异常:其他命令都可以正常执行,仅那条报错的命令不会生效

监控(悲观锁和乐观锁)

  • 乐观锁使用 watch (key) 和 unwatch 实现
  • 悲观锁使用 setNX 操作实现的阻塞式分布式锁

相关文章:通过 Redis 实现悲观锁,乐观锁

Jedis

导入相关依赖

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.15</version>
</dependency>

测试代码

public static void main(Stringp[] args) {
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    System.out.println(jedis.ping()); // PONG
}

Spring Boot 集成

在 Spring Boot 2.X 之后,Jedis 被替换为了 lettuce

Jedis:采用直连,多个线程操作不安全,可以使用 Jedis Pool 连接池避免。(BIO 模式)
lettuce:采用 Netty,实例可以在多个线程中进行共享,不存在线程不安全。(NIO 模式)

相关文章:JAVA 中 BIO、NIO、AIO 的分析理解

导入依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.7.4</version>
</dependency>

配置文件 application.yml

spring:
	redis:
		# 配置连接池属性
		lettuce:
			pool:
				min-idle: 5
				max-active: 10
				max-idle: 10
				max-wait: 2000
		# 配置 Redis 服务器属性
		port: 6379
		host: 127.0.0.1
		password: ******
    	# Redis 连接超时时间,单位主运秒
		timeout: 1000

自定义 RedisTemplate

// 创建
@Bean(name = "redisTemplate")
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    // Json 序列化配置
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om); // String 的序列化
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    // key 采用 String 的序列化方式
    redisTemplate.setKeySerializer(stringRedisSerializer);
    // hash 的 key 也采用 String 的序列化方式
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    // value 序列化方式采用 jackson
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    // hash 的 value 序列化方式采用 jackson
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.afterPropertiesSet();

    return redisTemplate;
}

// 使用
@Autowired
private RedisTemplate redisTemplate;

@Test
void contextLoads() {
    // opsForValue  操作 String
    // opsForList  操作 List
    // ...
    redisTemplate.opsForValue().set("mykey", "LPxz");
    redisTemplate.opsForValue().get("mykey");
}

封装工具类 RedisUtils.java


使用 SessionCallBack 接口

// 让 RedisTemplate 回调,在同一连接下执行多个 Redis 命令
public void useSessionCallback(RedisTemplate redisTemplate) {
    redisTemplate.execute(new SessionCallback() {
        @Override
        public Object execute(RedisOperation ro) throws DataAccessException {
            ro.opsForValue().set("key1", "value1");
            ro.opsForHash().put("hash", "field", "hvalue");
            return null;
        }
    });
}
// 也可以使用 Lambda 表达式改写代码
public void useSessionCallback(RedisTemplate redisTemplate) {
    redisTemplate.execute((RedisOperation ro) -> {
        ro.opsForValue().set("key1", "value1");
        ro.opsForHash().put("hash", "field", "hvalue");
        return null;
    });
}

Redis.conf 配置文件

Docker 挂载配置文件:

docker run -p 6379:6379 --name redis -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

# 查看挂载目录
docker inspect redis|grep Mounts -A 20

Tips: 建议修改默认端口号和密码

相关文章:redis 配置文件中常用配置详解

Redis 持久化

Redis 是内存数据库,一旦服务器进程退出,服务器中的数据库状态也会消失。

RDB (Redis Database)

在指定的时间间隔内将内存中的数据集快照写入磁盘,即 Snapshot 快照,恢复时是将快照文件直接读到内存里。默认使用 RDB。

Redis 会单独创建(fork)一个子进程来进行持久化,先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何 I/O 操作的,确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加高效。RDB的缺点是最后一次持久化后的数据可能丢失。


触发机制(保存的文件:dump.rdb

  • save 的规则满足
  • 执行 flushall 命令
  • 退出 Redis

恢复 rdb 文件

只需要将 rdb 文件放在 Redis 启动目录就可以。查看目录:

> config get dir
1) "dir"
2) "/data"

优点:
1、适合大规模的数据恢复
2、对数据完整性要求不高

缺点:
1、需要一定的时间间隔进行操作,宕机会丢失最后一次数据
2、fork 进程的时候会占用一定的内存空间

AOF (Append Only File)

将历史命令都记录下来,恢复的时候将记录文件再执行一遍。默认是不开启的。

以日志的形式来记录每个写操作,将 Redis 执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之,Redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF 保存的是 appendonly.aof 文件


优点:
1、appendfsync always 每一次修改都同步,文件的完整更好
2、appendfsync everysec 每秒同步一次,可能会丢失一秒的数据
3、appendfsync no 从不同步,效率最高

缺点:
1、相对于数据文件来说,aof 远远大于 rdb,修复的速度也更慢
2、AOF 运行效率比 RDB 慢

Redis 主从复制

概念

主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点 (master/leader), 后者称为从节点 (slave/follower);数据的复制是单向的,只能由主节点到从节点。Master 以写为主,Slave 以读为主。

默认情况下,每台 Redis 服务器都是主节点;且一个主节点可以有多个从节点 (或没有从节点), 但一个从节点只能有一个主节点。

主从复制的作用

1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点), 分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。
4、高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是 Redis 高可用的基础。

主从复制的缺点

由于所有的写操作都是先在 Master 上操作,然后同步更新到 Slave 上,所以从 Master 同步到 Slave 服务器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave 机器数量的增加也会使这个问题更加严重

相关文章:Redis 主从复制原理

环境配置(需要多台 Redis 服务)

只配置从库,不用配置主库。

# 查看当前库的信息
127.0.0.1:6379> info replication
# Replication
role:master # 角色
connected_slaves:0 # 没有从机
master_failover_state:no-failover
master_replid:886c20ca2470ea338e9ef395d98ee1aaa3b257f7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

修改配置文件

1、端口
2、pid 文件名
3、log 文件名
4、dump.rdb 文件名

设置主机&从机

在从机中执行:

> slaveof (host, port)
# eg. slaveof 127.0.0.1 6379
> slaveof no one # 取消主从复制

企业生产环境开发时一般在配置文件中设置。

主机可以读写,从机只能读不能写。主机断开连接,从机依旧连接到主机,但是没有写操作,这个时候如果主机回来了,从机依旧可以直接获取到主机写的信息。

哨兵模式(自动选举)

主从切换:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,需要人工干预,费事费力,还会造成一段时间内服务不可用。优先考虑哨兵模式。Redis 从 2.8 开始正式提供了 Sentinel(哨兵)架构来解决这个问题,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例

除了监控各个 Redis 服务器之外,哨兵之间也会互相监控。


优点:
1、哨兵集群基于主从复制模式
2、主从可以切换,故障可以转移,系统的可用性更好
3、哨兵模式就是主从模式的升级,手动到自动

缺点:
1、redis 不好在线扩容集群容量一旦达到上线 在线扩容十分麻烦
2、实现哨兵模式的配置其实很麻烦,里面有很多选择

相关文章:Redis 专题:深入解读哨兵模式 - 知乎 (zhihu.com)

缓存穿透和雪崩

相关文章:Redis 详解(十二)—— 缓存穿透、缓存击穿、缓存雪崩 - 知乎 (zhihu.com)

Linux 安装 Redis

编译安装

1、安装 gcc 依赖

由于 Redis 是用 C 语言开发,安装之前必先输入 gcc -v 确认是否安装 gcc 环境,如果没有安装,执行以下命令进行安装:

yum install -y gcc

2、下载并解压安装包

wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar -zxvf redis-6.2.6.tar.gz

3、切换到 redis 解压目录下,执行编译

cd redis-6.2.6
make

4、安装并指定安装目录

make install PREFIX=/usr/local/redis

5、启动服务

前台启动:

cd /usr/local/redis/bin/
./redis-server

后台启动:

从 redis 的源码目录中复制 redis.conf 到 redis 的安装目录

cp /usr/local/redis-6.2.6/redis.conf /usr/local/redis/bin/

修改 redis.conf 文件,把 daemonize no 改为 daemonize yes

vi redis.conf

后台启动

./redis-server redis.conf

6、设置开机启动

添加开机启动服务

vi /etc/systemd/system/redis.service

复制粘贴以下内容:

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

注意:ExecStart 配置成自己的路径

设置开机启动

systemctl daemon-reload
systemctl start redis.service
systemctl enable redis.service

创建 Redis 命令软链接

ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis

测试 Redis

7、服务操作命令

systemctl start redis.service # 启动 redis 服务
systemctl stop redis.service # 停止 redis 服务
systemctl restart redis.service # 重新启动服务
systemctl status redis.service # 查看服务当前状态
systemctl enable redis.service # 设置开机自启动
systemctl disable redis.service # 停止开机自启动

Docker 安装

1、查看镜像仓库是否存在 Redis 镜像

docker search redis

2、拉取 Redis 镜像

docker pull redis

3,启动 Redis

默认情况下,Docker 将在前台运行命令。要在后台运行,需要指定选项 -d

docker run --name myredis -d -p 6739:6739 redis

4、Redis 交互

docker exec -it myredis bash
cd /usr/local/bin
./redis-cli
# or
docker exec -it myredis redis-cli

Redis 学习笔记
http://lpxz.work/posts/16018/
作者
LPxz
发布于
2022年10月8日
许可协议