一文了解大数据下 Redis 的应用( 三 )
(6)volatile-ttl: 移除掉部分keys , 选择那些TTL时间比较短的keys
除了LRU , 还可以使用scan的方式进行轮询ttl的方式清理
3.3 代码中使用redis的一些建议
避免使用keys *这种模糊查询 , 会阻塞当前线程 , 使用scan的方式去处理 , redis客户端建议不要使用redis desktop manager
String cursor = ScanParams . SCAN_POINTER_START ; ScanParams scanParams = new ScanParams (); // 匹配表达式 scanParams . match ( "key*" ); // 每次scan的条数 scanParams . count ( 1000 ); while ( true ) {ScanResultString > result = jedis . scan ( cursor , scanParams );cursor = result . getStringCursor ();if ( "0" . equals ( cursor )) {break ;} }
hgetall也应该避免使用 , 使用hscan代替 , 但如果通过RedisTemplate回调的方式使用hscan应该注意资源的释放 , 否则会出现请求到达一定次数的时候就不能发起请求的问题(客户端hang住了)
如果set的时候同时设置expire过期时间 , 不要先set再expire这种方式 , 应该使用原子操作
set key value [EX seconds] [PX milliseconds] [NX|XX]
对于同一个需求多次改版redis中写入不同格式的数据 , 会产生兼容性问题 , 可以使用type命令去处理兼容 , 然后监控等老数据不存在之后再把判断逻辑移除
String type = jedis . type ( "a" ); if ( "string" . equalsIgnoreCase ( type )) {// do something } else if ( "list" . equalsIgnoreCase ( type )) {// do something }
如果redis中的数据需要做去重 , 可以使用set或hashmap , hashmap性能更高 , 但对于维护hashmap数据结构之外的数据比较多 , 之前测试过 , 100B的数据存放到hashmap , 但实际占用量可能有200B~300B甚至更多 , set对于数据多的情况下性能会低一点
建议:数据少的情况下用set , 数据多就用hashmap , 但要注意尽量减少存储内容的长度 , 比如{"source":"order"}可以改成{"s":1}
去重操作不建议使用list , 因为每次判断都要从list中取数据然后再add进去 , 多线程操作下还是可能会出现重复问题(比如两个线程同时lrange操作)
// 在多线程模式下会有问题 // 假设线程A和线程B同时执行lrange ListString > list = jedis . lrange ( "a" , 0 , - 1 ); if (! list . contains ( "bbb" )) {jedis . lpush ( "bbb" ); }
如果一次处理的命令很多 , 使用pipeline性能更好
list可以结合lpush/rpop、rpush/lpop来实现队列功能 , 但不建议把list当成是MQ的功能 , 因为没有记录的状态 , 无法跟踪数据处理情况
关于redis分布式锁 , 目前流行的实现方式还没有完美的方案 , 使用lua脚本的版本也不是完美的 , 如果需求允许延时或者一定时间内不允许执行多次 , setnx设置过期时间是最好的方案
4、故障转移与数据迁移 4.1 数据迁移方案
老节点替换为新节点、新老key兼容处理
将新节点作为老节点的slave节点 , 等数据自动同步完成之后下架老节点 , 不建议使用代码迁移 , 因为不同业务数据结构可能很多
不同类型的节点之间迁移的方法不同 , 如果单节点迁移至分片集群只能借助迁移工具来完成
如果新业务将使用新的key , 要保留旧key , 可以开启两个连接池 , 一个处理新key , 一个处理旧key , 这样等旧key都失效的时候移除对旧key的连接就可以完全迁移到新key业务
动态扩容
必须在集群模式下才可以进行动态扩容 , 也可以使用cachecloud , 数据会自动同步到各个节点
在数据迁移的过程中即使访问的某个key正在迁移 , 数据也是可以正常返回的 , 不用担心迁移过程会对数据访问造成影响
4.2 故障转移对于客户端的影响
redis集群模式虽然可以在某个master节点发生故障的时候自动从slave中选举节点当master , 但类似jedis的客户端并不支持故障转移 , 也就是当集群某节点发生故障正在切换的时候 , 客户端如果正在访问故障节点 , 这时集群故障转移还没有完成 , 客户端会报错 , 如果需要让客户端也支持故障转移 , 需要修改jedis客户端源码来实现 。
- 三星exynos2200面世:超大核+3颗大核+4颗小核
- 线上新书发布!云上带你了解有关“冬奥”的那些事儿
- 2022首场工业数字化供需对接大会举办
- nvidia宣布扩大gsp处理器开放范围
- 我的世界大闹天宫龙宫怎么玩(我的世界大闹天宫龙宫打法技巧一览)
- 复苏的魔女魔导装备boss怎么打(复苏的魔女魔导妨害装备获取攻略大全)
- 斗罗大陆魂师对决魂力怎么入手(斗罗大陆魂师对决魂力获取方法介绍)
- 复苏的魔女恐惧之馆怎么玩(复苏的魔女恐惧之馆玩法攻略大全)
- 幻境公主兑换码有哪些(幻境公主礼包码大全)
- 就在周日,济南这家大型购物商场,有大优惠
