http://jiaqing.me
2012-05-21
Another Introduce to Redis
初识Redis
实践Redis
优化Redis
2
大纲
3
Part 1
初识Redis
4
介绍
官方定义:
Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.
5
介绍
官方定义:
Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.
主要卖点:
Key-value 内存级 高性能 复杂数据结构
6
相同点:
• 都基于内存,性能都足够高
Redis vs Memcached
7
Redis vs Memcached
相同点:
• 都基于内存,性能都足够高
不同点:
• Redis支持复杂类型
• Redis支持主从复制
• Redis支持数据持久化
• Redis支持虚拟内存
• Redis只使用单核
• Redis自身暂不支持sharding
8
数据类型
key:
• String类型
• 非二进制安全: “my name” Error “myname\n” Error
• 约定俗成的命名: object-type:id:field 比如 user:1000:password
9
数据类型
value:
• String: 二进制安全, 最大1G
• List :String类型的双向链表
• Set :String类型的无序集合,可取交集、并集、差集
• SortSet :可排序的Set, 可指定score, 区间操作
• Hash:String类型的k-v映射
10
eg.list
LPUSH mylist a # now the list is “a”
LPUSH mylist b # now the list is “b”, “a”
RPUSH mylist c # now the list is “b”, “a”, “c”
11
eg.hash
动手尝试 http://try.redis-db.com/
命令手册 http://redis.io/commands
中文参考 http://redis.readthedocs.org/en/latest/
12
事务
支持连接级别的简单事务
• multi :启动事务
• exec:提交事务
• discard:放弃事务
redis> multiOKredis> incr aQUEUEDredis> incr bQUEUEDredis> exec1. (integer) 12. (integer) 1
13
持久化
Snapshotting(默认):
• 将内存数据写入二进制文件
• 可配置N秒执行一次
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000 #...• 宕机时丢失最后一次快照
14
持久化
AOF(append-only file):
• 每次写请求写入文件
• 自定义写入的时机
appendfsync always #每次收到写命令就立即强制写入磁盘
appendfsync everysec #每秒钟强制写入磁盘一次
appendfsync no #完全依赖OS,性能最好,持久化没保证
15
主从复制
• Master可带多个Slave
• 初次同步数据,Master不阻塞,Slave阻塞
16
虚拟内存
• 突破单机内存限制
• 只会将value放入swap
• 不推荐使用
17
Redis客户端
CC++C#JavaLuaNode.jsPerlGoRubyPHP…查看全部 http://redis.io/clients
18
Part 2
实践Redis
19
简单的微博
• 个人信息
• 关注列表
• 粉丝列表
• 推送信息
20
个人信息
• 用户唯一标识(ID)
• 录入个人相关信息
SET global:newUserId 0…INCR global:nextUserId => 1000SET uid:1000:username asukaSET uid:1000:password *****SET uid:1000:url /asukaSET uid:1000:xxx xxxxxxxxx…
21
关注/粉丝
• 添加关注
• 添加粉丝
• 统计粉丝数
• 获取关注列表
• 共同关注
# 添加关注
SADD uid:1000:following 1001SADD uid:1000:following 1002SADD uid:1000:following 1003…# 添加粉丝
SADD uid:1000:followers 0001SADD uid:1000:followers 0002SADD uid:1000:followers 0003…#获取关注列表
SMEMBERS uid:1000:following=>1002,1003,1001#统计多少粉丝
SCARD uid:1000:followers=>3#共同关注
SINTER uid:1000:following uid:1001:following…
22
推送消息
• 发送消息
• 接收消息
# 发送消息
SET postid:900001 我的第一条微博
RPUSH uid:1000:posts 900001
# 接收消息RPUSH uid:1001:receive 900001
# 翻页查看
LRANGE uid:1001:receive 0 9=>900001,893201,939922,…..
23
Part 3
优化Redis
24
避免使用VM
• 频繁swap性能差
• 官方版本准备去除该功能
25
合理利用CPU
• 单线程的优势
• 单机多实例 : 实例数 = CPU - 1
26
重视容量规划
• 合理预估内存/带宽
• 实时监控同样重要
27
Part 4
参考资料http://redis.io/
http://blog.nosqlfan.com
http://www.slideshare.net/search/slideshow?searchfrom=header&q=redis
28
http://jiaqing.me
2012-05-21
Another Introduce to Redis
-END-