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自己的同步。性能最好但是数据可能丢失
相关推荐
bug菌¹34 分钟前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
逸巽散人44 分钟前
SQL基础教程
数据库·sql·oracle
月空MoonSky1 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa1 小时前
【MySQL 06】表的增删查改
数据库·mysql
杨哥带你写代码1 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries2 小时前
读《show your work》的一点感悟
后端
A尘埃2 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23072 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code2 小时前
(Django)初步使用
后端·python·django
代码之光_19802 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端