redis 基本命令

redis 安装

shell 复制代码
docker run -d --network network1 --network-alias redis  -v /Users/uccs/Desktop/project/config/redis/conf:/etc/redis --name go-redis -p 6379:6379 redis:latest redis-server /etc/redis/redis.conf

切换数据库

shell 复制代码
select 0

查看当前数据库大小

shell 复制代码
dbsize

清空数据库

shell 复制代码
flushdb # 清空当前数据库
flushall # 清空所有数据库

key 相关

所有 key

shell 复制代码
keys *

key 是否存在

shell 复制代码
exists <key>

把 key 移动到指定数据库

shell 复制代码
move <key> 1 # 移动到数据库 1

设置过期时间

shell 复制代码
expire <key> <second>
expire <key> 10 # 10 秒后过期
ttl <key> # 查看过期时间
setex <key> <second> <value>
setex name 10 "uccs" # 设置 name 的值为 uccs,10 秒后过期

查看 key 的类型

shell 复制代码
type <key>

String 相关

追加

如果 key 不存在,那么它的值会被初始化为空字符串,然后再追加

返回值是追加后的字符串长度

shell 复制代码
append <key> <value>

获取字符串长度

shell 复制代码
strlen <key> # 返回字符串长度

加 1 / 减 1

只能对数字类型的字符串进行操作,否则会报错

shell 复制代码
incr <key> # 加 1
decr <key> # 减 1

加指定值 / 减指定值

shell 复制代码
incrby <key> 10 # 加 10
decrby <key> 10 # 减 10

获取指定范围的字符串

shell 复制代码
getrange <key> <start> <end>
getrange <key> 0 10 # 获取 0 ~ 10 之间的字符串
getrange <key> 0 -1 # 获取全部字符串

替换指定位置的字符串

shell 复制代码
"hello,world"
setrange <key> <offset> <value>
setrange <key> 2 "hello" # 替换 2 位置的字符串为 hello,上面的字符串变为 hehelloorld

如果不存在,才设置

设置成功返回 1,否则返回 0

shell 复制代码
setnx <key> <value> # 如果 key 不存在,才设置

批量设置和批量获取

shell 复制代码
mset <key1> <value1> <key2> <value2> ...
mget <key1> <key2> ...
msetnx <key1> <value1> <key2> <value2> ... # 如果 key 不存在,才设置,只要有个存在就会设置失败
mset user:1:name uccs user:1:age 18 # 批量设置

先获取再设置

shell 复制代码
getset <key> <value> # 先获取 key 的值,再设置 key 的值,没有获取到返回 nil

list 相关

添加

shell 复制代码
lpush <key> <value> # 从左边插入
rpush <key> <value> # 从右边插入
lrange <key> <start> <end> # 获取指定范围的值

lpush list one
lpush list two
rpush list three
lrange list 0 -1 # 获取全部 -> two one three

移除

shell 复制代码
hello1 hello2 hello3 hello4 hello5
rpop <key> # 移除最右边的元素
lpop <key> # 移除最左边的元素
lrem <key> <count> <value> # 移除指定个数的元素
lrem list 1 one # 移除 list 中的一个 one
ltrim <key> <start> <end> # 保留指定范围的元素
ltrim list 1 2 # 保留 list 中的第 1 和第 2 个元素 -> hello2 hello3
rpoplpush <source> <destination> # 移除最右边的元素,添加到另一个 list 的最左边
rpoplpush list list2 # 移除 list 中的最右边的元素,添加到 list2 的最左边
# list -> hello1 hello2 hello3 hello4
# list2 -> hello5

获取指定下标的元素

shell 复制代码
lindex <key> <index> # 获取指定下标的元素

获取长度

shell 复制代码
llen <key> # 获取长度

设置指定下标的元素

如果下标不存在,会报错

shell 复制代码
lset <key> <index> <value> # 设置指定下标的元素

在指定位置的元素前面或后面插入元素

shell 复制代码
linsert <key> before|after <pivot> <value> # 在指定位置的元素前面插入元素

set 相关

添加元素

shell 复制代码
sadd <key> <value> # 添加元素

查看指定 set 的所有元素

shell 复制代码
smembers <key> # 查看指定 key 的所有元素

某个值在 set 中是否存在

shell 复制代码
sismember <key> <value> # value 是否在 key 中

或者 set 中的元素个数

shell 复制代码
scard <key> # 获取元素个数

移除 set 中的某个元素

shell 复制代码
srem <key> <value> # 移除 key 中的 value 元素

随机选出一个元素

shell 复制代码
srandmember <key> # 从 key 中随机选出一个元素
srandmember <key> 2 # 从 key 中随机选出两个元素

随机删除一个元素

shell 复制代码
spop <key> # 随机删除一个元素

将指定 set 的元素移动到另一个 set

shell 复制代码
smove <key1> <key2> <value> # 将 key1 中的 value 元素移动到 setkey2 中

交集

shell 复制代码
sinter <key1> <key2> # 获取 key1 和 key2 的交集

差集

shell 复制代码
sdiff <key1> <key2> # 获取 key1 和 key2 的差集

并集

shell 复制代码
sunion <key1> <key2> # 获取 key1 和 key2 的并集

hash 相关

存值

shell 复制代码
hset <key> <field> <value> # 设置 key 中的 field 的值为 value
hmset <key> <field1> <value1> <field2> <value2> ... # 批量设置
hsetnx <key> <field> <value> # 如果 key 中的 field 不存在,才将 field 设置为 value

取值

shell 复制代码
hget <key> <field> # 获取 key 中的 field 的值
hmget <key> <field1> <field2> ... # 批量获取
hmgetall <key> # 获取 key 中的所有 field 和 value

删除

shell 复制代码
hdel <key> <field> # 删除 key 中的 field

获取长度

shell 复制代码
hlen <key> # 获取 key 中的 field 的个数

是否存在

shell 复制代码
hexists <key> <field> # 判断 key 中是否存在 field

获取所有 field

shell 复制代码
hkeys <key> # 获取 key 中的所有 field

获取的 value

shell 复制代码
hvals <key> # 获取 key 中的所有 value

加减

shell 复制代码
hincrby <key> <field> 1 # 给 key 中的 field 加 1
hdecrby <key> <field> 1 # 给 key 中的 field 减 1

zset 相关

存值

shell 复制代码
zadd <key> <score> <value> # 添加元素
zadd <key> <score1> <value1> <score2> <value2> ... # 批量添加

取值

shell 复制代码
zrange <key> <start> <end> # 获取指定范围的元素,升序
zrevrange <key> <start> <end> # 获取指定范围的元素,降序

排序

shell 复制代码
# 升序
zrangebyscore <key> <min> <max> # 排序
zrangebyscore <key> -inf +inf # 将 key 从负无穷到正无穷排序
zrangebyscore <key> -inf +inf withscores # 将 key 从负无穷到正无穷排序,并且返回时带有 score
zrangebyscore <key> -inf 2500 withscores # 将 key 从负无穷到 2500 排序,并且返回时带有 score
# 降序
zrevrangebyscore <key> <max> <min> # 排序
zrevrangebyscore <key> +inf -inf # 将 key 从正无穷到负无穷排序
zrevrangebyscore <key> +inf -inf withscores # 将 key 从正无穷到负无穷排序,并且返回时带有 score
zrevrangebyscore <key> +inf 10 withscores # 将 key 正负无穷到 10 排序,并且返回时带有 score

获取所有元素

shell 复制代码
zrange <key> 0 -1 # 获取所有元素

删除某个元素

shell 复制代码
zrem <key> <value> # 删除 key 中的 value 元素

获取个数

shell 复制代码
zcard <key> # 获取 key 中的元素个数

获取指定区间的成员数量

shell 复制代码
zcount <key> <min> <max> # 获取指定区间的成员数量

事务

Redis 单条命令是原子性的,但是 Redis 的事务不是原子性的,它只保证了一连串的命令会顺序执行,但是不保证原子性

Redis 的事务本质是一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,按照顺序执行

Redis 事务的三个阶段:

  • 开启事务(multi)
  • 命令入队(set key1 value1 等)
  • 执行事务(exec) / 取消事务(discard)

异常:

  • 编译异常:代码有问题,事务中所有的命令不会被执行
  • 运行异常:执行命令出错会抛出异常,不影响其他命令执行

乐观锁

正常使用

shell 复制代码
> multi
OK
> decrby key 100
QUEUED
> incrby key2 100
QUEUED
> exec  # 执行成功会有输出
1100
100

乐观锁,通过 watch 命令来实现,如果 key 的值在 watch 之后被修改了,那么 exec 会执行失败

shell 复制代码
> watch key
OK
> multi
OK
> decrby key 100
QUEUED
> incrby key2 100
QUEUED
> exec  # 执行失败会返回 nil
null

watch 命令会在 exec 执行之后释放

配置文件

shell 复制代码
include /path/to/local.conf # 导入配置文件
bind 127.0.0.1 # 绑定 ip
protected-mode yes # 是否开启保护模式,默认开启
port 6379 # 端口
daemonize no # 是否以守护进程的方式运行,默认不是
pidfile /var/run/redis_6379.pid # 如果以后台方式运行,需要指定一个 pid 文件
loglevel notice # 日志级别
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably) 生产环境使用
# warning (only very important / critical messages are logged)
logfile "" # 日志文件路径
databases 16 # 数据库数量,默认 16 个
always-show-logo yes # 是否显示 logo,默认显示

快照

持久化,在规定时间内,执行了多少次操作,则会持久化到文件

shell 复制代码
save 900 1    # 900 秒内,执行了 1 次操作,则持久化到文件
save 300 10   # 300 秒内,执行了 10 次操作,则持久化到文件
save 60 10000 # 60 秒内,执行了 10000 次操作,则持久化到文件

stop-writes-on-bgsave-error yes # 如果持久化出错,是否停止写入,默认 yes
rdbcompression yes # 是否压缩 rdb 文件,默认 yes
rdbchecksum yes # 保存 rdb 文件时,是否进行错误检验,默认 yes
dbfilename dump.rdb # rdb 文件名
dir ./ # rdb 文件保存路径

安全

shell 复制代码
requirepass <foobared> # 设置密码

可以通过命令设置:config set requirepass 123456

密码验证:auth 123456

客户端

shell 复制代码
maxclients 10000 # 最大连接数

内存

shell 复制代码
maxmemory <bytes> # 最大内存,默认是字节
maxmemory-policy noeviction # 内存不足时的处理策略
# volatile-lru -> 只对设置了过期时间的 key 进行 LRU (默认值)
# allkeys-lru -> 删除 lru 算法的 key
# volatile-random -> 随机删除即将过期的 key
# allkeys-random -> 随机删除 key
# volatile-ttl -> 删除即将过期的 key
# noeviction -> 不删除,返回错误

APPEND ONLY MODE(aof 配置)

默认是 rdb 持久化

shell 复制代码
appendonly no # 是否开启 aof 持久化,默认 no
appendfilename "appendonly.aof" # aof 文件名
appendfsync everysec # 每秒同步一次,可能会丢失这 1 秒的数据
# always -> 每次有数据修改都会写入 aof 文件,这样会严重降低 Redis 的速度
# no -> 不主动执行同步,依赖OS自己的同步。性能最好但是数据可能丢失
相关推荐
Conan在掘金7 小时前
�鸿蒙报错速查:Cannot find name 'require',禁用 require(),根因 + 真解法
后端
隔窗听雨眠7 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
一朵小花7 小时前
记一次Docker 容器 NFS 文件写入延迟排查过程
后端
z123456789867 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD7 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward8 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记9 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
FF2501_940228589 小时前
Grid 构建月历网格:7 列模板 + 日期占位算法
后端·华为·harmonyos·鸿蒙系统
神奇小汤圆9 小时前
线程池的 DiscardPolicy 为什么是「静默杀手」?一个生产事故的完整复盘
后端
大鸡腿同学9 小时前
个人博主 AI 剪辑实操:口播视频 3 步出片,省 80% 剪辑时间
后端