redis 基本命令

2023年 10月 6日 84.7k 0

redis 安装

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

切换数据库

select 0

查看当前数据库大小

dbsize

清空数据库

flushdb # 清空当前数据库
flushall # 清空所有数据库

key 相关

所有 key

keys *

key 是否存在

exists 

把 key 移动到指定数据库

move  1 # 移动到数据库 1

设置过期时间

expire  
expire  10 # 10 秒后过期
ttl  # 查看过期时间
setex   
setex name 10 "uccs" # 设置 name 的值为 uccs,10 秒后过期

查看 key 的类型

type 

String 相关

追加

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

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

append  

获取字符串长度

strlen  # 返回字符串长度

加 1 / 减 1

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

incr  # 加 1
decr  # 减 1

加指定值 / 减指定值

incrby  10 # 加 10
decrby  10 # 减 10

获取指定范围的字符串

getrange   
getrange  0 10 # 获取 0 ~ 10 之间的字符串
getrange  0 -1 # 获取全部字符串

替换指定位置的字符串

"hello,world"
setrange   
setrange  2 "hello" # 替换 2 位置的字符串为 hello,上面的字符串变为 hehelloorld

如果不存在,才设置

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

setnx   # 如果 key 不存在,才设置

批量设置和批量获取

mset     ...
mget   ...
msetnx     ... # 如果 key 不存在,才设置,只要有个存在就会设置失败
mset user:1:name uccs user:1:age 18 # 批量设置

先获取再设置

getset   # 先获取 key 的值,再设置 key 的值,没有获取到返回 nil

list 相关

添加

lpush   # 从左边插入
rpush   # 从右边插入
lrange    # 获取指定范围的值

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

移除

hello1 hello2 hello3 hello4 hello5
rpop  # 移除最右边的元素
lpop  # 移除最左边的元素
lrem    # 移除指定个数的元素
lrem list 1 one # 移除 list 中的一个 one
ltrim    # 保留指定范围的元素
ltrim list 1 2 # 保留 list 中的第 1 和第 2 个元素 -> hello2 hello3
rpoplpush   # 移除最右边的元素,添加到另一个 list 的最左边
rpoplpush list list2 # 移除 list 中的最右边的元素,添加到 list2 的最左边
# list -> hello1 hello2 hello3 hello4
# list2 -> hello5

获取指定下标的元素

lindex   # 获取指定下标的元素

获取长度

llen  # 获取长度

设置指定下标的元素

如果下标不存在,会报错

lset    # 设置指定下标的元素

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

linsert  before|after   # 在指定位置的元素前面插入元素

set 相关

添加元素

sadd   # 添加元素

查看指定 set 的所有元素

smembers  # 查看指定 key 的所有元素

某个值在 set 中是否存在

sismember   # value 是否在 key 中

或者 set 中的元素个数

scard  # 获取元素个数

移除 set 中的某个元素

srem   # 移除 key 中的 value 元素

随机选出一个元素

srandmember  # 从 key 中随机选出一个元素
srandmember  2 # 从 key 中随机选出两个元素

随机删除一个元素

spop  # 随机删除一个元素

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

smove    # 将 key1 中的 value 元素移动到 setkey2 中

交集

sinter   # 获取 key1 和 key2 的交集

差集

sdiff   # 获取 key1 和 key2 的差集

并集

sunion   # 获取 key1 和 key2 的并集

hash 相关

存值

hset    # 设置 key 中的 field 的值为 value
hmset      ... # 批量设置
hsetnx    # 如果 key 中的 field 不存在,才将 field 设置为 value

取值

hget   # 获取 key 中的 field 的值
hmget    ... # 批量获取
hmgetall  # 获取 key 中的所有 field 和 value

删除

hdel   # 删除 key 中的 field

获取长度

hlen  # 获取 key 中的 field 的个数

是否存在

hexists   # 判断 key 中是否存在 field

获取所有 field

hkeys  # 获取 key 中的所有 field

获取的 value

hvals  # 获取 key 中的所有 value

加减

hincrby   1 # 给 key 中的 field 加 1
hdecrby   1 # 给 key 中的 field 减 1

zset 相关

存值

zadd    # 添加元素
zadd      ... # 批量添加

取值

zrange    # 获取指定范围的元素,升序
zrevrange    # 获取指定范围的元素,降序

排序

# 升序
zrangebyscore    # 排序
zrangebyscore  -inf +inf # 将 key 从负无穷到正无穷排序
zrangebyscore  -inf +inf withscores # 将 key 从负无穷到正无穷排序,并且返回时带有 score
zrangebyscore  -inf 2500 withscores # 将 key 从负无穷到 2500 排序,并且返回时带有 score
# 降序
zrevrangebyscore    # 排序
zrevrangebyscore  +inf -inf # 将 key 从正无穷到负无穷排序
zrevrangebyscore  +inf -inf withscores # 将 key 从正无穷到负无穷排序,并且返回时带有 score
zrevrangebyscore  +inf 10 withscores # 将 key 正负无穷到 10 排序,并且返回时带有 score

获取所有元素

zrange  0 -1 # 获取所有元素

删除某个元素

zrem   # 删除 key 中的 value 元素

获取个数

zcard  # 获取 key 中的元素个数

获取指定区间的成员数量

zcount    # 获取指定区间的成员数量

事务

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

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

Redis 事务的三个阶段:

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

异常:

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

乐观锁

正常使用

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

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

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

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

配置文件

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,默认显示

快照

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

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 文件保存路径

安全

requirepass  # 设置密码

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

密码验证:auth 123456

客户端

maxclients 10000 # 最大连接数

内存

maxmemory  # 最大内存,默认是字节
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 持久化

appendonly no # 是否开启 aof 持久化,默认 no
appendfilename "appendonly.aof" # aof 文件名
appendfsync everysec # 每秒同步一次,可能会丢失这 1 秒的数据
# always -> 每次有数据修改都会写入 aof 文件,这样会严重降低 Redis 的速度
# no -> 不主动执行同步,依赖OS自己的同步。性能最好但是数据可能丢失

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论