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>
把 key 移动到指定数据库
move <key> 1 # 移动到数据库 1
设置过期时间
expire <key> <second>
expire <key> 10 # 10 秒后过期
ttl <key> # 查看过期时间
setex <key> <second> <value>
setex name 10 "uccs" # 设置 name 的值为 uccs,10 秒后过期
查看 key 的类型
type <key>
String 相关
追加
如果 key
不存在,那么它的值会被初始化为空字符串,然后再追加
返回值是追加后的字符串长度
append <key> <value>
获取字符串长度
strlen <key> # 返回字符串长度
加 1 / 减 1
只能对数字类型的字符串进行操作,否则会报错
incr <key> # 加 1
decr <key> # 减 1
加指定值 / 减指定值
incrby <key> 10 # 加 10
decrby <key> 10 # 减 10
获取指定范围的字符串
getrange <key> <start> <end>
getrange <key> 0 10 # 获取 0 ~ 10 之间的字符串
getrange <key> 0 -1 # 获取全部字符串
替换指定位置的字符串
"hello,world"
setrange <key> <offset> <value>
setrange <key> 2 "hello" # 替换 2 位置的字符串为 hello,上面的字符串变为 hehelloorld
如果不存在,才设置
设置成功返回 1
,否则返回 0
setnx <key> <value> # 如果 key 不存在,才设置
批量设置和批量获取
mset <key1> <value1> <key2> <value2> ...
mget <key1> <key2> ...
msetnx <key1> <value1> <key2> <value2> ... # 如果 key 不存在,才设置,只要有个存在就会设置失败
mset user:1:name uccs user:1:age 18 # 批量设置
先获取再设置
getset <key> <value> # 先获取 key 的值,再设置 key 的值,没有获取到返回 nil
list 相关
添加
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
移除
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
获取指定下标的元素
lindex <key> <index> # 获取指定下标的元素
获取长度
llen <key> # 获取长度
设置指定下标的元素
如果下标不存在,会报错
lset <key> <index> <value> # 设置指定下标的元素
在指定位置的元素前面或后面插入元素
linsert <key> before|after <pivot> <value> # 在指定位置的元素前面插入元素
set 相关
添加元素
sadd <key> <value> # 添加元素
查看指定 set 的所有元素
smembers <key> # 查看指定 key 的所有元素
某个值在 set 中是否存在
sismember <key> <value> # value 是否在 key 中
或者 set 中的元素个数
scard <key> # 获取元素个数
移除 set 中的某个元素
srem <key> <value> # 移除 key 中的 value 元素
随机选出一个元素
srandmember <key> # 从 key 中随机选出一个元素
srandmember <key> 2 # 从 key 中随机选出两个元素
随机删除一个元素
spop <key> # 随机删除一个元素
将指定 set 的元素移动到另一个 set
smove <key1> <key2> <value> # 将 key1 中的 value 元素移动到 setkey2 中
交集
sinter <key1> <key2> # 获取 key1 和 key2 的交集
差集
sdiff <key1> <key2> # 获取 key1 和 key2 的差集
并集
sunion <key1> <key2> # 获取 key1 和 key2 的并集
hash 相关
存值
hset <key> <field> <value> # 设置 key 中的 field 的值为 value
hmset <key> <field1> <value1> <field2> <value2> ... # 批量设置
hsetnx <key> <field> <value> # 如果 key 中的 field 不存在,才将 field 设置为 value
取值
hget <key> <field> # 获取 key 中的 field 的值
hmget <key> <field1> <field2> ... # 批量获取
hmgetall <key> # 获取 key 中的所有 field 和 value
删除
hdel <key> <field> # 删除 key 中的 field
获取长度
hlen <key> # 获取 key 中的 field 的个数
是否存在
hexists <key> <field> # 判断 key 中是否存在 field
获取所有 field
hkeys <key> # 获取 key 中的所有 field
获取的 value
hvals <key> # 获取 key 中的所有 value
加减
hincrby <key> <field> 1 # 给 key 中的 field 加 1
hdecrby <key> <field> 1 # 给 key 中的 field 减 1
zset 相关
存值
zadd <key> <score> <value> # 添加元素
zadd <key> <score1> <value1> <score2> <value2> ... # 批量添加
取值
zrange <key> <start> <end> # 获取指定范围的元素,升序
zrevrange <key> <start> <end> # 获取指定范围的元素,降序
排序
# 升序
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
获取所有元素
zrange <key> 0 -1 # 获取所有元素
删除某个元素
zrem <key> <value> # 删除 key 中的 value 元素
获取个数
zcard <key> # 获取 key 中的元素个数
获取指定区间的成员数量
zcount <key> <min> <max> # 获取指定区间的成员数量
事务
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 <foobared> # 设置密码
可以通过命令设置:config set requirepass 123456
密码验证:auth 123456
客户端
maxclients 10000 # 最大连接数
内存
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
持久化
appendonly no # 是否开启 aof 持久化,默认 no
appendfilename "appendonly.aof" # aof 文件名
appendfsync everysec # 每秒同步一次,可能会丢失这 1 秒的数据
# always -> 每次有数据修改都会写入 aof 文件,这样会严重降低 Redis 的速度
# no -> 不主动执行同步,依赖OS自己的同步。性能最好但是数据可能丢失
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。