Redis入门手册
Redis(REmote DIctionary Serve)是个开源的,内存中的数据结构存储系统,可用于当作数据库、缓存、信息中间件。
Redis特点:快,安全,实用。
- 快 每秒可执行大约
110000
次的设置(SET
)操作,每秒大约可执行81000
次的读取/获取(GET
)操作。因为它将数据保存在内存中仅使用磁盘进行持久化 - 安全 所有操作都是原子性的。确保了数据操作的一致性。
- 实用 Redis提供了丰富的数据结构类型(String、Hash、List、Set、SortedSet、HyperLogLog、GEO)。你可以利用这些数据结构做缓存、消息队列(Redis本地支持发布/订阅)、应用程序的短暂数据、共享session
安装
Mac OS
1 | $ brew install redis |
客户端 /usr/local/bin/redis-server
和/usr/local/bin/redis-cli
配置文件 /usr/local/etc/redis.conf
Linux
下载&安装
1 | wget http://download.redis.io/releases/redis-4.0.9.tar.gz # 下载包 |
修改redis配置文件
vim /application/redis/conf/6379.conf
修改内容如下:
- daemonize no 改为daemonize yes // 后台运行
- pidfile /var/run/redis.pid 改为pidfile /var/run/redis_6379.pid
- 注释掉绑定的主机,否则客户端无法连接 #bind 127.0.0.1 // 支持远程访问
- protected-mode yes 改为 protected-mode no
将redis加入服务
vim /etc/rc.d/init.d/redis
修改内容如下:
- 在监本第一行后面添加一行内容为:#chkconfig: 2345 80 90
- EXEC改为/usr/bin/redis-server
- CLIEXEC改为/usr/bin/redis-cli
- CONF改为/application/redis/conf/6379.conf
- 更改Redis开启的命令,以后台运行的方式执行
$EXEC $CONF &
注册redis
chkconfig --add redis
vi /etc/profile
添加export PATH=$PATH:/application/redis/bin
source /etc/profile
启动redis
service redis start
配置
Redis的配置文件默认地址是:/usr/local/etc/redis.conf
在上面安装方案中将配置文件放入:/application/redis/conf/6379.conf
。
有两种方式修改Redis配置项:1. 直接修改配置文件。 2. 进入redis-cli,通过命令行修改redis配置项。
命令行
进入redis-cli命令行通过CONFIG GET key
获取配置项信息,通过CONFIG SET key value
设置配置项值。
1 | $ redis 127.0.0.1:6379> CONFIG GET loglevel # 获取日志等级 |
并不是所有的配置项都可以通过CONFIG GET/SET
配置,而且CONFIG GET/SET
配置方法并不会影响配置文件,如果你希望将修改的配置写入配置文件那就需要使用命令:CONFIG REWRITE
。
配置文件
基础配置
指定内存空间
如果你需要指定内存大小,可以通过下面的格式:
1 | # 1k => 1000 bytes |
内存单位是不区分大小写的,1GB 1Gb 1gB表示同一个大小空间。
后台运行 daemonize
默认情况下Redis不是后台运行的,如果需要在后台运行需要将
daemonize
设为yes
1 | daemonize yes |
pid
当Redis 开启后台运行,redis默认会把pid文件放在
/var/run/redis.pid
,你可以配置到其他地址。当运行多个redis 服务时,需要指定不同的pid文件和端口。指定接受主机IP bind
Redis 默认只接受本机的客户端连接
bind 127.0.0.1
。如果将它注释掉它将接受所有客户端请求。指定端口 port
Redis 默认端口是:6379。
port 6379
客户端连接时的超时时间 timeout
设置客户端最长的空闲时间,如果超过这个时间客户端没有操作服务端会自动断开该连接。
timeout 10
单位是秒。当设置为0时是表示关闭该功能。日志等级 loglevel
Redis 日志等级分为四个等级:debug(适合开发环境,客户端操作信息都会输出日志)、verbose、notice(适合生产环境)、warning(异常信息)。
配置log文件地址 logfile
Redis 默认日志输出地址是
stdout
表示终端输出,如果Redis是后台运行它默认日志输出地址是:/dev/null
。通过
logfile /var/log/redis/redis.log
你可以指定Redis 日志输出地址。设置数据库连接数 databases
Redis 默认连接数据库是0,可以通过
select <dbid>
指定连接的数据库,数据连接范围应该是:0 - databases
。databases 16
。同时连接的客户数 maxclients
设置同时连接客户端的数量:
maxclients 128
。当超过这个连接时,服务端会拒绝连接,客户端会接受到报错。
SLOW LOG
**超时连接日志记录 slowlog-log-slower-than **
设定最大的查询命令执行时间,当超过这个时间的命令会被记录日志中。
声明超时日志最大长度 slowlog-max-len
该命令不会限制日志大小,只是声明日志最大长度。
Snapshotting
save
将数据保存到磁盘中。格式:
save <seconds> <changes>
。在指定时间seconds内有changes次写操作,则将数据保存到磁盘上。
1
2
3save 900 1
save 300 10
save 60 10000dbfilename
定义保存到磁盘上文件名字:
dbfilename fileName
dir
数据保存在磁盘上的目录:
dir ./
APPEND ONLY MODE
Redis 默认是异步转存数据从内存到磁盘。在大多数时候这个模式没有问题,但在Redis进程挂掉或断电情况下会导致几分钟内写入数据的丢失。
Append only 提供了一种持久模式,Redis会在#appendonly.aof 文件中添加每一个写操作,这个文件会在Redis启动时被读取来在内存中重新构建数据集。
1 | appendonly on # 开启AOF模式 |
Key 键
Redis是极简的key-value模式的数据库。key是value在数据库中的唯一标识符,通过key你可以快速查找到对应的值。
Redis提供一些方法用于处理key:
1 | redis> SET name huangz # 设置一直key为name值为huangz数据 |
String 字符串
SET、SETEX、PSETEX
设置字符串值。格式:SET key value [EX seconds] [PX milliseconds] [NX|XX]
1 | redis 127.0.0.1:6379> SET key "value" |
EX second
:设置键的过期时间为second
秒。SET key value EX second
效果等同于SETEX key second value
。PX millisecond
:设置键的过期时间为millisecond
毫秒。SET key value PX millisecond
效果等同于PSETEX key millisecondvalue value
。NX
:只在键不存在时,才对键进行设置操作。SET key value NX
效果等同于SETNX key value
。XX
:只在键已经存在时,才对键进行设置操作。
MSET、MGET
同时设置多个key-value。MSET key value [key value …]
1 | redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny" |
MSETNX
同时设置一个或多个 key-value
对,当且仅当所有给定 key
都不存在。MSETNX key value [key value …]
。
1 | redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis" |
GETSET
将给定 key
的值设为 value
,并返回 key
的旧值(old value)。GETSET key value
1 | redis> GETSET db mongodb # 没有旧值,返回 nil |
APPEND
如果 key
已经存在并且是一个字符串, APPEND 命令将 value
追加到 key
原来的值的末尾。
如果 key
不存在, APPEND 就简单地将给定 key
设为 value
,就像执行 SET key value
一样。
APPEND key value
1 | # 对不存在的 key 执行 APPEND |
Hash 哈希表
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
HSET
HSET key field value
设置 key 指定的哈希集中指定字段的值。
1 | redis> HSET website google "www.g.cn" # 设置一个新域 |
HSETNX
HSETNX key field value
将哈希表 key
中的域 field
的值设置为 value
,当且仅当域 field
不存在。
若域 field
已经存在,该操作无效。
1 | redis> HSETNX nosql key-value-store redis |
HMSET
HMSET key field value [field value ...]
同时将多个 field-value
(域-值)对设置到哈希表 key
中。
1 | redis> HMSET website google 'www.google.com' yahoo 'www.yahoo.com' |
HMGET
HMGET key field [field ...]
返回哈希表 key
中,一个或多个给定域的值。List 列表
1 | redis> HMSET pet dog "doudou" cat "nounou" # 一次设置多个域 |
HKEYS
HKEYS key
返回哈希表 key
中的所有域。
1 | redis> HMSET website google www.google.com yahoo www.yahoo.com |
List(列表)
字符串列表管理方式。
LPUSH
LPUSH key value [value ...]
将一个或多个值 value
插入到列表 key
的表头。
如果有多个 value
值,那么各个 value
值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist
执行命令 LPUSH mylist a b c
,列表的值将是 c b a
,这等同于原子性地执行 LPUSH mylist a
、 LPUSH mylist b
和 LPUSH mylist c
三个命令。
1 | redis> LPUSH languages python |
RPUSH
RPUSH key value [value ...]
将一个或多个值 value
插入到列表 key
的表尾(最右边)。
如果有多个 value
值,那么各个 value
值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist
执行 RPUSH mylist a b c
,得出的结果列表为 a b c
,等同于执行命令 RPUSH mylist a
、 RPUSH mylist b
、 RPUSH mylist c
。
1 | # 添加多个元素 |
LINDEX
LINDEX key index
返回列表 key
中,下标为 index
的元素。
下标(index)参数 start
和 stop
都以 0
为底,也就是说,以 0
表示列表的第一个元素,以 1
表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1
表示列表的最后一个元素, -2
表示列表的倒数第二个元素,以此类推。
1 | redis> LPUSH mylist "World" |
LRANGE
LRANGE key start stop
返回列表 key
中指定区间内的元素,区间以偏移量 start
和 stop
指定。
下标(index)参数 start
和 stop
都以 0
为底,也就是说,以 0
表示列表的第一个元素,以 1
表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1
表示列表的最后一个元素, -2
表示列表的倒数第二个元素,以此类推。
1 | redis> RPUSH fp-language 'lisp' |
Set 集合
Set 就是一个集合,集合的概念就是一堆不重复值的组合。
SADD
SADD key member [member ...]
将一个或多个 member
元素加入到集合 key
当中,已经存在于集合的 member
元素将被忽略。
1 | # 添加单个元素 |
SMEMBERS
SMEMBERS key
返回集合 key
中的所有成员。
1 | # 非空集合 |
SCARD
SCARD key
返回集合 key
的基数(集合中元素的数量)。
1 | redis> SADD tool pc printer phone |
SDIFF
SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
1 | redis> SMEMBERS peter's_movies |
SINTER
SINTER key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的交集。
1 | redis> SMEMBERS group_1 |
SUNION
SUNION key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的并集。
1 | redis> SMEMBERS songs |
SortedSet 有序集合
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
ZADD
ZADD key score member [[score member] [score member] ...]
将一个或多个 member
元素及其 score
值加入到有序集 key
当中。
如果某个 member
已经是有序集的成员,那么更新这个 member
的 score
值,并通过重新插入这个 member
元素,来保证该 member
在正确的位置上。
score
值可以是整数值或双精度浮点数。
1 | # 添加单个元素 |
ZRANK
ZRANK key member
返回有序集 key
中成员 member
的排名。其中有序集成员按 score
值递增(从小到大)顺序排列。
1 | redis> ZRANGE salary 0 -1 WITHSCORES # 显示所有成员及其 score 值 |
ZRANGE
ZRANGE key start stop [WITHSCORES]
返回有序集 key
中,指定区间内的成员。
其中成员的位置按 score
值递增(从小到大)来排序。
1 | redis > ZRANGE salary 0 -1 WITHSCORES # 显示整个有序集成员 |
ZCARD
ZCARD key
返回有序集 key
的基数。
1 | redis > ZADD salary 2000 tom # 添加一个成员 |
ZCOUNT
ZCOUNT key min max
返回有序集 key
中, score
值在 min
和 max
之间(默认包括 score
值等于 min
或 max
)的成员的数量。
1 | redis> ZRANGE salary 0 -1 WITHSCORES # 测试数据 |
ZREM
ZREM key member [member ...]
移除有序集 key
中的一个或多个成员,不存在的成员将被忽略。
1 | # 测试数据 |
ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop
移除有序集 key
中,指定排名(rank)区间内的所有成员。
1 | redis> ZADD salary 2000 jack |
ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max
移除有序集 key
中,所有 score
值介于 min
和 max
之间(包括等于 min
或 max
)的成员。
1 | redis> ZRANGE salary 0 -1 WITHSCORES # 显示有序集内所有成员及其 score 值 |
HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
PFADD
PFADD key element [element ...]
将任意数量的元素添加到指定的 HyperLogLog 里面。
返回值:
整数回复: 如果 HyperLogLog 的内部储存被修改了, 那么返回 1 , 否则返回 0 。
1 | redis> PFADD databases "Redis" "MongoDB" "MySQL" |
PFCOUNT
PFCOUNT key [key ...]
当 PFCOUNT 命令作用于单个键时, 返回储存在给定键的 HyperLogLog 的近似基数, 如果键不存在, 那么返回 0
。
当 PFCOUNT 命令作用于多个键时, 返回所有给定 HyperLogLog 的并集的近似基数, 这个近似基数是通过将所有给定 HyperLogLog 合并至一个临时 HyperLogLog 来计算得出的。
1 | redis> PFADD databases "Redis" "MongoDB" "MySQL" |
PFMERGE
PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并(merge)为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集。
1 | redis> PFADD nosql "Redis" "MongoDB" "Memcached" |
GEO 地理位置
Redis >= 3.2.0 版后添加的用于保存经纬度的数据结构。
GEOADD
GEOADD key longitude latitude member [longitude latitude member ...]
将给定的空间元素(纬度、经度、名字)添加到指定的键里面。 这些数据会以有序集合的形式被储存在键里面, 从而使得像 GEORADIUS
和 GEORADIUSBYMEMBER
这样的命令可以在之后通过位置查询取得这些元素。
GEOADD
命令以标准的 x,y
格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。
1 | redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" |
GEOPOS
GEOPOS key member [member ...]
从键里面返回所有给定位置元素的位置(经度和纬度)。
因为 GEOPOS
命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。
1 | redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" |
GEODIST
GEODIST key member1 member2 [unit]
返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit
必须是以下单位的其中一个:
m
表示单位为米。km
表示单位为千米。mi
表示单位为英里。ft
表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST
默认使用米作为单位。
1 | redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" |
GEORADIUS
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:
m
表示单位为米。km
表示单位为千米。mi
表示单位为英里。ft
表示单位为英尺。
在给定以下可选项时, 命令会返回额外的信息:
WITHDIST
: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。WITHCOORD
: 将位置元素的经度和维度也一并返回。WITHHASH
: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
ASC
: 根据中心的位置, 按照从近到远的方式返回位置元素。DESC
: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS
命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count>
选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT
选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT
选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
返回值:
GEORADIUS
命令返回一个数组, 具体来说:在没有给定任何WITH
选项的情况下, 命令只会返回一个像["New York","Milan","Paris"]
这样的线性(linear)列表。在指定了WITHCOORD
、WITHDIST
、WITHHASH
等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。geohash 整数。由两个元素组成的坐标,分别为经度和纬度。
举个例子,
GEORADIUS Sicily 15 37 200 km withcoord withdist
这样的命令返回的每个子数组都是类似以下格式的:["Palermo","190.4424",["13.361389338970184","38.115556395496299"]]
1 | redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" |
GEORADIUSBYMEMBER
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
这个命令和 GEORADIUS
命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER
的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS
那样, 使用输入的经度和纬度来决定中心点。
1 | redis> GEOADD Sicily 13.583333 37.316667 "Agrigento" |
GEOHASH
GEOHASH key member [member ...]
返回一个或多个位置元素的 Geohash 表示。
1 | redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" |
作者: Fynn
链接: https://fynn90.github.io/2018/05/17/Redis%E5%85%A5%E9%97%A8%E6%89%8B%E5%86%8C/
本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可