redis入门篇
基本操作
- redis 命令不缺分大小写,但是 key名称区分大小写。比如
del mykey 等同于 DEL mykey,但是 del mykey 不等于 del MYKEY
登入与登出
#.登陆测试-直接使用密码
/usr/local/bin/redis-cli -a RbY9k2_NBf1QWy8I -c -h 127.0.0.1 -p 7100
#.查看版本
/usr/local/bin/redis-server -v
#.登陆测试-先登录,再输入密码
/usr/local/bin/redis-cli -h 127.0.0.1 -p 7100
> auth "RbY9k2_NBf1QWy8I"
#.查看版本
> info Server
#.退出交互式界面
> exit
#.非交互式
redis-cli -a RbY9k2_NBf1QWy8I -c -p 7100 info keyspace
redis-cli -c -p 7100 --user dba_check --pass MXn896_VwTiek2_t info keyspace
数据库的管理
#.redis默认存在16个库,分别按照0-15来排列,默认操作在0号库,示例 选择1号库
select 1
#.dbsize用于查看当前库有多少个key,示例 返回 (integer) 3 则代表 db1有3个key
127.0.0.1:7100> select 1
OK
127.0.0.1:7100[1]> dbsize
(integer) 3
#.通过info keyspace可以查看每个库有多少个key,示例 db0有2个key,db1有3个key
127.0.0.1:7100> info keyspace
# Keyspace
db0:keys=2,expires=0,avg_ttl=0
db1:keys=3,expires=0,avg_ttl=0
#.flushdb只会清除当前数据库中的key,清理之前建议先select切换上下文
select 1
flushdb
#.flushall会清除redis实例所有数据库(0-15)中的key
flushall
账号的管理
- 在哨兵/集群模式下,在主库上用 ACL SETUSER 创建的用户,不会自动同步到从库上。这是因为 Redis 的主从复制机制主要负责同步数据(如键值),而ACL(访问控制列表)这类配置属于实例本身的访问控制设置,并不属于需要复制的数据范畴。
#.查看acl所有命令/集合指令
acl cat
acl cat string
#.创建用户-先创建再设置密码再启用
acl setuser tuser
acl setuser tuser >Admin_147
acl setuser tuser on
#.创建用户-一步到位
acl setuser tuser on >Admin_147
#.查看用户清单
acl list
acl users
#.查看当前登录的用户
acl whoami
#.设置tuser用户对所有key仅有读写权限
acl setuser tuser on >Admin_147 ~* -@all +@read +@write
#.设置tbusr用户只对tb:开头的key有权限
acl setuser tbusr on >Admin_147 ~tb:*
#.设置tbusr用户拥有 info 权限
acl setuser tbusr +info
#.取消权限
acl setuser tuser on allkeys -set
#.获取指定用户的详细权限信息
acl getuser tuser
#.启用/禁用/删除用户
acl setuser tuser on
acl setuser tuser off
acl deluser tuser
实例的管理
#.info用于查看实例信息
info
info server
info keyspace
#.config get用于查看实例配置项
config get *
config get dir
config get maxmemory maxclients
#.config set用于设置实例配置项
config set maxclients 3000
config get maxclients
#.save用于将所有数据同步保存到磁盘上的持久化文件中(即dump.rdb),在执行SAVE命令期间,将暂停处理客户端的其他请求,直到持久化完成
save
#.bgsave与save类似,但它是异步执行的,不会阻塞Redis服务器处理其他请求。因此,在生产环境中更推荐使用 BGSAVE
bgsave
#.关闭redis服务
shutdown
对不同数据类型的操作
key 键值
- 在哨兵/集群模式下,对于带有 TTL 的键,从库不会同步TTL信息,从库只知道某个键是否过期,但不知道它什么时候过期
| 命令 |
描述 |
示例 |
| DEL |
删除指定的 key |
del mykey |
| DUMP |
序列化给定 key,并返回被序列化的值 |
dump mykey |
| EXISTS |
检查给定 key 是否存在 |
exists mykey |
| EXPIRE |
为 key 设置过期时间(秒) |
expire mykey 60 |
| EXPIREAT |
以 UNIX 时间戳为单位设置 key 的过期时间 |
expireat mykey 1672531199 |
| KEYS |
查找匹配给定模式的所有 key |
keys user* |
| MOVE |
将 key 移动到另一个数据库 |
move mykey 1 |
| PERSIST |
移除 key 的过期时间,令其持久存在 |
persist mykey |
| PEXPIRE |
设置 key 的过期时间(毫秒) |
pexpire mykey 60000 |
| PEXPIREAT |
设置毫秒级的 UNIX 时间戳作为 key 的过期时间 |
pexpireat mykey 1672531199123 |
| PTTL |
以毫秒为单位返回 key 的剩余存活时间 |
pttl mykey |
| RENAME |
将 key 重命名为 newkey |
rename mykey newkey |
| RENAMENX |
当且仅当 newkey 不存在时,将 key 重命名为 newkey |
renamenx mykey newkey |
| SORT |
对 key 进行排序,返回或存储排序后的结果 |
sort mylist |
| TTL |
以秒为单位返回 key 的剩余存活时间 |
ttl mykey |
| TYPE |
返回 key 所存储的值的类型 |
type mykey |
| UNLINK |
异步删除 key,避免阻塞 Redis |
unlink mykey |
| SCAN |
增量迭代数据库中的 key |
scan 0 MATCH user* COUNT 100 |
#.del用于删除指定的key,示例 成功删除2个已存在的key则返回 (integer) 2,若删除不存在的key则返回 (integer) 0
set key1 "hello"
set key2 "world"
del key1 key2
del key3
#.keys用于返回符合条件的所有key,示例 依次返回以pay开头的key、以pay开头且后面只有2个字符的key、所有包含pay的key、所有key
keys pay*
keys pay??
keys *pay*
keys *
#.exists用于判断keys是否存在,示例 存在2个key则返回 (integer) 2,若key不存在则返回 (integer) 0
set key1 "hello"
set key2 "world"
exists key1 key2
exists key3
#.expire用于设置有效期(若不设置则永不过期),到期后该key会被自动删除,单位为秒
set key1 "hello"
expire key1 60
set key1 "hello" ex 60
#.ttl用于返回剩余的有效期
set key1 "hello"
expire key1 60
ttl key1
#.persist用于移除有效期,若设置为永不过期(即没有设置过期时间)则返回0
set key1 "hello"
expire key1 60
persist key1
ttl key1
#.touch用于更新指定key的最后访问时间,如果指定的key不存在则会忽略并不报错
set key1 "hello"
touch key1 key2
#.move用于将某个key移动到另外一个数据库中
set key1 "hello"
move key1 1
#.rename用于修改一个key的名称,如果源key不存在则会返回错误,若目标key已存在则被覆盖
del key1 key2 key3 key4
set key1 "hello"
rename key3 key4
rename key1 key2
get key2
#.renamenx用于修改一个key的名称,若源key不存在则会返回错误,若目标key已存在则不执行任何操作并返回0
#.与rename的区别:若目标key已存在,则rename会覆盖,而renamenx不会覆盖;若目标key不存在,那两者的效果则一样
del key1 key2 key3 key4
set key1 "hello"
set key2 "world"
renamenx key3 key4
renamenx key1 key2
get key2
#.copy用于复制数据到新的key中,使用replace会强制覆盖,也可以指定目标数据库索引号为1
set key1 "hello"
copy key1 key2
copy key1 key2 replace
copy key1 key2 DB 2
#.type用于返回键所存储的值的类型
set key1 "value"
lpush key2 "value"
sadd key3 "value"
type key1
type key2
type key3
list 列表
| 命令 |
描述 |
示例 |
| LPUSH |
将一个或多个值插入到列表头部 |
lpush mylist "a" "b" |
| RPUSH |
将一个或多个值插入到列表尾部 |
rpush mylist "a" "b" |
| LPOP |
移除并返回列表的第一个元素 |
lpop mylist |
| RPOP |
移除并返回列表的最后一个元素 |
rpop mylist |
| LLEN |
获取列表的长度 |
llen mylist |
| LRANGE |
获取列表中指定范围的元素 |
lrange mylist 0 -1 |
| LINDEX |
获取列表中指定索引的元素 |
lindex mylist 0 |
| LSET |
将列表中指定索引的元素设置为新的值 |
lset mylist 0 "newvalue" |
| LREM |
从列表中移除指定的元素,count 表示移除的数量 |
lrem mylist 2 "a" |
| LTRIM |
修剪列表,只保留指定范围内的元素 |
ltrim mylist 1 3 |
| RPOPLPUSH |
移除列表的最后一个元素并将其插入到另一个列表的头部 |
rpoplpush mylist myotherlist |
| BLPOP |
阻塞弹出列表的第一个元素,若列表为空则等待直到超时或有新元素 |
blpop mylist 0 |
| BRPOP |
阻塞弹出列表的最后一个元素,若列表为空则等待直到超时或有新元素 |
brpop mylist 0 |
| BRPOPLPUSH |
阻塞移除列表的最后一个元素,并将其插入到另一个列表头部 |
brpoplpush mylist myotherlist 0 |
string 字符串
| 命令 |
描述 |
示例 |
| SET |
设置指定 key 的值 |
set mykey "Hello" |
| GET |
获取指定 key 的值 |
get mykey |
| GETSET |
设置指定 key 的新值并返回旧值 |
getset mykey "NewValue" |
| MSET |
一次设置多个 key-value |
mset key1 "a" key2 "b" |
| MGET |
一次获取多个 key 的值 |
mget key1 key2 |
| SETEX |
设置 key 的值及其过期时间(秒) |
setex mykey 10 "Hello" |
| SETNX |
只有在 key 不存在时,才设置 key 的值 |
setnx mykey "Hello" |
| INCR |
将 key 的整数值加 1 |
incr mycounter |
| INCRBY |
将 key 的整数值加指定的增量 |
incrby mycounter 5 |
| DECR |
将 key 的整数值减 1 |
decr mycounter |
| DECRBY |
将 key 的整数值减指定的减量 |
decrby mycounter 5 |
| APPEND |
将 value 追加到原 key 值的末尾 |
append mykey " World" |
| STRLEN |
返回 key 所存储的字符串值的长度 |
strlen mykey |
| SETRANGE |
用指定的字符串覆盖 key 从偏移量开始的值 |
setrange mykey 6 "Redis" |
| GETRANGE |
返回 key 中字符串值的子字符串,范围由 start 和 end 指定 |
getrange mykey 0 4 |
| MSETNX |
当所有给定 key 都不存在时,同时设置多个 key-value |
msetnx key1 "a" key2 "b" |
#.set用于设置一个key/value
set key1 "hello"
#.get用于返回指定key所存储的键值
get key1
hash 哈希
| 命令 |
描述 |
示例 |
| hset key field value |
给key集合中的filed键赋值value |
- |
| hget key1 field |
集合field取出value |
- |
| hmset key1 field1 value1 field2 value2 |
批量设置hash的值 |
- |
| hexists key1 field |
查看哈希表key中,给定域field是否存在 |
- |
| hkeys key |
列出该hash集合的所有field |
- |
| hvals key |
列出该hash集合的所有value |
- |
| hincrby key field increment |
为哈希表key中的域field的值加上增量1 -1 |
- |
| hsetnx key field value |
将哈希表key中的域field的值设置为value |
- |
set 集合
- set集合类型也是保存多个字符串类型的元素,但是和列表类型不同的是,set集合中的元素是无序的,并且不允许重复
| 命令 |
描述 |
示例 |
| SADD |
向集合中添加一个或多个成员 |
sadd myset "apple" "banana" |
| SCARD |
获取集合中成员的数量 |
scard myset |
| SDIFF |
返回一个集合与其他集合的差集 |
sdiff myset1 myset2 |
| SDIFFSTORE |
将差集结果存储在指定的集合中 |
sdiffstore resultset myset1 myset2 |
| SINTER |
返回集合的交集 |
sinter myset1 myset2 |
| SINTERSTORE |
将交集结果存储在指定的集合中 |
sinterstore resultset myset1 myset2 |
| SISMEMBER |
判断成员是否在集合中 |
sismember myset "apple" |
| SMEMBERS |
返回集合中的所有成员 |
smembers myset |
| SMOVE |
将指定成员从一个集合移动到另一个集合 |
smove myset1 myset2 "apple" |
| SPOP |
随机移除并返回集合中的一个或多个成员 |
spop myset 1 |
| SRANDMEMBER |
随机返回集合中的一个或多个成员,但不移除 |
srandmember myset 2 |
| SREM |
移除集合中的一个或多个成员 |
srem myset "apple" "banana" |
| SUNION |
返回所有集合的并集 |
sunion myset1 myset2 |
| SUNIONSTORE |
将并集结果存储在指定的集合中 |
sunionstore resultset myset1 myset2 |
zset 有序集合
- zset有序集合与普通集合set非常相似,是一个可以存在重复元素的字符串集合。与set集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,使得有序集合中的元素是可以维护有序性的,在进行排序的时候就是根据分数(score)的大小来说进行升序/降序排序
| 命令 |
描述 |
示例 |
| zadd key score1 value1 score2 value2 |
将一个或多个member元素及其score值加入到有序key中 |
- |
| zrange key start stop (withscores) |
返回有序集key,下标在start与stop之间的元素 |
- |
| zrangebyscore key min max(withscores) |
返回有序集key,所有score值介于min和max之间的成员 |
- |
| zrevrangebyscore key max min (withscores) |
同上,改为从大到小排列 |
- |
| zincrby key increment value |
为元素的score加上增量 |
- |
| zrem key value |
删除该集合下,指定值的元素 |
- |
| zcount key min max |
统计该集合,分数区间内的元素个数 |
- |
| zrank key value |
返回该值在集合中的排名,从0开始 |
- |
| 数据结构 |
是否允许重复元素 |
是否有序 |
有序依据 |
应用场景 |
| 列表 |
是 |
是 |
索引下标 |
时间轴、消息队列等 |
| set 集合 |
否 |
否 |
- |
标签、社交等 |
| zset 有序集合 |
否 |
是 |
分数 |
排行榜系统、社交等 |