我爱编程

Redis之前的思考笔记

2018-04-23  本文已影响0人  小雪的笔记

预分片(数据迁移的方式基于当前使用爹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不支持事务的回滚机制,即使事务队列中的某个命令在执行期间出现错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止

上一篇下一篇

猜你喜欢

热点阅读