Redis 常用命令与常用配置速查手册

在bin下的可执行文件

  • redis-server :Redis的服务端
  • redis-cli :命令行客户端
  • redis-benchmark :Redis性能测试工具
  • redis-check-aof :AOF文件修复工具
  • redis-check-dump :RDB文件检测工具
  • redis-sentinel : 用于做主备

启动和停止redis

  • 启动方式有以下几种
  • 不加载配置启动:redis-server
  • 加载配置启动:redis-server /etc/redis.conf
  • 使用docker启动:run -d --rm -v /root/test/redis.conf:/redis.conf --name redis-test -p 6379:6379 redis:5.0.0
  • 停止方式有以下几种
  • 命令行连上redis以后运行shutdown
  • 直接结束redis进程:kill ...
  • 停止docker启动的redis:docker stop redis-test

命令返回值类型

  1. 状态回复
  • 写一个SET命令回复ok
  • PING命令回复“pong”
  1. 错误回复
  • 都以 (error) 开头
  1. 整数回复
  • 都以 (integer) 开头,例如递增命令
  1. 字符串回复
  • GET一个key(键)返回一个value(值)
  1. 多行字符串回复
  • 每行都会以序列号开头
  • 例如命令KEYS *获取目前数据库中的key名
  1. 回复空结果
  • GET一个不存在的key,或者GET一个值为空的key,则返回(nil)

配置选项

  1. 可以动态设置(启动服务的时候设置,或启动后修改),或者通过配置文件设置。动态的设置会覆盖配置文件的设置
  2. 可以通过命令 CONFIG GET 配置名称 来获得当前值,一般返回结果中第一行是配置名称,第二行是值
  3. 通过CONFIG SET 配置名 value修改配置的值

常用简单命令

连接操作常用命令

#关闭连接
>quit
#简单密码认证
>auth xxxxx
#返回redis服务器的各种信息和统计数据
#info [section]
> INFO CPU
# CPU
used_cpu_sys:0.082652
used_cpu_user:0.125159
used_cpu_sys_children:0.000949
used_cpu_user_children:0.002533
  • 以人类可读的方式,返回所有的连接客户端信息和统计数据
> client list
id=3 addr=127.0.0.1:57516 fd=8 name= age=101 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
  • 将数据同步保存到磁盘,然后关闭服务停止进程
>shutdown
  • 实时打印出redis服务器接收到的指令
>monitor
OK

持久化常用命令

  • 将数据同步保存到磁盘
> save
OK
  • 将数据异步保存到磁盘
> bgsave
Background saving started
  • 返回最近一次成功将数据保存到磁盘的Unix时戳
> lastsave
(integer) 1557285566

配置相关常用命令

  • config get parameter #取得运行redis服务器的配置参数
  • config set parameter value #设置redis服务器的配置参数
  • 获得当前日志级别配置
> CONFIG GET loglevel
1) "loglevel"
2) "notice"
  • 获得端口配置
> CONFIG GET port
1) "port"
2) "6379"
  • 修改日志级别(支持的日志级别 debug、verbose、notice、warning)
>CONFIG SET loglevel debug
OK
  • 将内存中的redis配置写入磁盘的redis.conf文件
>config rewrite

慢日志相关命令

  • 重置慢日志记录
> SLOWLOG RESET
OK
  • 查询慢日志内容
查询前10个慢日志(默认为10个)
> SLOWLOG GET 10
(empty list or set)
  • 返回慢日志条数
> SLOWLOG LEN
(integer) 0

数据库操作常用命令

  • 进入数据库,在redis中数据库以数字命名,第一个数据库的编号是0,例如进入数据库1
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]>
  • 查询当前库所有KEY
>KEYS *
  • 随机返回一个key
>randomkey
  • 查询KEY总数直接获取redis内置的键总数变量
>dbsize
  • 获取数据库中的所有key
127.0.0.1:6379[1]> KEYS *
(empty list or set)
127.0.0.1:6379[1]>
  • 清空当前数据库中的所有KEY
>FLUSHDB
  • 清空所有数据库中的所有KEY
>FLUSHALL
  • 迁移KEY
#Dump+restore可以实现在不同的redis实例之间进行数据迁移的功能,整个迁移的过程分为两步;
#1)在源redis上,dump命令会将键值序列化,格式采用的是RDB格式
#2)在目标redis上,restore命令将上面序列化的值进行复原,其中ttl参数代表过期时间,ttl=0代表没有过期时间
192.168.225.129:6379> get redis
"world"
192.168.225.129:6379> dump redis
"\x00\x05world\a\x00\xe6\xe3\xe9w\xd8c\xa7\xd8"
目标redis
192.168.225.128:6379> get redis
(nil)
192.168.225.128:6379> restore redis 0 "\x00\x05world\a\x00\xe6\xe3\xe9w\xd8c\xa7\xd8"
OK
192.168.225.128:6379> get redis
"world"
#migrate,实际上是吧dump、restore、del 3个命令进行组合,从而简化步骤。
#Migrate host port key [ key ......] destination-db timeout [replace]
#源redis中执行(将键flower迁移至目标192.168.225.128:6379的库0中,超时时间为1000毫秒,replace表示目标库如果存在键flower,则覆盖)
192.168.225.129:6379> migrate 192.168.225.128 6379 flower 0 1000 replace

主备常用命令

  • 将该redis实例作为slave,清空当前数据并从master实例复制数据过来。
  • 语法slaveof <masterip> <masterport>
>slaveof 192.168.0.100 6379
  • 将slave提升为master,该操作将删除原有的slaveof <masterip> <masterport>配置与readonly配置
>slaveof no one

配置文件redis.conf

基本配置

#监听端口
port 6379
#以守护进程方式启动
daemonize yes
#监听的ip
bind 127.0.0.1
#设置redis公开哪个IP给访问者(在nat网络环境下使用)
cluster-announce-ip "192.168.0.8"
#客户端不操作等待多久自动断开,设置0为不自动断开
timeout 0
#日志级别
# Specify the server verbosity level.
# This can be one of:
# 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)
loglevel notice
#设置pid文件存放路径
pidfile "/cache1/redis/data/redis.pid"
#指定日志记录方式,可以写一个路径,也可以放空输出到stdout。但是如果以守护进程方式运行但又放空的话,日志会写给/dev/null
logfile ""
#限制可设置数据库的数量,默认只允许16个,第一个数据库的编号是0
databases 16
#允许使用的最大内存(需要配合maxmemory-policy使用),设置为0表示不限制;当redis内存数据集快到达maxmemory时,redis会实行数据淘汰策略
maxmemory 0
#Redis提供6种数据淘汰策略:
#volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰;
#volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰;
#volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰;
#allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰;
#allkeys-random:从数据集中任意挑选数据 淘汰;
#no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到maxmemory,在该策略下,直接返回OOM错误)
maxmemory-policy volatile-lru
#为了防止某个脚本执行时间过长导致Redis无法提供服务(比如陷入死循环),Redis提供了lua-time-limit参数限制脚本的最长运行时间,默认为5秒钟。当脚本运行时间超过这一限制后,Redis将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止),而是会返回“BUSY”错误。
lua-time-limit 5000
#设置最多同时可连接的客户端数量。默认为0没有限制,该配置关系到Redis进程能够打开的文件描述符数量
#如果到达了限制,Redis会关闭所有新连接并返回错误“max number of clients reached”
maxclients 10000
#读入多个配置文件,当有标准配置模板但是每个redis实例又需要个性设置的时候很有用
include /path/to/local.conf
include /path/to/other.conf

慢查询相关配置

#单位为微秒,当命令执行时间超过该值则会被redis记录为慢查询
#配置为负数则禁用慢查询日志
#配置为0则记录所有命令
slowlog-log-slower-than 10000
#设置慢查询日志的长度,如果已满则会删掉最旧的保留最新的
#可以用命令 SLOWLOG RESET 来释放内存
slowlog-max-len 128

缓冲区相关配置

Redis为了解决输出缓冲区消息大量堆积的隐患,设置了一些保护机制,主要采用两种限制措施:

  • 大小限制,当某一客户端缓冲区超过设定值后直接关闭连接;
  • 持续性限制,当某一客户端缓冲区持续一段时间占用过大空间时关闭连接。
    该配置项格式如下:
    client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
    具体参数含义如下:
  • class : 客户端种类,normal、slave、pubsub。
  • mormal:普通的客户端
  • slave: 从库的复制客户端
  • pub/sub: 发布与订阅的客户端的
  • hard limit: 缓冲区大小的硬限制。
  • soft limit: 缓冲区大小的软限制。
  • soft seconds: 缓冲区大小达到了(超过)soft limit值的持续时间,单位秒。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

与RDB快照有关的配置

快照方法在redis进程异常死掉时,最近的数据会丢失(丢失数据的多少视你save策略的配置)这是它最大的缺点。当业务量很大时,将丢失很多数据

# save <seconds> <changes>
#900秒内有一个key被修改,就保存快照(持久化落盘)到磁盘上的数据库文件里
save 900 1
#300秒内有10个更改就快照
save 300 10
#69秒内有1万个更改就快照
save 60 10000
#存储本地数据库时是否使用压缩,默认yes,使用LZF算法。压缩消耗cpu,不压缩消耗磁盘空间
rdbcompression yes
# The filename where to dump the DB。本地数据库的磁盘中的文件名
dbfilename dump.rdb
#从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。
#这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降,
#所以,为了达到性能的最大化,你可以关掉这个配置项。
#没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。
rdbchecksum yes
#指定本地存储数据库的路径,默认当前目录
dir ./
#如果配置 yes 当后台持久化失败,Redis会停止接受更新操作。如果持久化进程再次工作则会恢复允许更新操作
#如果配置 no 当后台持久化失败,Redis更新操作仍然继续处理
stop-writes-on-bgsave-error yes

与AOF持久化相关的配置

  • Append-only方法可以做到全部数据不丢失,但redis的性能就要差些。
    原理是以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
  • rewrite重写机制是什么:
    AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof
  • 重写原理
    AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
#开启AOF
appendonly yes
#设置AOF文件名
appendfilename "appendonly.aof"
#AOF落盘方式可选参数有:
#always 总是写入aof文件,并完成磁盘同步
#everysec 每一秒写入aof文件,并完成磁盘同步
#no 写入aof文件,不等待磁盘同步
#从持久化角度讲,always是最安全的。从效率上讲,no是最快的。而redis默认设置进行了折中,选择了everysec。
appendfsync always
#在rewrite给AOF文件减肥的时候,appendfsync请求只写入缓冲区不落盘。(如果当前AOF文件很大,那么相应的rewrite时间会变长,appendfsync被阻塞的时间也会更长,这时候服务异常会丢失这段时间内的数据)
no-appendfsync-on-rewrite yes
#当AOF文件大小超过上次rewrite后的100%(一倍)并且文件大于64M时触发rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
#redis在恢复时忽略最后一条可能存在问题的指令,默认值yes。在aof写入时突然断电可能会出现指令写错(写了一半),这种情况下yes会log并继续,而no会直接恢复失败
aof-load-truncated yes

安全相关配置

#当以sentinel主备redis运行时或者cluster运行时,slave实例需要访问master,所以需要在slave实例配置master实例的密码
masterauth "d9s@@ddd"
#本Redis的密码
requirepass "saseawe"
#将危险的命令重命名,或者禁用
#例如禁用FLUSHALL
rename-command FLUSHALL ""
#重命名FLUSHDB,重命名后必须用新命令来操作,否则服务器会报错 unknown command
rename-command FLUSHDB qf69aZbLAX3cf3ednHM3SOlbpH71yEXLAX3cf3e

主从相关配置

#配置在备库,配置主库的ip与端口。表备库从哪个主库复制来数据。如果原本已有数据的备库开启了该设置,则会清空备库自身数据后再开始复制
slaveof 192.168.0.100 6379
# 作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)
slave-read-only yes
#slave与master连接中断时
#yes 代表slave会继续应答来自client的请求,即使这些数据已过期(因为连接中断无法从master更新数据)
#no 除了INFO与SLAVEOF外的所有客户端请求都只响应"SYNC with master in progress"的应答,直到该slave与master的连接重建成功或该slave被提升为master
slave-serve-stale-data yes
#Redis部署为Replication模式后,slave会以预定周期(默认10s)发PING包给master,该配置可以更改这个默认周期
repl-ping-slave-period 10
#有2种情况的超时均由该配置指定:1) Bulk transfer I/O timeout; 2) master data or ping response timeout。
# 需要特别注意的是:若修改默认值,则用户输入的值必须大于repl-ping-slave-period的配置值,否则在主从链路延时较高时,会频繁timeout。
repl-timeout 30
#当配置yes时会禁用NO_DELAY,TCP协议栈会合并小包统一发送,这样可以减少主从节点间的包数量并节省带宽,但会增加数据同步到slave的时间
#当配置no时启用NO_DELAY,TCP协议栈不会延迟小包的发送时机,这样数据同步的延时会减少,会消耗更多带宽
#在带宽充足的情况下建议配置为no,以降低同步时延
repl-disable-tcp-nodelay no
#存在多个slave的情况下,当master宕机时Redis seninel将选拔priority值最小的slave提升为master
#如果该配置为 0 则永远不会被sentinel提升为master
slave-priority 4

Redis-cluster相关配置

#开启集群模式
cluster-enabled yes
#集群的配置文件存放路径
cluster-config-file "nodes.conf"
#集群的超时时间
cluster-node-timeout 5000

高级优化配置

# 当有大量数据时,适合用哈希编码hashtable(需要更多的内存),元素数量上限不能超过给定限制。你可以通过下面的选项来设定这些限制:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
#与哈希相类似,数据元素较少的情况下,可以用另一种方式来编码ziplist从而节省大量空间。这种方式只有在符合下面限制的时候才可以用:
list-max-ziplist-entries 512
list-max-ziplist-value 64
# 数据全是64位无符号整型数字构成的字符串。下面这个配置项就是用来限制这种情况下使用这种编码的最大上限的。
set-max-intset-entries 512
# 与第一、第二种情况相似,有序序列也可以用一种特别的编码方式来处理,可节省大量空间。这种编码只适合长度和元素都符合下面限制的有序序列:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 默认是每秒钟进行10次哈希表刷新,用来刷新字典,然后尽快释放内存。
# 建议:如果你对延迟比较在意的话就用 "activerehashing no";如果你不太在意延迟而希望尽快释放内存的话就设置 "activerehashing yes"。
activerehashing yes
# 对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接。
# 对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。
client-output-buffer-limit normal 0 0 0
# 对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit slave 256mb 64mb 60
# 对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit pubsub 32mb 8mb 60

配置文件sentinel.conf

在一主多从的redis环境中,可以使用多个sentinel(哨兵)来维护slave保证数据的安全
哨兵会同时监控主数据库和从数据库,哨兵之间也会相互监控
具体配置如下

#以守护进程方式启动
daemonize yes
#监听端口默认26379
port 26379
#master数据库的ip与端口号,当master发生变化时sentinel会自动修改该配置
#末尾的2代表执行故障恢复操作前至少需要几个哨兵节点同意,一般设置为N/2+1(N为哨兵总数)
sentinel monitor redis-master 192.168.1.51 7000 2
#指定了 Sentinel 认为服务器已经断线所需的毫秒数
sentinel down-after-milliseconds redis-master 5000
#等待该配置内的时间后master还没有恢复响应,则sentinel会排除掉故障的实例,一段时间后再探测如果已恢复则把之前故障的master作为slave处理
sentinel failover-timeout redis-master 900000
#选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
sentinel parallel-syncs redis-master 2
#master的访问密码
sentinel auth-pass redis-master 123456
#log文件路径
logfile "./sentinel.log"

Redis中的数据类型与数据操作命令

String 字符串类型

一个key最多只能存储512MB

  • 相关命令
  • SET 设置key对应的值为value,EX设置key的存活时间,PX设置存活时间单位为毫秒,NX当key不存在的时候才生效,XX当key已存在的时候才生效
  • 语法 SET Key value [EX seconds] [PX millisconds] [NX|XX]
>SET testStr1 'this is a test'
OK
>SET testS2 'test2'
OK
> SET username xiaoming EX 10
OK
> SET username xiaoming PX 1000000000
OK
> PTTL username
(integer) 999986009
> GET username
"xiaoming"
> SET username erha NX
(nil)
> GET username
"xiaoming"
> SET username erha XX
OK
> GET username
"erha"
  • GET根据key找到对应值
  • 如果返回结果为空的话将会返回(nil)
  • 如果键值不是字符串类型则会返回报错(error) WRONGTYPE Operation against a key holding the wrong kind of value
>GET testStr1
"this is a test"
>LPUSH testList1 a b c
(integer) 3
> GET testList1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
  • GETRANGE返回得字符串的一部分
  • 语法 GETRANGE key 起始点 结束点
>GET testStr2
"meizitu"
#返回第一个字符到第5个字符
>GETRANGE testStr2 0 4
"meizi"
#返回第一个字符到倒数第二个字符
>GETRANGE testStr2 0 -2
"meizit"
#返回第一个字符到倒数第三个字符
>GETRANGE testStr2 0 -3
"meizi"
#返回倒数第4个字符到倒数第2个字符
>GETRANGE testStr2 -4 -2
"zit"
#如果结束点比起始点更靠前的话,只会返回空结果
>GETRANGE testStr2 -4 -5
""
#如果结束点设置的比字符串还长的话,只会返回到字符串结尾
>GETRANGE testStr2 0 1000
"meizitu"
  • GETSET设置指定key的值,并返回旧值
  • 语法GETSET key value
>SET testStr3 'winter'
OK
>GET testStr3
"winter"
>SET testStr3 'is'
OK
>GETSET testStr3 'comming'
"is"
#如果getset一个原本没有的key,则会返回(nil)
>GETSET testStr4 'this is a test'
(nil)
  • MSET一次设置多个键值对
  • 语法MSET key value [ key value ...]
>MSET testStr5 'king' testStr6 'meizi' testStr7 'queen'
OK
  • MGET一次获取多个键值对
  • 语法MGET key key key ...
> MGET testStr5 testStr6 testStr7 testStr8
1) "king"
2) "meizi"
3) "queen"
4) (nil)
  • STRLEN获取key字符串长度
  • 语法:STRLEN key
> SET testStr5 'king'
OK
> STRLEN testStr5
(integer) 4
#如果对不存在的key使用,则返回长度0
> STRLEN testStr6
(integer) 0
  • SETRANGE将字符串中的某一部分替换成其他值,并返回修改后的字符串长度
  • 语法SETRANGE key offset value
#如果原本设置的字符位置为空,则按照空字符做处理
> SET testStr9 "hello king"
OK
> SETRANGE testStr9 6 'queen'
(integer) 11
> GET testStr9
"hello queen"
#检测key是否存在,返回0代表不存在,返回1代表存在
> EXISTS testStr10
(integer) 0
> EXISTS testStr9
(integer) 1
#对不存在的key使用SETRANGE,会返回以0字符来填充
> SETRANGE testStr10 5 'king'
(integer) 9
> GET testStr10
"\x00\x00\x00\x00\x00king"
  • SETNXNS代表not exist,只有key不存在的时候才能设置成功,避免覆盖
  • 语法SETNX key value
#当key不存在的时候可以设置成功,并返回整型1
>EXISTS testStr11
(integer) 0
>SETNX testStr11 'meizi'
(integer) 1
>GET testStr11
"meizi"
#当key已存在的时候设置失败,返回整形0
>SETNX testStr11 'king'
(integer) 0
>GET testStr11
"meizi"
  • SETEX是原子性操作,设置key的过期时间,设置生存时间与设置值在同一个动作内完成
  • 语法 SETEX key seconds时间 value值
>SETEX expireStr 60 'testExpire'
OK
#使用TTL命令查看key还剩下多少时间过期
> TTL expireStr
(integer) 51
#过期后,key不存在,TTL会返回整形-2
> TTL expireStr
(integer) -2
> GET expireStr
(nil)
#将这两个行为拆开操作的话
>SET expireStr1 'test1'
OK
>EXPIRE expireStr1 10
(integer) 1
>TTL expireStr1
(integer) 5
#如果对一个已存在的key使用SETEX,则会覆盖原本的值和超时时间
>SETEX test12 1000 'a'
OK
>GET test12
"a"
>TTL test12
(integer) 991
>SETEX test12 100 'b'
OK
>TTL test12
(integer) 97
>GET test12
"b"
  • MSETNX一次设置多个key的值,类似MSET,但只有key不存在的时候才能设置成功,当有一个key是已存在的,那么所有key都会设置失败,成功返回整形1,失败返回整形0
  • 语法MSETNX key value [key value ...]
>MSETNX test13 'a' test14 'b' test15 'c'
(integer) 1
>MGET test13 test14 test15
1) "a"
2) "b"
3) "c"
>MSETNX test15 'aa' test16 'bb' test17 'cc'
(integer) 0
>MGET test13 test14 test15 test16 test17
1) "a"
2) "b"
3) "c"
4) (nil)
5) (nil)
  • PSETEX 与setex相似,P代表以毫秒为单位设置key的生存时间,使用PTTL获得key剩余存活时间
  • 语法`PSETEX key milliseconds value'
>PSETEX test16 2000 'hello world'
OK
>PTTL test16
(integer) 210
>PTTL test16
(integer) -2
  • INCR 对key中存储的数字+1,如果key不存在的时候会先初始化为0,再执行INCR。如果值超出了范围或者非整数则会报错
  • 语法 INCR key
>SET counter 1
OK
>INCR counter
(integer) 2
>INCR counter
(ingeger) 3
#当对不存在的key使用INCR时会当作值初始为0使用INCR
> GET test
(nil)
> EXISTS test
(integer) 0
> INCR test
(integer) 1
#对字符串使用INCR,报错
> SET test20 'hello google'
OK
> INCR test20
(error) ERR value is not an integer or out of range
  • INCRBY将key中存储的数字加上指定整形增量(只支持整形数字,不支持浮点数)
  • 语法INCRBY key number
> SET counter2 10
OK
> INCRBY counter2 5
(integer) 15
  • INCRBYFLOAT将key中存储的数字加上指定浮点增量(也可以加上整形数字)
  • 语法``INCRBY key INCREMENT`
> SET counter3 1
OK
> INCRBYFLOAT counter3 1.2
"2.2"
> INCRBYFLOAT counter3 5
"7.2"
  • DECR 将key中存储的数字减1
  • 语法DECR key
>SET counter2 12
>DECR counter2
(integer) 13
  • DECRBY 将key中存储的数字递增指定的整形数字(只支持整形,不支持浮点)
  • 语法DECRBY key decrement
>GET counter2
"13"
>DECRBY counter2 3
(integer) 10
#
> DECRBY counter2 1.2
(error) ERR value is not an integer or out of range
  • APPEND 在值的末尾追加字符串,如果key不存在则相当于执行SET操作
  • 语法 APPEND key value
>GET testStr11
"meizi"
>APPEND testStr11 'edu'
(integer) 8
>GET testStr11
"meiziedu"
>APPEND noExistsStr 'this is a test'
(integer) 14
>GET noExistsStr
"this is a test"

Hash类型

又称为散列表。也是一个键值对的集合。适用于存储对象。将对象存入hash能节省内存

  • 相关配置文件:
  • hash-max-ziplist-entries 512 #hash类型存储的最大值,512个字节
  • hash-max-ziplist-value 64 #hash类型存储的字段数目。默认64个
  • 相关命令
  • HSET 将hash表key中的域field设置成指定的value
  • 语法HSET key field value
#当field不存在的时候,将新建field,将返回整形1
> HSET userInfo1 username 'king'
(integer) 1
#当field已存在的时候,将重新赋值并返回整形0
> HSET userInfo1 username 'king2'
(integer) 0
> HSET userInfo1 password '123456'
(integer) 1
> HSET userInfo1 email '123@qq.com'
(integer) 1
  • HGET 返回hash表key中指定field的值
  • 语法HGET key field
> HGET userInfo1 username
"king"
> HGET userInfo2 username
(nil)
  • HSETNX hash表中的field不存在的时候才赋值,相当于not exsist
  • 语法HSETNX key field value
>HSETNX testHash1 test 'a'
(integer) 1
>HSETNX testHash1 test '111'
(integer) 0
  • HMSET同时将多个field-value设置到hash表的key中
  • 语法HMSET key field value field value ...
>HMSET userInfo2 username 'king' password '123' nickname 'smart king' email '222@qq.com'
OK
#如果字段已经存在,重新运行则会被覆盖
> HMSET userInfo2 username 'queen' role 'admin'
OK
  • HMGET 一次获得hash表key中多个field的值,如果key中的field不存在会返回nil
  • 语法 HMGET key field field field ...
> HMGET userInfo2 username password email nickname test
1) "queen"
2) "123"
3) "222@qq.com"
4) "smart king"
5) (nil)
  • HGETALL返回hash表key中所有的field和value,奇数行是key,偶数行是value
  • 语法HGETALL key
>HGETALL userInfo2
1) "username"
2) "queen"
3) "password"
4) "123"
5) "nickname"
6) "smart king"
7) "email"
8) "222@qq.com"
9) "role"
10) "admin"

List类型

(列表类型,是一个简单的字符串列表,通过插入顺序排序,最多存储2的32次方减1个元素,通过双向链表实现,获取越接近两端的元素速度越快)(列表通过索引访问元素,如果列表不存在则会先创建)

  • 相关命令
  • LPUSH 向列表左端添加元素,可以一次添加一个或多个
  • 语法`LPUSH key value value ..."
#确认列表不存在
> EXISTS myList1
(integer) 0
#给列表添加3个元素
> LPUSH myList a b c
(integer) 3
#再给列表添加3个元素,目前总共6个元素
> LPUSH myList c d e
(integer) 6
#查看从第一个元素到最后一个元素
> LRANGE myList 0 -1
1) "e"
2) "d"
3) "c"
4) "c"
5) "b"
6) "a"
  • RPUSH 向列表右端添加元素
  • 语法RPUSH key value ...
> RPUSH myList test1 test2 test3
(integer) 9
> LRANGE myList 0 -1
1) "e"
2) "d"
3) "c"
4) "c"
5) "b"
6) "a"
7) "test1"
8) "test2"
9) "test3"
  • RPUSHX LPUSHX与上面一样,但是只有key存在的时候才添加元素
> RPUSHX myList test1 test2 test3
(integer) 12
> LPUSHX myList test1 test2 test3
(integer) 15
> LRANGE myList 0 -1
1) "test3"
2) "test2"
3) "test1"
4) "e"
5) "d"
6) "c"
7) "c"
8) "b"
9) "a"
10) "test1"
11) "test2"
12) "test3"
13) "test1"
14) "test2"
15) "test3"
> LPUSHX myList2 test1 test2 test3
(integer) 0
  • LPOP 将列表头部的一个元素弹出
  • 语法 LPOP key
> LRANGE myList 0 -1
1) "test3"
2) "e"
3) "c"
4) "test3"
#弹出头部的test3
> LPOP myList
"test3"
> LRANGE myList 0 -1
1) "test3"
2) "e"
3) "c"
4) "test3"
  • RPOP 将列表尾巴的一个元素弹出
  • 语法 RPOP key
  • LLEN 得到列表的长度,也就是列出元素的数量
  • 语法LLEN key
> LRANGE myList 0 -1
1) "test2"
2) "test1"
3) "e"
4) "d"
5) "c"
6) "c"
7) "b"
8) "a"
9) "test1"
10) "test2"
11) "test3"
12) "test1"
13) "test2"
14) "test3"
>LLEN myList
(integer) 14
#如果列表不存在就返回0
> LLEN myList4
(integer) 0
  • LRANGE 获取列表片段,0代表列表的第一个元素,1代表列表的第二个元素,-1代表最后一个元素,复数代表从后往前数
  • 语法LRANGE key start stop
> LRANGE myList 0 -1
1) "test2"
2) "test1"
3) "e"
4) "d"
5) "c"
6) "c"
7) "b"
8) "a"
9) "test1"
10) "test2"
11) "test3"
12) "test1"
13) "test2"
14) "test3"
#获取第一个元素
> LRANGE myList 0 0
1) "test2"
127.0.0.1:6379> LRANGE myList 0 2
1) "test2"
2) "test1"
3) "e"
#获取元素只能从左到右,顺序错了就会报错
> LRANGE myList -1 -3
(empty list or set)
#获取末尾3个元素
> LRANGE myList -3 -1
1) "test1"
2) "test2"
3) "test3"
  • LREM 删除列表中的指定参数,
  • 语法 LREM key count value
  • count有以下几种:
  • count 大于 0 从列表的头开始,向尾搜索,移除与value相等数量的元素,移除count个
  • count 小于 0 从尾部向头部搜索,移除与value相等的元素,移除count个
  • count 等于 0 移除列表中所有与value相等的值
#创建一个列表并赋值
> LPUSH myList2 a b c d a e b c d b e f b g e b
(integer) 16
> LLEN myList2
(integer) 16
#从头搜索删除2个b
> LREM myList2 2 b
(integer) 2
127.0.0.1:6379> LRANGE myList2 0 -1
1) "e"
2) "g"
3) "f"
4) "e"
5) "b"
6) "d"
7) "c"
8) "b"
9) "e"
10) "a"
11) "d"
12) "c"
13) "b"
14) "a"
#从尾部搜索删除2个a
127.0.0.1:6379> LREM myList2 -2 a
(integer) 2
127.0.0.1:6379> LRANGE myList2 0 -1
1) "e"
2) "g"
3) "f"
4) "e"
5) "b"
6) "d"
7) "c"
8) "b"
9) "e"
10) "d"
11) "c"
12) "b"
#删除列表里所有的e
127.0.0.1:6379> LREM myList2 0 e
(integer) 3
127.0.0.1:6379> LRANGE myList2 0 -1
1) "g"
2) "f"
3) "b"
4) "d"
5) "c"
6) "b"
7) "d"
8) "c"
9) "b"
  • LINDEX 获得指定索引元素的值,根据索引找到值,命令后面要跟上一个整形数字,可以是正数也可以是负数
  • 语法LINDEX key index start
> LRANGE myList2 0 -1
1) "g"
2) "f"
3) "b"
4) "d"
5) "c"
6) "b"
7) "d"
8) "c"
9) "b"
> LINDEX myList2 5
"b"
> LINDEX myList2 -3
"d"
> LINDEX myList2 0
"g"
  • LSET 设置指定索引元素的值,根据索引设置值
  • 语法LSET
> LRANGE myList2 0 -1
1) "g"
2) "f"
3) "b"
4) "d"
5) "c"
6) "b"
7) "d"
8) "c"
9) "b"
> LSET myList2 0 king
OK
> LRANGE myList2 0 -1
1) "king"
2) "f"
3) "b"
4) "d"
5) "c"
6) "b"
7) "d"
8) "c"
9) "b"
#超出范围
> LSET myList2 110 king
(error) ERR index out of range
#不存在的key
> LSET myList3 1 king
(error) ERR no such key
  • LTRIM 只保留列表的片段,其他都删除,只保留起始点到结束点之间的元素,其他都删掉
  • 语法LTRIM key start stop
> LRANGE myList3 0 -1
1) "log5"
2) "log4"
3) "log3"
4) "log2"
5) "log1"
127.0.0.1:6379> LTRIM myList3 0 1
OK
127.0.0.1:6379> LRANGE myList3 0 -1
1) "log5"
2) "log4"
  • LINSERT 向列表插入元素,插入pivot之前或者之后,当pivot不存在时不做操作
  • 语法LINSERT key BEFORE|AFTER pivot value
> LPUSH myList5 a b c d
(integer) 4
#将king插入b的前面
> LINSERT myList5 BEFORE 'b' 'king'
(integer) 5
> LRANGE myList5 0 -1
1) "d"
2) "c"
3) "king"
4) "b"
5) "a"
> LRANGE myList5 0 -1
1) "d"
2) "c"
3) "king"
4) "b"
5) "a"
> LINSERT myList5 AFTER 'd' 'queen'
(integer) 6
> LRANGE myList5 0 -1
1) "d"
2) "queen"
3) "c"
4) "king"
5) "b"
6) "a"
  • Set集合类型
  • Zset有序集合类型
  • 其他常用命令
  • KEYS 返回所有给定模式的key
  • 语法KEYS pattern
  • 通配符
  • * 匹配任意个字符
  • ? 匹配一个任意字符
  • [] 匹配[]之间的一个字符
  • \ 转译特殊字符
  • EXISTS 检测指定key是否存在
  • 语法EXISTS key
  • TYPE 返回key所存储的类型
  • 语法TYPE key
  • 返回类型
  • 不存在的key返回none
  • string
  • hash
  • set
  • zset
  • list
  • EXPIRE 设定key的过期时间,如果对已经带有国企时间的key使用命令则会重置时间。2.4版本中过期后的1秒内key还有效,2.6版本开始过期后的时间改为1毫秒内可访问
  • 语法EXPIRE key seconds
#设置失败返回0
> EXPIRE cache_page 100
(integer) 0
> SET cache_page sl
OK
#设置成功返回1
> EXPIRE cache_page 100
(integer) 1
#使用TTL查看剩余时间
>TTL cache_page
(integer) 88
  • EXPIREAT 设定key的过期时间,设置具体时间点(时间戳),而不是时间范围
  • 语法EXPIREAT key timestamp
>SET cache_page1 'www.qq.com'
OK
>EXPIREAT cache_page1 1431868110
(integer) 1
#使用TTL查看剩余时间
>TTL cache_page1
(integer) 88
  • PEXPIRE 设置key的过期时间,以毫秒为单位
  • 语法PEXPIRE key milliseconds
  • 使用PTTL查询剩余时间
  • PEXPIREAT 设置key的过期时间,设置具体时间戳,而不是范围
  • 语法PEXPIREAT key timestamp
  • TTL 以秒为单位返回key的剩余过期时间
  • 语法TTL key
  • 如果key没有设置过期时间,会返回 -1
  • 如果key不存在,会返回 -2
  • PTTL 以毫秒为单位返回key的剩余过期时间
  • PERSIST 将有过期时间的key转为永久不过期的key
  • 语法PERSIST
> SET cache 'testCache'
OK
> TTL cache
(integer) -1
> EXPIRE cache 100
(integer) 1
> TTL cache
(integer) 96
> PERSIST cache
(integer) 1
> TTL cache
(integer) -1
  • DEL 删除key
  • 语法DEL key ...
#成功删除了几个key则返回数字几
>DEL cache1 cache2 cache3
(integer) 1
>DEL one two three four
(integer) 4
  • RANDOMKEY 随机从当前数据库中返回一个key
  • 语法 RANDOMKEY
  • RENAME 将一个key重命名
  • 语法RENAME key key
> SET testRename1 'rename1'
OK
127.0.0.1:6379> RENAME testRename1 testRename2
OK
127.0.0.1:6379> GET testRename1
(nil)
127.0.0.1:6379> GET testRename2
"rename1"
127.0.0.1:6379> RENAME testRename2 testRename2
OK
#如果源key不存在会报错
> RENAME testRens testRename2
(error) ERR no such key
  • RENAMENX 被重命名的新名称不存在的时候才有效
  • 语法`RENAMENX key newkey'
  • DUMP 序列化给定的key,返回序列化之后的值
  • 语法DEMP key
> SET testDump 'this is a test'
OK
> DUMP testDump
"\x00\x0ethis is a test\t\x00 \x88)\xc7\xcef\xce\xda"
  • RESTORE 反序列化给定的key,返回反序列化后的值
  • 语法RESTORE key ttl value
#反序列化的时候会设置过期时间
> RESTORE testDump3 50000 "\x00\x0ethis is a test\t\x00 \x88)\xc7\xcef\xce\xda"
OK
127.0.0.1:6379> GET testDump3
"this is a test"
127.0.0.1:6379> PTTL testDump3
(integer) 42520
  • MOVE 将当前数据库中的key移动到另外的数据库,如果目标数据库已存在则会移动失败返回整形0,当移动一个不存在的数据库则会失败报错
  • 语法MOVE key dbID
#打开0号数据库
127.0.0.1:6379> SELECT 0
OK
127.0.0.1:6379> SET testMove 'aaaa'
OK
127.0.0.1:6379> GET testMove
"aaaa"
#打开数据库1
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> KEYS *
(empty list or set)
127.0.0.1:6379[1]> SELECT 0
OK
127.0.0.1:6379> MOVE testMove 1
(integer) 1
127.0.0.1:6379> GET testMove
(nil)
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> GET testMove
"aaaa"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345