OS Shell下批量操作Redis

1
2
3
4
5
6
7
# 批量删除库中的某些Key
./redis-cli -h ip -p 1001 -a xxx keys ip_* |xargs ./redis-cli -h ip -p 1001 -a xxx del
./redis-cli -h ip -p 1001 -a xxx keys "*ip_*"|xargs ./redis-cli -h ip -p 1001 -a xxx del
./redis-cli -h ip -p 1001 -a xxx keys "*ip_*"|xargs -r -t -n1 ./redis-cli -h ip -p 1001 -a xxx del

# key 如果带空格,需要用这里的语句才能批量删除
./redis-cli -h ip -p 1001 -a xxx keys "*ip_*"|xargs -I {} ./redis-cli -h ip -p 1001 -a xxx del "{}"

Redis Lua脚本批量删除

1
2
3
4
5
6
7
8
-- 第一种key太多可能删除不了,第二种可以循环大量处理
eval "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 "*ip_*"
eval "for _,k in ipairs(redis.call('keys','*ip_*')) do redis.call('del',k) end" 0

-- 脚本展开如下
for _, k in ipairs(redis.call('keys', '*ip_*')) do
    redis.call('del', k)
end

Sentinel查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 在一台装有哨兵的服务器,登录到哨兵控制台界面,用下列命令查询

# 查询某个Redis库,当前所记录的哨兵状态
127.0.0.1:26300> sentinel sentinels Rxxxxx
# 查询当前哨兵监控中的所有主库
127.0.0.1:26300> sentinel masters
# 查询当前哨兵监控中指定实例的所有从库
127.0.0.1:26300> sentinel slaves Rxxxxx
# 查询指定实例主库的IP地址、端口号等信息
127.0.0.1:26300> sentinel get-master-addr-by-name Rxxxxx

Redis内存管理策略

我们需要注意,缓存过期策略和内存淘汰机制是容易混淆的两个概念,两者的目的不同。

  • 缓存过期策略:针对过期 Key ,从内存中移除的方式。
  • 内存淘汰机制:针对 Redis 内存不足时,业务还在继续往 Redis 追加内容,如何处理已有的内容。

在 Redis 的 redis.conf 文件中,我们能找到八种可配置的内存淘汰机制:

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key;
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key;
  • volatile-lfu:当内存不足以容纳新写入数据时,在过期密集的键中,使用 LFU 算法进行删除 key;
  • allkeys-lfu:当内存不足以容纳新写入数据时,对所有的 key 执行 LFU 算法筛选过期;
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期的键中,随机删除一个 key;
  • allkeys-random:当内存不足以容纳新写入数据时,随机删除一个或者多个 key;
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除;
  • noeviction:当内存不足以容纳新写入数据时,新写入操作直接报错,无法写入。

上述算法按照特性可以分为几类:LRU/LFU 算法、随机删除算法、优先淘汰历史数据算法、报错处理算法。

在项目中推荐两种 LRU 算法,即如果 Redis 用作持久化数据库,不配置缓存过期时间,采用 allkeys-lru ;如果 Redis 作为缓存数据库,配置了 Key 过期时间,采用volatile-lru算法。

LRU(Least Recently Used,最近最少使用算法)

(完)