Code Bye

redis或者缓存系统有批量删除的机制吗?

一个场景,我根据某些条件更新或者删除了数据库一个表中的一些数据,怎么样将缓存中的对应数据删除或者更新?保持一致性?

如果你用过spring  可以试下用 @Cacheable注解来产生数据缓存 ,用@CacheEvict 注解在删除或者变动数据的时候来清除缓存中的数据,具体你可以查下这俩个注解的用法
Ehcache 中可以像楼上说的那样,@Cacheable 产生缓存是以 key-value形式产生的,删除也是。
memcached 也是同样的。

具体的想批量清除缓存,你可以手动的清除

先取出 缓存块中的所有缓存,然后根据key值前缀取出目标 key放到list中,手动调用清除方法

引用 1 楼 zhixiao 的回复:

如果你用过spring  可以试下用 @Cacheable注解来产生数据缓存 ,用@CacheEvict 注解在删除或者变动数据的时候来清除缓存中的数据,具体你可以查下这俩个注解的用法

谢谢回复,我去了解下,不过不想介入Spring,只是想有没有办法封装一个单独的层或者方法来解决这个问题。

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除
redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

还是不符合我的需要,我想要的不是根据某个方法或者类来缓存,而且Spring的失效还是以key为基础的。
引用 4 楼 qq467339640 的回复:

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除

redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

关键是如果更新数据不是以key为条件,也不知道具体更新了多少数据,没有办法找出更新数据对应的缓存。

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。
命令行的方式让redis进行snapshotting:
redis-cli -h ip -p port bgsave  
aof方式:
appendonly yes //启用aof持久化方式  
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用  
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐  
# appendfsync no //完全依赖os,性能最好,持久化没保证  
引用 4 楼 qq467339640 的回复:

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除

redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

对缓存了解比较少,缓存有提供除了根据key之外删除数据的方法吗?或者有什么办法在更新数据库的操作过程中获取被更新的数据的key?

引用 6 楼 wj_763891 的回复:
Quote: 引用 4 楼 qq467339640 的回复:

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除

redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

关键是如果更新数据不是以key为条件,也不知道具体更新了多少数据,没有办法找出更新数据对应的缓存。

你总知道key的生成规则好不?你总知道更新的记录,根据记录总可以自己拼接key 了吧

引用 8 楼 wj_763891 的回复:
Quote: 引用 4 楼 qq467339640 的回复:

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除

redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

对缓存了解比较少,缓存有提供除了根据key之外删除数据的方法吗?或者有什么办法在更新数据库的操作过程中获取被更新的数据的key?

我觉得你走入了一个误区了
缓存中的key一般都是根据你的业务规则生成的,就拿csdn的博客来说,如果我要做缓存,是不是可以用博客的id作为缓存的key,如果博客更新了,这时我们就要更新缓存的数据(保持一致性),博客更新了,服务器是不是可以知道id,你是不是可以用这个id在缓存中找到旧的数据,删除就ok了

引用 10 楼 qq467339640 的回复:
Quote: 引用 8 楼 wj_763891 的回复:
Quote: 引用 4 楼 qq467339640 的回复:

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除

redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

对缓存了解比较少,缓存有提供除了根据key之外删除数据的方法吗?或者有什么办法在更新数据库的操作过程中获取被更新的数据的key?

我觉得你走入了一个误区了
缓存中的key一般都是根据你的业务规则生成的,就拿csdn的博客来说,如果我要做缓存,是不是可以用博客的id作为缓存的key,如果博客更新了,这时我们就要更新缓存的数据(保持一致性),博客更新了,服务器是不是可以知道id,你是不是可以用这个id在缓存中找到旧的数据,删除就ok了

可能还是太笨,我的意思是比如更新数据库的语句是update table_name set for = ‘bar’ where column_name = “”XXX””;
我缓存的key肯能的组成是这样:table_name:id,但是我更新数据不是根据ID,是根据其他条件,这个时候怎样获取缓存中受影响的数据呢?


50分
引用 11 楼 wj_763891 的回复:
Quote: 引用 10 楼 qq467339640 的回复:
Quote: 引用 8 楼 wj_763891 的回复:
Quote: 引用 4 楼 qq467339640 的回复:

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除

redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

对缓存了解比较少,缓存有提供除了根据key之外删除数据的方法吗?或者有什么办法在更新数据库的操作过程中获取被更新的数据的key?

我觉得你走入了一个误区了
缓存中的key一般都是根据你的业务规则生成的,就拿csdn的博客来说,如果我要做缓存,是不是可以用博客的id作为缓存的key,如果博客更新了,这时我们就要更新缓存的数据(保持一致性),博客更新了,服务器是不是可以知道id,你是不是可以用这个id在缓存中找到旧的数据,删除就ok了

可能还是太笨,我的意思是比如更新数据库的语句是update table_name set for = ‘bar’ where column_name = “”XXX””;
我缓存的key肯能的组成是这样:table_name:id,但是我更新数据不是根据ID,是根据其他条件,这个时候怎样获取缓存中受影响的数据呢?

我去,你不会根据colunm_name=””XXX”” 把这些id查询出来吗?select id from table_name where colum_name=””XXX””;这不是解决了嘛,虽然多查询了一次数据库,但根据你描述的情况来看(你想要缓存立即同步),必须这样做

引用 12 楼 qq467339640 的回复:
Quote: 引用 11 楼 wj_763891 的回复:
Quote: 引用 10 楼 qq467339640 的回复:
Quote: 引用 8 楼 wj_763891 的回复:
Quote: 引用 4 楼 qq467339640 的回复:

这个关redis什么事?你要保持数据一致性,删除数据后再删除缓存里面的数据就ok了,现在redis在可以登录客户端的情况下可以批量删除

redis-cli KEYS "test_*" | xargs redis-cli DEL

用代码的话一般都是先取出key,循环遍历在删除就ok了

对缓存了解比较少,缓存有提供除了根据key之外删除数据的方法吗?或者有什么办法在更新数据库的操作过程中获取被更新的数据的key?

我觉得你走入了一个误区了
缓存中的key一般都是根据你的业务规则生成的,就拿csdn的博客来说,如果我要做缓存,是不是可以用博客的id作为缓存的key,如果博客更新了,这时我们就要更新缓存的数据(保持一致性),博客更新了,服务器是不是可以知道id,你是不是可以用这个id在缓存中找到旧的数据,删除就ok了

可能还是太笨,我的意思是比如更新数据库的语句是update table_name set for = ‘bar’ where column_name = “”XXX””;
我缓存的key肯能的组成是这样:table_name:id,但是我更新数据不是根据ID,是根据其他条件,这个时候怎样获取缓存中受影响的数据呢?

我去,你不会根据colunm_name=””XXX”” 把这些id查询出来吗?select id from table_name where colum_name=””XXX””;这不是解决了嘛,虽然多查询了一次数据库,但根据你描述的情况来看(你想要缓存立即同步),必须这样做

明白了,感谢


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明redis或者缓存系统有批量删除的机制吗?