关于java使用redis的key如何生成的问题

OLESHI 发布于 2016/12/05 10:21
阅读 2K+
收藏 1

相对查询结果进行缓存,查询的条件封装在一个Query对象里面,查询结果最后是一个JSON字符串,Query对象不是null的属性作为查询条件,希望能根据Query对象不同的属性生成key.

请问有什么高效的方法或者工具类吗?

加载中
1
Rcd
Rcd

1. 可考虑做2级缓存,一级使用ehcache(hibernate/mybatis可集成),看并发量较大集群机器多再考虑二级redis。

2. Query对象中的查询条件是否都是字符串?如果是整型可使用hashCode,如果是大量字符串,使用这些字符串的消息摘要,看查询条件的组合数如何,可以使用MD5之类算法,如果考虑到组合数很少,可裁剪比如只取20位等, 因为KEY不宜过长,JSON如果很短可直接保存,如果很大可考虑google protobuf, kryo等耗费空间较少,序列化与反序列化性能较高的工具。思路大概如此。

0
流动的石头
流动的石头

自定义注解 + aop + SpelExpressionParser

过客丶wind
强烈推荐
0
士别三日
士别三日
你这个思路就是错的,如果每个查询组合你都缓存一下,缓存大小将大大超过数据本身总和大小,速度是快了,你的redis服务器马上就要爆了。如果查询组合数量比较小,数据不怎么变,可以考虑你这种做法。至于怎么生成key,可以重写toString方法,按顺序拼接一下就行。
士别三日
士别三日
回复 @OLESHI : 我的意思是说,用空间换时间大部分场景下都是不必要的,你的系统并不需要那么快。redis适合存储聚集型数据,就是一个简单的key,把一堆规则的数据一起取出来。不适合存关系型数据。
O
OLESHI
redis服务器爆掉需要多大的组合数?
0
Looye
Looye
key有多种设计方式,比较简单的方式是类似“前缀+对象id+后缀”来生成key,只要能生成不重复的key就可以, 直接在service层缓存查询结果。
0
O
OLESHI
我把Query对象排除null的属性,转换为JSON字符串,然后JSON字符串进行MD5加密,生成key,这样如何?
0
尚浩宇
尚浩宇
直接mybatis+redis二级缓存
O
OLESHI
同一个sql,后台调用不能缓存,要实施,前端接口调用,要缓存,要快,前后端共用了同一个service。mybatis二级缓存这就不好弄了。
0
厶月匕匕灬

相同的query,我一般是映射成map,然后对key字典排序,再把它做一个md5

md5有极小的重复概率,你可以把方法名什么的拼到前面去作key,这样可以降低重复的概率

如果有用户账户体系,可以把用户的唯一标识。

具体的你可以根据自己需要的维度去决定key该长怎样,不建议使用param的原文,redis的key超过256还是255长度,会对性能有影响

0
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部