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自己的同步。性能最好但是数据可能丢失