Redis 介绍
Redis 特点
Redis 优势
Redis 连接
Redis 服务
数据结构
字符串(String)
散列(Hashes)
列表(List)
集合(Set)
有序集合(Zset)
Key 相关命令
Redis 发布订阅
Redis 事务
Redis 配置文件 redis.conf
Redis 密码设置
本篇文章已保存到 GitHub 上,欢迎下载。
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
Redis(即 Remote Dictionary Server)是一个由Salvatore Sanfilippo写的key-value存储系统,它是一个性能强劲的、使用内存存储的非关系数据库,它可以存储键和 5 种(字符串、列表、集合、散列表、有序集合)不同类型的值之间的映射,可以将存储在内存的数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片(client-side sharding)来扩展写性能。
这里 有一个在线教程,帮你快速熟悉 Redis 的常用数据类型和命令。
Redis 与其他 key-value 缓存产品有以下三个特点:
登录:$ redis-cli -h host -p port -a password
select index
切换 redis 数据库flushdb
删除当前数据库所有的 keyflushall
删除所有数据auth password
验证密码echo message
ping
查看服务是否在运行quit
退出连接
info
返回redis 服务信息
Redis 服务器 | 菜鸟教程
Redis 字符串可以存储字符串、整数、浮点数 3 种类型的值,常用的命令有:
set key value [EX seconds] [PX milliseconds] [NX|XX]
get key
mget key [key …]
获取多个 key 的值getset key value
设置新值并返回旧值对于存储整数或者浮点数的键,可以执行自增或增减操作:
incr key-name
将键存储的值加1decr key-name
:将键存储的值减1incrby key-name amount
:将键存储的值加上整数 amountdecrby key-name amount
:将键存储的值减去整数 mountincrbyfloat key-name amount
:将键存储的值加上浮点数 amount如果对一个不存在的键或者一个保存了空字符串的键执行自增或者自减操作,那么 Redis 在执行操作时会将这个键的值当作是 0 来处理。
其他字符串命令:
append key-name value
:将 value 追加到 key-name 的值末尾getrange key-name start end
:返回键 key-name 对应的 从 start 到 end 应对的字符串(包括 start 和 end)setrange key-name offset value
:将从 offset 偏移量开始的子串设置为给定值散列可以将多个键值对存储到一个 Redis 键里面,适合存储对象,常用的命令有:
hset key field value
hsetnx key field value
只有在字段不存在时,设置字段的值hget key field
hgetall key
获取散列包含的所有键值对hdel key field [field …]
hmset key field value [field value …]
添加多个键值对到散列表hmget key field [field …]
获取 key 中多个键的值hlen key
返回 key 包含的键值对数量hexists key field
检查给定键是否存在与散列中hkeys key
获取散列包含的所有键hvals key
获取散列包含的所有值hincrby key field increment
将 field 存储的值加上整数 incrementhincrbyfloat key field increment
将 field 存储的值加上浮点数 increment如果散列包含的值非常大,那么可以先使用 hkeys 取出散列包含的所有键,然后再使用 hget 一个个地取出键的值,从而避免使用 hgetall 一次获取而知道的服务阻塞。
列表使用的数据结构是双向链表,可以从两端添加或者删除元素,常用的命令有:
lpush/rpush key-name value [value …]
将一个或多个元素添加到列表的左端/右端
lpop/rpop key-name
移除并返回列表最左端/右端的元素
lindex key-name offset
返回列表中偏移量为 offset 的元素
lrange key-name start end
返回列表从 start 到 end(包括)范围内所有元素(start =0,end=-1 时返回所有元素)
ltrim key-name start end
列表进行修剪,只保留从 start 到 end(包括)范围内的元素
llen key
返回列表的长度
lset key index value
通过索引设置列表元素的值
lrem key count value
根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
最后一条命令中,COUNT 的值可以是以下几种:
有几个列表命令可以将元素从一个列表移动到另一个列表,或者阻塞(block)执行命令的客户端知道有其他客户端给列表添加元素位置:
blpop/brpop key-name [key-name …] timeout
从第一个非空列表中弹出位于最左端/右端的元素,或者在timeout 秒之内阻塞并等待可弹出的元素出现;rpoplpush source-key dest-key
从 source-key 列表中弹出右侧的元素,然后放在 dest-key 列表的左侧,并向用户返回这个元素;brpoplpush source-key dest-key timeout
与 rpoplpush 相似,只是如果 source-key 为空,那么在 timeout 秒之内阻塞并等待可弹出的元素出现使用上面的命令,就可以实现队列的功能。
集合以无序的方式存储多个不重复的元素,常用的命令有:
sadd key member [member ...]
添加元素,返回添加成功的数量srem key member [member ...]
移除多个元素,返回移除元素的数量sismember key member
判断 member 是否是集合 key 的成员,1 包含,0 不包含scard key
返回集合包含的元素数量smembers key
返回集合包含的所有元素spop key [count]
随机移除 count 个元素srandmember key [count]
随机返回 count 个元素smove source-key dest-key item
如果集合 source-key 包含元素 item,那么从集合 source-key 里面移除元素 item,并将元素 item 添加到集合 dest-key 中;如果 item 被成功移除,那么命令返回 1,否则返回 0集合还支持交集、并集、差集运算:
sdiff key [key ...]
返回存在于第一个集合、但不存在于其他集合中的元素(差集)sdiffstore destination key [key ...]
同 sdiff 命令,并且把差集元素保存到 destination 里面sinter key [key ...]
返回所有集合的交集sinterstore destination key [key ...]
同 sinter 命令,并且把交集元素保存到 destination 里面sunion key [key ...]
返回所有集合的并集sunionstore destination key [key ...]
同 sunion 命令,并且包并集元素保存到 destination 里面有序集合通过使用为每个元素指定 score 来实现集合的有序性,常用的命令有:
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
zrem key member [member …]
移除指定的元素,返回被移除元素的个数zremrangebyscore key min max
移除集合中排名在 min 和 max 之间的成员zcard key
返回集合包含的元素个数zincrby key increment member
将 member 成员的分值加上 incrementzcount key min max
返回分值在 min 和 max 之间的成员数量zrank key member
返回成员 member 在集合中的排名zrevrank key member
同 zrank 命令一样,并且成员按照分值从大到小排列zscore key member
返回成员 member 的分值zrange key start stop [WITHSCORES]
返回集合中排名在 start 和 stop 之间的成员,如果有 WITHSCORES 选项,会将成员的分值一起返回zrevrange key start stop [WITHSCORES]
同 zrange 命令一样,并且成员按照分值从到大到小排列zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
获取集合中分值在 min 和 max 之间的成员zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
同 zrangebyscore 命令一样,并且按照分值从大到小排列zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
有序集合的交集,默认使用 sum 函数(比如说一个集合里面的 a 的值是 1,另外一个集合里面 a 的值是 2,交集之后,a 的值是 3 )zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
有序集合的并集Redis 可以设置键的过期时间,常用的命令有:
persist key
移除键的过期时间ttl key
查看给定键距离过期还有多少秒。key 不存在,返回 -2;没有设超期时间,返回 -1。pttl key
查看给定键距离过期还有多少毫秒expire key seconds
让给定键在指定的秒数之后过期pexpire key milliseconds
让给定键在指定的毫秒数之后过期expireat key timestamp
让给定键的过期时间设置为 unix 时间戳pexpireat key milliseconds-timestamp
让给定键的过期时间设置为 unix 毫秒级的时间戳其他 key 相关的命令有:
keys pattern
查看符合指定模式的 keyrename key newkey
如果 newkey 已经存在,会覆盖它的值renamenx key newkey
仅当 newkey 不存在时,将 key 改名为 newkeytype key
返回 key 所存储的值的类型:none | string | list | set | zset | hashdel key [key ...]
删除成功返回1,多个累加计数。exists key [key ...]
存在返回1,多个累加计数。move key db
把 key 移到另一个数据库,如果它也有该 key,move 失败。sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
根据给定的选项,对输入列表、集合或者有序集合进行排序,然后返回或者存储排序的结果subscribe channel [channel ...]
订阅频道unsubscribe [channel [channel ...]]
退订一个或多个频道,如果该命令没有任何频道,则退订所有的频道publish channel message
发布消息,返回接收到消息的订阅者的个数psubscribe pattern [pattern …]
订阅与给定模式相匹配的所有频道punsubscribe [pattern [pattern ...]]
退订与给定模式相匹配的所有频道如果客户端在执行订阅操作的过程中断线,那么客户端将丢失在断线期间发送的所有消息。
Redis 有 5个命令可以让用户在不被打断的情况下对多个键执行操作,它们分别是 watch、multi、exec、unwatch、discard。
当 Redis 从一个客户端接收到 multi 命令时,Redis 会将这个客户端之前发送的所有命令都放入一个队列里面,知道正常客户端发送 exec 命令为止,然后 Redis 就会在不被打断的情况下,一个接一个地执行存储在队列里面的命令。
一个事务从开始到执行会经历以下三个阶段:
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
It’s important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
multi
开始事务,exec
执行事务,discard
取消事务:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a aa
QUEUED
127.0.0.1:6379> set b bb
QUEUED
127.0.0.1:6379> set c cc
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
Redis 配置文件 redis.conf
config get *
获取所有的配置项config get [key]
获取指定的配置项,比如获取 Redis 数据持久化保存的目录:CONFIG GET dir
config set [key] [value]
了解每项配置的具体含义:Redis 配置 | 菜鸟教程
打开 redis 配置文件 redis.conf,Mac 下使用 brew 安装 redis,配置文件在 /usr/local/etc/
目录下。修改 requiredpass 配置:
requirepass xiaocan
保存文件,重启 redis,即可生效。
执行 redis-cli 进入 redis 控制台,此时还没有权限操作,输入密码 auth xiaocan
即可。
或者直接使用 redis -a xiaocan
进行登录。
查看密码
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "xiaocan"
设置密码。这个是临时密码,重启 redis 后不可用,会读取配置文件的密码。
127.0.0.1:6379> CONFIG set requirepass ling
OK
完整的 Redis 命令列表可以在 http://redis.io/commands 找到。
提示:可以将这个网站添加到 Alfred 中,以后就可以使用 Alfred 查看 Redis 命令的使用方法了。