在 Openstack Keystone 中使用 Redis,redis 中的一些垃圾

using Redis in Openstack Keystone, some Rubbish in redis

最近,我正在使用 Redis 缓存 OpenStack Keystone 的令牌。功能没问题,但是Redis中还有一些过期的缓存数据。

我的 Keystone 配置:

[cache]
enabled=true
backend=dogpile.cache.redis
backend_argument=url:redis://127.0.0.1:6379

[token]
provider = uuid
caching=true  
cache_time= 3600
driver = kvs
expiration = 3600

但 Redis 中的一些过期数据: 数据已过期,但还在这里,因为 TTL 为 -1。

我的问题:

  1. 如何更改设置以停止创建这些垃圾数据?
  2. 有什么优雅的清理方法吗?
    • 我试图使用命令 'keystone-manage token_flush',但在阅读代码后,我意识到这个命令只是清理 Mysql
    • 中的过期令牌

我希望这个问题仍然有意义。

我正在尝试做与您相同的事情,目前我发现唯一可行的选择是 dogpile.cache.redis 上的论点:redis_expiration_time。 检查后端 dogpile.redis API 或源代码。 http://dogpilecache.readthedocs.io/en/latest/api.html#dogpile.cache.backends.redis.RedisBackend.params.redis_expiration_time

这个参数的唯一问题是它不允许您为不同的类别选择不同的 TTL,例如您想要 10 分钟的令牌和 24 小时左右的目录。根据我的经验,keystone.conf 上的其他参数不起作用(每个类别上的 expiration_time 和 cache_time)...无论如何,如果您使用 redis 存储,则此问题无关紧要只有基石标记。

[cache] 
enabled=true
backend=dogpile.cache.redis
backend_argument=url:redis://127.0.0.1:6379
// Add this line
backend_argument=redis_expiration_time:[TTL]

只需将 [TTL] 替换为您想要的 ttl,您就会开始注意到 redis 中带有 ttl 的键,一段时间后您会发现它们不再存在。

关于第二个问题:

这可能不是您看到的最佳答案,但您可以在 redis-cli 上使用 OBJECT idletime [key] 命令来查看特定密钥未使用的时间(甚至 GET 重置空闲时间)。您可以使用一个简单的脚本删除空闲时间大于令牌撤销的密钥。

请记住,Redis 上的数据不是持久性数据,这意味着您始终可以使用 FLUSHALL,并且您的 OpenStack 和 keystone 将照常工作,但第一次身份验证需要更长的时间。