Redis初步教程
安装
下载、安装
下载: 官网地址
tar zxvf redis-xxxx.tar.gz
ln -s redis-xxxx redis # 建立版本号无关的软链接
cd redis
make
make install
默认安装到/usr/local/bin目录下
可执行文件如下:
| 可执行文件 | 作用 |
|---|---|
| redis-server | 启动redis |
| redis-cli | redis命令行客户端 |
| redis-benchmark | redis基准测试工具 |
| redis-check-aof | redis AOF持久化文件检测和修复工具 |
| redis-check-dump | redis RDB持久化文件先检测和修复工具 |
| redis-sentinel | 启动redis sentinel |
启动服务端
三种方式启动:
默认配置:
redis-server运行启动:加上要修改的配置键值对,没设置的使用默认设置
redis-server --configKey1 configValue1 --configKey2 configValue2配置文件启动:例如放到/opt/redis/redis.conf中
redis-server /opt/redis/redis.conf
redis有60多个配置,基本配置项如下:
| 配置名 | 配置说明 |
|---|---|
| port | 端口 |
| logfile | 日志文件 |
| dir | redis工作目录(存放持久化文件和日志文件) |
| daemonize | 是否以守护进程的方式启动redis |
配置文件以redis.conf为模板进行修改
启动客户端
进入交互式命令行
redis-cli -h{host} -p{port}
直接获取命令结果
redis-cli -h{host} -p{port} {command}
host默认127.0.0.1, port默认6379
停止服务
redis-cli shutdown [nosave|save]
nosave/save表示是否生产持久化文件
API入门
常用命令
| 命令 | 说明 |
|---|---|
| keys * | 查看所有键 |
| dbsize | 键总数 |
| rpush val1 val2… | 插入list |
| exists key | 键是否存在,存在返回1,否则0 |
| del key [key…] | 删除key,返回成功删除的key个数 |
| expire key seconds | 键过期秒数 |
| ttl key | 返回key剩余过期时间>0, -1 无过期, -2 不存在 |
| type | 键类型,不存在返回none |
数据结构
5种对外数据结构
| 类型 | 说明 | 内部编码 |
|---|---|---|
| string | 字符串 | raw, int, embstr |
| hash | 哈希 | hashtable, ziplist |
| list | 列表 | linkedlist, ziplist, quicklist |
| set | 集合 | hashtable, intset |
| zset | 有续集和 | skiplist, ziplist |
查看内部编码实现:
object encoding key
为什么快
- 纯内存访问
- 非阻塞I/O:使用epoll作为I/O多路复用
- 单线程:避免线程切换和竞态消耗
单线程的问题:对每个命令执行时间有要求,如果某个命令执行过长,会阻塞其他命令
redis是面向快速执行场景的数据库
数据结构详解
string
最大不超过512MB
命令
设置
set key value [ex seconds] [px milliseconds] [nx|xx]
ex, px分别用于设置秒级和毫秒级过期时间
nx key不存在才能设置(用于添加), xx key存在才能设置(用于更新)
setex key seconds value
setnx key value 可用作分布式锁 参见 http://redis.io/topics/distlock获取:不存在返回nil
get key
批量
mset key value [key value …]
mget key [key …]
计数
incr key 自增,不是整数返回错误
decr
incrby
decrby
incrbyfloat
不常用
append key value 字符串末尾追加
strlen key
getset key value 设置并返回旧值
setrange key offset value 设置指定位置的值
get range key start end
内部编码
int: 8字节长整型embstr: <= 39 byte 字符串raw: > 39 byte 字符串
典型应用场景
- 缓存
- 计数
- 共享session
- 限速
hash
value本身又是键值对结构:field-value
命令
设置
hset key field value 成功返回1,否则0
hsetnx key field value 类比setnx,不存在才能设置
获取
hget key field 不存在返回nil
hkeys key 获取所有field
hvals key 获取所有value
hgetall key 获取所有的field-value,元素过多可能会组设redis,使用hmget或者hscan
删除
hdel key field [field …] 删除一个或多个field,返回成功个数
计算field个数
hlen key
批量
hmget key field [field …]
hmset key field value [field value …]
判断field存在
hexists key field 存在返回1,否在返回0
计数
hincrby key field
hincrbyfloat key field
计算value字符串长度
hstrlen key field
内部编码
ziplist: 压缩列表,hash元素个数小于hash-max-ziplist-entries(默认512个)、同时所有值都小于hash-max-ziplist-value(默认64 byte)时使用,更加紧凑实现多个元素连续存储,比hashtable省内存hashtable: 不满足ziplist条件则使用hashtable,其读写时间复杂度为 O(1) O ( 1 )
list
用来存储多个有序字符串,一个列表最多存储 232−1 2 32 − 1 个元素
操作类型
| 操作类型 | 操作 |
|---|---|
| 增 | rpush, lpush, linsert |
| 删 | lpop, rpop, lrem, ltrim |
| 改 | lset |
| 查 | lrange, lindex, llen |
| 阻塞 | blpop, brpop |
1. 添加
> rpush key value \[value ...\] 右插入
>
> lpush key value \[value ...\] 左插入
>
> linsert key before | after pivot value 向某个元素前或后插入
查找
lrange key start end 获取指定范围内的元素列表,从左到右0到N-1,反之-1到-N
lrange listkey 0 -1从左到右获取所有元素
lindex key index 获取指定索引下标的元素
llen key 获取列表长度
删除
lpop key 左侧弹出
rpop key 右侧弹出
lrem key count value 删除指定元素,count>0从左到右最多count个,<0从从右到左,=0删所有
ltrim key start end 按索引范围修剪列表,保留范围内的
修改
lset key index newValue 修改指定下标元素
阻塞弹出, 阻塞到列表有数据返回,或者超时返回,timeout为0则一直阻塞
blpop key [key …] timeout
brpop key [key …] timeout
如果是多个key,则从左至右遍历key,某个key可返回就返回
内部编码
ziplist: 当列表元素个数小于list-max-ziplist-entries(默认512个),同时每个元素值小于list-max-ziplist-value(默认64 byte)时,使用ziplist为list内部实现,减少内存使用linkedlist: 无法满足ziplist条件时,使用linkedlist为内部实现quicklist: v3.2提供,结合了ziplist 和 linkedlist的优势
使用场景
- 消息队列:一个lpush多个brpop
文章列表
- lpush+lpop = Stack(栈)
- lpush+rpop = Queue(队列)
- plush+ltrim = Capped Collection(有限集合)
- lpush+brpop = Message Queue(消息队列)
set
set用于保存多个不重复的字符串元素,元素无序,最多 232−1 2 32 − 1 个元素
支持增删改查以及交并差集
集合内操作:
添加
sadd key element [element …] 返回成功添加个数
删除
srem key element [element …] 返回成功删除个数
个数
scard key
判断存在
sismember key element 存在返回1,否则返回0
随机返回指定个数
srandmember key [count] 默认返回一个,不会删除
随机弹出
spop key [count] 3.2开始支持count参数,会删除
取所有元素
smembers key 元素过多可能阻塞,使用sscan
集合间操作
求交集
sinter key [key …]
求并集
sunion key [key …]
求差集
sdiff key [key …]
保存交并差的结果
sinterstore destination key [key …]
sunionstore destination key [key …]
sdiffstore destination key [key …]
内部编码
intset: 整数集合,集合中元素都是整数且元素个数小于set-max-intset-entries(默认512)时,使用intset作为内部实现,减少内存使用hashtable: 哈希表,无法满足intset条件时,使用hashtable
使用场景
tag:获取共同喜好
- sadd=Tagging(标签)
- spop/srandmember=Random item(生成随机数,比如抽奖)
- sadd+sinter=Social Graph(社交需求)
zset
zset中的元素不能重复但是可以排序,使用score排序
集合内
添加成员
zadd key [nx|xx] [ch] [incr] score member [score member …] 返回成功添加个数
nx xx 同前面,分别用于添加和更新,ch返回元素和分数变化个数,incr对score做增加
计算个数
zcard key
计算分数
zscore key member
计算排名
zrank key member 从低到高
zrevrank key member 从高到低
删除
zrem key member [member …]
增加分数
zincrby key increment member
返回指定排名范围成员
zrange key start end [withscores]
zrevrange key start end [withscores]
返回指定分数范围成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key min max [withscores] [limit offset count]
返回指定分数范围成员个数
zcount key min max
删除指定排名内的升序元素
zremrangebyrank key start end
删除指定分数范围的成员
zremrangebyscore key min max
集合间
交集
zinterstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum | min | max]
并集
zunionstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum | min | max]
内部编码
ziplist: 元素个数小于zset-max-ziplist-entries(默认128),同时每个元素值小于zset-max-ziplist-value(默认64 byte)时,使用ziplist减少内存使用skiplist: 不满足ziplist条件时,使用skiplist
使用场景
排行榜系统
键管理
重命名
rename key newkey rename前已存在则值会被覆盖
renamenx key newkey 只有newkey不存在时才能成功
重命名会执行del,如果value比较大可能会阻塞redis
随机返回key
randomkey
键过期
expire key seconds
ttl key
expireat key timestamp 键在秒级时间戳timestamp后过期
pexpire key milliseconds
pexpireat key milliseconds-timestamp
pttl key 查看毫秒级的过期时间
persist key 清除过期时间
key不存在返回0,过期为负值立即删除,persist将过期时间清除
对字符串类型key,执行set会去掉过期时间
redis不支持二级数据结构内部元素的过期功能
setex作为set+expire组合,为原子执行,且减少了一次网络通讯
键迁移
move key db
redis内部数据迁移,redis内部可以有多个数据库(不建议生产环境使用)
dump key
restore key ttl value
在不同 redis间进行数据迁移,由客户端分步完成,非原子性
migrate host port key|”” destination-db timeout [copy] [replace] [keys key [key …]]
不同redis间迁移,组合dump, restore, del,具有原子性,数据在两个redis上传输
遍历键
keys pattern 全量遍历
通配符: * ? []
scan cursor [match pattern] [count number] 渐进式遍历
对应 hash, set ,zset的 hgetall, smembers, zrange分别为hscan, sscan, zscan
scan的过程中键有变化可能会有为
数据库管理
切换数据库
select dbIndex 默认配置16个数据库databases 16
redis 3.0逐渐弱化该功能,redis-cluster只允许使用0号数据库
清除数据库
flushdb 清除当前数据库
flushall 清除所有数据库
2897

被折叠的 条评论
为什么被折叠?



