Redis入门指南--读书笔记
Contents
版本规则
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>