预分片(数据迁移的方式基于当前使用爹redis2.0+的版本 3.0+服务端可以自动分片和迁移)
我们已经知道分片存在的一个问题,除非我们使用 Redis 作为缓存,增加和删除节点是一件很棘手的事情,使用固定的键和实例映射要简单得多。
然而,数据存储的需求可能一直在变化。今天我可以接受 10 个 Redis 节点(实例),但是明天我可能就需要 50 个节点。
因为Redis 只有相当少的内存占用(footprint)而且轻量级(一个空闲的实例只是用 1MB 内存),一个简单的解决办法是一开始就开启很多的实例。即使你一开始只有一台服务器,你也可以在第一天就决定生活在分布式的世界里,使用分片来运行多个 Redis 实例在一台服务器上。
你一开始就可以选择很多数量的实例。例如,32 或者 64 个实例能满足大多数的用户,并且为未来的增长提供足够的空间。
这样,当你的数据存储需要增长,你需要更多的 Redis 服务器,你要做的就是简单地将实例从一台服务器移动到另外一台。当你新添加了第一台服务器,你就需要把一半的 Redis 实例从第一台服务器搬到第二台,如此等等。
使用Redis 复制,你就可以在很小或者根本不需要停机时间内完成移动数据:
在你的新服务器上启动一个空实例。
移动数据,配置新实例为源实例的从服务。
停止你的客户端。
更新被移动实例的服务器 IP 地址配置。
向新服务器上的从节点发送 SLAVEOF NO ONE 命令。
以新的更新配置启动你的客户端。
最后关闭掉旧服务器上不再使用的实例。
redis客户端和服务端分片两种方式:
3.0以下没有服务端分片,一般使用Java shardjedis客户端进行分片,如果需要扩展节点,需要重新使用工具进行重新处理数据之后导入处理;(2.0+的客户端分片算法可以参看前面的笔记)
3.0以上服务端分片,增加节点,可以出发命令,服务端自动进行数据的分片处理。
redis批量脚本导入功能,可以考虑作为数据迁移使用
cat redis_commands.txt | redis-cli -h10.31.11.190 -p 5416 -a nn5oqo93 --pipe
redis_commands.tx为redis的命令行 (无需所谓的转换成redisProtocol)
set name0 hellowworld
set name1 hellowworld
set name2 hellowworld
set name3 hellowworld
set name4 hellowworld
防刷控制可以使用setnx控制代码块,注意设置失效时间,否则异常redis无法删除的场景导致功能不可用
ucRedisDao.setnx(openidLock, "1",60);(使用分布式锁)
ucRedisDao.del(openidLock);
redis事物控制:
redis >MULTI OK
redis > SET "username"
"bugall"
QUEUED
redis > SET "password"161616
QUEUED
redis > GET "username"
redis >EXEC
1) ok 2) "bugall" 3) "bugall"
事务中不能有失败的情况,失败了就无法回滚
redis> MULTI
OK
redis > GET
(error) ERR wrong number of arguments for 'get' command
redis > GET username
QUEUED
redis > EXEC
(error) EXECABORT Transaction discarded because of previous errors
redis的事务和传统的关系型数据库事务的最大区别在于,redis不支持事务的回滚机制,即使事务队列中的某个命令在执行期间出现错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止