中文资料:
中文参考document: http://www.redisdoc.com/en/latest/
一、 mysql---->redis数据迁移
参照: http://blog.csdn.net/dba_waterbin/article/details/8996872
1.导入user简单数据
原理:是用mysql导出redis可以识别的命令 zadd user:1:following score targertId,逐行执行批量pipe导入
其中redis有自己的协议,可参照: http://redis.cn/topics/protocol.html 组合
中文参考document: http://www.redisdoc.com/en/latest/
一、 mysql---->redis数据迁移
参照: http://blog.csdn.net/dba_waterbin/article/details/8996872
1.导入user简单数据
原理:是用mysql导出redis可以识别的命令 zadd user:1:following score targertId,逐行执行批量pipe导入
其中redis有自己的协议,可参照: http://redis.cn/topics/protocol.html 组合
1) 编写数据库脚本mysql_to_redis.sql
SELECT CONCAT(
"*4\r\n",
'$', LENGTH(redis_cmd), '\r\n',
redis_cmd, '\r\n',
'$', LENGTH(redis_key), '\r\n',
redis_key, '\r\n',
'$', LENGTH(hkey), '\r\n',
hkey, '\r\n',
'$', LENGTH(hval), '\r\n',
hval, '\r'
)
FROM (
SELECT
'HSET' AS redis_cmd,
'users' AS redis_key,
id AS hkey,
score AS hval
FROM shard_ddy_global.users
) AS t
2)将mysql_to_redis.sql放入到linux系统,在mysql_to_redis.sql的目录下执行命令:
mysql -uroot -pTV.xian shard_ddy_global --skip-column-names --raw < mysql_to_redis.sql | redis-cli --pipe
利用pipe批量命令将导出的数据导入到redis,150w,2列数据话费5秒左右,占用内存94M
3) hget users 1 查询对象users 中 key 为1的值
2. 导入关系数据
SELECT CONCAT(
"*4\r\n",
'$', LENGTH(redis_cmd), '\r\n',
redis_cmd, '\r\n',
'$', LENGTH(redis_key), '\r\n',
redis_key, '\r\n',
'$', LENGTH(score), '\r\n',
score, '\r\n',
'$', LENGTH(hval), '\r\n',
hval, '\r'
)
FROM (
SELECT
'zadd' AS redis_cmd,
CONCAT('user:',source_id,':following') AS redis_key,
id AS score,
target_id AS hval
FROM share_ddy_userRelation.user_relations
WHERE relation IN (1,3)
) AS t
执行命令:
mysql -uroot -pTV.xian shard_ddy_global --skip-column-names --raw < mysql_to_redis.sql | redis-cli --pipe
一共700w数据导入时间1.37分钟, 关注关系1380w条数据,占用884M内存,导入时间2.41分钟
二、实践经验
1. info命令的意义:
http://redis.readthedocs.org/en/latest/server/info.html
2. 主从配置 参考:http://blog.csdn.net/vboy1010/article/details/7741505
1)复制一份redis.conf,修改里边的启动端口及其aof备份文件名字,另外slaveOf写上主服务的地址 及其端口,启动的时候,nohup redis-server ...../redis6380.conf & 启动这个端口实例
2. 主从配置 参考:http://blog.csdn.net/vboy1010/article/details/7741505
1)复制一份redis.conf,修改里边的启动端口及其aof备份文件名字,另外slaveOf写上主服务的地址 及其端口,启动的时候,nohup redis-server ...../redis6380.conf & 启动这个端口实例
2)redis-cli -p 6380 链接个端口的redis服务
3.conf中databases为一个redis实例中包含的独立数据库,默认为16个,select 可以切换数据库
三、最佳实践:
1)新浪微博:1 单机多实例,2 客户端使用一致性hash将数据分片,3 关闭bgsave和aofrewrite,并重写aof使其可自动切割,4 zookeeper维护集群分片信息,5 通过控制路由策略做到在线扩容/减容。
2)Pinterest 使用 Redis 来保存七千万用户的关注图谱(follower graph):
http://t.cn/zRvhc68 经验:1)主从配置,使用从服务器做主服务器的热备份 2)使用 ZooKeeper 来对主服务器做故障转移 3)AOF 每秒保存一次,RDB 每小时保存一次 4)单机多实例,保证 CPU 的使用率
3)“并发修改操作需要对并发进行保护,引入CAS等复杂问题” redis 本身不能保证key-value修改时的线程安全吗?
答案是,redis是单线程的,不涉及并发。所有的命令都可以认为是原子的。
4)根据业务需要选择合适的数据类型,并为不同的应用场景设置相应的紧凑存储参数。
5)当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能以及最大的内存使用量。
6)如果需要使用持久化,根据是否可以容忍重启丢失部分数据在快照方式与语句追加方式之间选择其一,不要使用虚拟内存以及diskstore方式。
7)不要让你的Redis所在机器物理内存使用超过实际内存总量的3/5。