1、什么是redis
目前数据库产品主要分下面两类:
uRDBMS: Oracle , Mysql
uNosql
* KVRAM存储:Redis,MemcacheDB
* 图形存储: Neo4j
* 列式存储: Hbase,Cassandra
* 文档存储: MongDB
Redis: key-value形式的NoSQL服务
2、redis特点及优势
Redis:使用很大内存,提供快速读写。
优势:
1. 高性能的key-value存储系统,数据存储在内存
2. Master-slave主从同步,数据持久化
3. 支持多种数据类型 (String ,Hash ,List ,Set ,Zset)
4. 支持事务
5. 支持消息的订阅和发布机制
3、Redis安装
Redis的安装简单,部署轻量级
Linux平台
$wget http://download.redis.io/releases/redis-2.8.3.tar.gz
$ tar xzfredis-2.8.3.tar.gz
$ cdredis-2.8.3
$ make
Windows平台
官网不支持windows平台,但是可以在下面网站下载
https://github.com/MSOpenTech/redis下载,版本为2.6
redis-2.6.zip
4、Redis启停
Linux启动:
$redis-server $REDIS_DATA/conf/redis.conf
Windows启动:
$redis-server –-console
Windows && Linux停止:
$redis-cli –p port –a passwd shutdown
5、Redis常用命令
uredis-benchmark -- Redis性能测试工具
uredis-check-aof -- Redis aof日志检查工具
uredis-check-dump – Redis rdb文件检查工具
uredis-cli-- Redis命令行操作工具
uredis-server-- Redis服务器的daemon启动程序
6、Redis客户端
Redis的客户端很丰富,几乎所有流行的语言都有其客户端
uJava-- Jedis
uC --credis/hiredis/libredis
uNode.js -- node_redis
uPerl -- Redis
uPHP -- Predis /phpredis
uPython -- redis-py
uRuby -- redis-rb
7、 Redis数据类型
(1)String
* String是最常用的一种数据类型,普通的key/ value存储都可以归为此类
* 由于string型的value支持按位操作(getbit,setbit,bitop,bitcount),可以用来实现一个bitmap
* 原子操作用来实现全局计数器(incr),避免业务自己实现加锁等功能
* 条件操作:set nx|xx是实现全局互斥,信号量之类的利器
String 常用命令:set,get,strlen,mset,mget,del,keys,substr,incr key,incrby key value,decr key,decrby key value,append key value
(2) Hash
* 简单的用hash分割命名空间,防止key冲突,这种情况下和string的使用场景基本一样(除了不再原生支持位运算)
* 一个hash表(key)表示一个业务对象,hash field对应字段,非常简单直白,比如我们要存储一个用户信息对象数据,包含以下信息:用户ID为查找的key,存储的value用户对象包含姓名,年龄,性别等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式
Hash常用命令:hkeys,hset,hget,hvals,hgetall,hdel,hmget,hmset
(3) List
* 业务中有先后顺序的所有列表都可以用List很好的表示
* 先进后出的队列+阻塞读操作,可以很方便实现 “生产者,消费者”这类问题,通常用于解耦应用程序的不同模块
* 单向队列,双向队列,循环队列,各种队列
List 常用命令:Lpush,Llen,Lpop,Lrange key 0 -1,linsert key before "xx" "yy"
(4) Set
* 当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择
* set提供了判断某个成员是否在一个set集合内
* 可以存储一些集合性的数据,比如在天下通应用中,可以将一个用户所有的好友存在一个集合中,可以非常方便的实现如共同关注、共同喜好等
需要随机操作的场合:
Ø抽奖
Ø推荐系统(随机补足几条数据同时避免重复)
Set 常用命令:sadd,smembers,srem(删除),sunion key1,key2(合并),scard(元素基数),sismember key value(是否成员)
(5) Zset
* 优先级队列(优先级作为score)
* 中小量数据快速在线排序
* TopN,热榜,头条 等类似业务功能的实现
Zset常用命令:zadd key score member,zcard(个数),zrem key member (删除member)
zrange key 0 -1 withscore,zcount key min max (score 在min和max之间的个数)
zrank key member (member的排序:从小到大,排序从0开始)
zrevrange key 0 -1 [withscore] :与zrange相反,从大到小
8、Redis开发注意事项
(1)选择合适的数据结构
(2)合理的设定key的过期时间
(3)合理规划key的命名规则
9、Redis扩展
(1)纵向扩展:
* 若当前实例的内存可以满足实例的需要:在线修改实例的配置文件中的maxmemory,无需停应用
* 若当前实例的内存不能再分配 : 那就需要将实例迁移到新的机器上
Steps
1.手动在管理平台增加新的实例配置信息
2.启动OSAgent
3.发起新实例跟旧实例的同步
4.待全部复制完成,更新Diamond的配置
5.应用配置获取新配置
(2)横线扩展
Steps
1.手动修改HIDBA中的应用对应实例配置信息
2.启动OSAgent
3.将A,B符合分片算法的数据复制到C
4.待全部复制完成,更新Diamond的配置
5.应用获取新的配置
6.删除A,B不需要的数据
10、Redis持久化
Redis的持久化方式有两种
* RDB
Ø 将内存快照按照二进制格式存放
Ø 可以在指定的时间间隔内生成数据集的时间点快照
* AOF:
Ø将执行命令按照字符串格式存放
Ø记录服务器执行的所有写操作命令
Ø在服务器启动时,通过重新执行这些命令来还原数据集
实例灾难恢复的时候,先加载RDB,然后解析AOF文件,应用增量数据
11、Redis主从复制
(1)Redis是通过slaveof命令来操作
Ø1.连接到从库上
Ø2.发起slaveof ip port 命令(ip和port为主库的ip和port)
Ø3.若主库设置的密码,需要在从库上设置认证密码
(2)Redis的主从复制策略是通过RDB的持久化来实现
(4)断开主从复制的命令
Ø1.连接到从库上
Ø2.发起slaveof no one
12、Redis 平台服务模式
(1)redis 单实例(主) ----适用场景:缓存
(2)redis 一主一备 -----适用场景:数据持久化,能恢复数据
(3)redis 一主多从 -----适用场景:读量很大的缓存
(4)redis 一主多从一备 -----适用场景:读量很大,可靠性要求很高
13、Redis高可用性方案
(1)使用keepalived做高可用
* 实现原理:
Ø正常情况下VIP连接在Master
Ø当Master发生故障时,VIP漂移到Slave上同时Slave变为Master
Ø当Master实例启动时,VIP任然在原slave上,此时需要手动从原slave同步数据
Ø待数据同步完成,重启原slave,此时VIP漂移到Master上
* 使用场景:
适用于一主一备(备不提供服务),数据会丢失
* 特点:
优点:使用VIP,主备实例切换对业务透明
缺点:同一个网段使用不同的虚拟的路由ID,范围
(2)平台的高可用
故障恢复步骤:
1.Osagent 启动原主库
2.发起主从复制,数据一致时
3.并通知Diamond修改配置
4.APP获取最新配置
5.应用数据写本地缓存
6.断开主从复制,反向同步
优点:
不使用vip
自动切换,无需人工干越
缺点:
若开启本地缓存,会有出现脏读,若不开启本地缓存,应用端写会报错
使用于弱一致性的应用