版本规则

x.y.z

X: 大版本号 Y: 如果是偶数, 则是稳定版; 否则为不稳定版 Z: 修补号

安装(Linux)

最新稳定版:

wget http://download.redis.io/redis-stable.tar.gz

编译及安装到指定目录(默认情况下,它会安装到 /usr/local/bin 目录下).

make
make PREFIX=/some/other/directory install

启动和停止Redis

Redis中的可用命令行工具及说明

名称 说明
redis-server Redis服务器
redis-cli Redis命令行客户端
redis-benchmark Redis 性能测试工具
redis-check-aof AOF 文件修复工具
redis-check-dump RDB 文件检测工具
redis-sentinel Sentinel 服务器 (2.8之后)

开发环境中启动

直接运行 redis-server, 默认情况下会以6379的端口来启动. 也可以通过--port N来指定端口.

1) redis-server --port 6379

指定某个配置文件来指定

redis-server /path/to/config.file

Redis 源码目录里, 有一个名为redis.conf的文件, 它是配置文件的模板.

通过脚本来初始化

在Redis源码的utils文件夹下, 有一个名为 redis_init_script的初始化脚本文件.

然后按需修改相应的文件配置.

参数名       值       说明
daemonize   yes		以守护进程模式运行
pidfile     /var/run/redis_端口号.pid  PID文件位置
port        端口号
dir         /var/redis/端口号   设置持久化文件存放位置
databases    数字       支持的数据数量(0~N-1)

停止redis

redis-cli SHUTDOWN

Redis 命令行客户端

redis-clie -h 127.0.0.1 -p 6379

多数据库

这不是像真正的多个实例的数据库, 而是类似不同的命名空间的数据库.而且只能以数字来进行选择(0~N-1)

Redis 的 glob pattern 风格

字符 说明
? 匹配一个字符
* 匹配任意个(包括0个)字符
[] 匹配括号间的任一个字符.可以用-表示区间.
\x 匹配字符x,如:要匹配?,就需要用 \?

KEYS pattern

注意, KEYS 命令需要遍历Redis中的所有键, 当键的数量较多时会影响性能. 所以不建议在生产环境中使用.

Redis不区分命令的大小写.

Redis 常见命令

KEYS pattern

获取符合规则的键名列表

EXISTS key

判断是否存在某个键. 返回1则存在, 0则不存在.

DEL key [key2…]

删除一个或多个键

删除多个符合规则的键

redis-clie -h 127.0.0.1 -p 6379 -n 0 KEYS "user:*" | xargs redis-cli -h 127.0.0.1 -p 6379 -n 0 DEL

或者

redis-cli -h 127.0.0.1 -p 6379 -n 0 DEL `redis-cli -h 127.0.0.1 -p 6379 -n 0 KYES "user:*"`

TYPE key

获取键值的类型.返回值可能是: string, hash, list, set, zset.

Redis 数据类型

字符串, String

它可以存储任何形式的字符串, 包括二进制数据. 你可以用其存储用户的邮箱, JSON化的对象,甚至是一张图片.

一个字符串类型键,允许存储的数据的最大容量是 512MB

字符串类型,是其他数据类型的基础.从某种角度来说, 它们只是组织字符串的形式不同.

设置值
SET key value

获取值
GET key

递增数字.

如果存储的字符串是整数形式时, Redis提供了一个实用的命令 INCR.

自增ID

可以通过 INCR 命令建立的键初始化为1.(设置起始值为0,然后获取其自增ID时, 它会自动加1.这样子就可以实现自增ID了)

列表, List

# 如果index为负数, 则从右边开始,最右边的为-1.但最左边是从0开始的.
LINDEX key index


LSET key index value

# 只保留指定片段.结合 LPUSH,可以限制列表的大小.每次调用LPUSH后, 再调用下面的命令即可.
LTRIM key start end

# 从左到右查找值为 pivot 的元素,然后根据第二个参数 BEFORE 还是 AFTER 来决定将value放到pivot的前面还是后面.
LINSERT key BEFORE | AFTER pivot value

# 将元素从一个列表转到另一个列表
RPOPLPUSH source destination

集合, Set

SADD key member [member ...]

SREM key member [member ...]

# 获取集合中的所有元素
SMEMBERS key

# 获取集合中元素个数
SCARD key

# 判断元素是否存在集合中
SISMEMBER key member

# 集合间的运行
SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]

# 进行集合运算,并将结果存储
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]

# 随机获取集合中的元素
SRANDMEMBER key [count]

count>0, 则取出cont个不重复的元素
count<0, 则取出|count|个元素,但有可能重复

有序集合, Zset

ZADD key score member [score member ...]

ZSCORE key member

# 按score, 从小到大返回
ZRANGE key start stop [WITHSCORES]

# 按score, 从大到小返回
ZREVRANGE key start stop [WITHSCORES]

Redis中的事务

在 redis-cli 中执行

multi

cmd1
cmd2

exec

过期时间

EXPIRE key seconds
PEXPIRE key millis

#查看还有多久过期,当键不存在时返回-2.(如果没有设置过期时间,则永不过期, 这时返回的是 -1).
TTL key

#取消过期时间,让它成为永久的
PERSIST key

用Redis实现队列

伪代码

loop
$task = BRPOP queue, 0
execute($task[1])

BRPOP命令接受两个参数, 第一个是键名, 第二个是超时时间,单位是秒.如果为0,则不限制等待时间.即如果没有元素,会一直阻塞下去.

它返回两个值.第一个是键名, 第二个是元素值.

用Redis实现优先级队列

因为 BRPOP 命令可以同时接受多个键, 其完整的命令格式为:

BRPOP key [key...] timout

如果所有键都没有元素,则阻塞.如果其中一个键有元素,则会从该键中弹出. 如果多个键都有元素,则按照从左到右的顺序取第一个键中的一个元素.

用Redis实现”发布/订阅”模式

发布者

它使用PUBLISH命令, PUBLISH channel message, 发布一条消息. 注意,发出去的消息,不会被持久化. 所以,后续的订阅者只能接收后续发布的消息,之前的是接收不到的.

订阅者

它使用SUBSCRIBE命令,可以同时订阅多个频道,用法是:SUBSCRIBE channel1 [channel2 ...]

按规则订阅

PSUBSCRIBE ,它支持glob风格通配符格式. 这与上面的两个是独立的. 即可能会重复匹配消息(如果执行这条,之前又执行了上面的,并且这条的匹配规则也匹配了上面的订阅的channel,不过这时返回的消息类型是不同的,不过消息是一样的)

复制

master:
redis-server

slave:
redis-server ---port 6380 --slaveof 127.0.0.1 6379

这样, 6380(slave)端口的redis,就会同步6379(master)的redis了.默认情况下slave是只读的.

redis中转义

默认情况下,redis会将中文进行转义然后再输出,例如:

127.0.0.1:6379> get fffffffhello-by-test
"\xe6\x88\x91\xe4\xba\x86\xe4\xb8\xaa\xe5\x8e\xbb"

想让它输出原始数据,可以如下:

uniweibo@uniweibo40:~$ ~/redis/redis-2.8.17/src/redis-cli  -p 6379 --raw
127.0.0.1:6379> get fffffffhello-by-test
我了个去
127.0.0.1:6379>