Redis与Java使用经验
Contents
Redis 中的数据类型
- String——字符串
- Hash——字典
- List——列表
- Set——集合
- Sorted Set——有序集合
String (简单的 K-V 类型)
适合场景: 简单的
K-V
键值对.
Hash 结构
适合存储Java对象.Key就是对象有唯一标识, HashKey就是对象的属性标识, value就是属性的值. Object -> HashMap -> Redis Redis -> HashMap -> Object
可以使用 apache common
包来进行 HashMap和Object的相互转换
#HashMap to Object
BeanUtils.populate(bean, properties)
#Object to HashMap
Map<String, Object> objectAsMap = BeanUtils.describe(bean);
为什么要这样子呢, 因为如果使用 String
数据类型, 只是修改一个字段的话, 每次都要加载所有Redis中的数据(如果对象比较大的话, 就更严重了).然后修改完, 最后再序列化到Redis.
但如果使用Hash
就不会这样子了, 只是修改一个字段的话, 可以直接去修改该字段即可.
也可以使用(新版已经废弃):
private static final JacksonHashMapper<CcSession> jackSonHashMapper = new JacksonHashMapper<CcSession>(CcSession.class);
或
BeanUtilsHashMapper
注意,这不支持嵌套属性
List 结构
就是链表.
可以想像链表的数据结构使用场景.(队列等)
Set 集合
Set 就是一个集合,集合的概念就是一堆不重复值的组合.
Sorted Set 排序集合
在公司里, 唯一用过一次的场景就是.会话的排序.每个会话(不重复性)根据最新的消息的时间来排序.这时就可以使用这个数据结构了.
特别提一下, 它是根据 score
来排序. 如果需要根据多个字段来进行排序的话, 可以在score
里,逻辑上分配个多字段值.
在这里, 以我在公司里的两个字段排序来举个例子.上面说到,一个排序是根据消息最新时间来排序, 还有一个是置顶. 置顶永远是最前面的.然后才是最新消息的排序.
这里, 我使用了 x.y
的 score
方式来排序. 置顶时 x=1
, 否则就是 x=0
, 然后 y
就是最新消息的时间戳.这样子就可以实现两人个字段来排序的逻辑了.
编码注意
多用 pipline
业务允许的话,尽可能将命令合并到一个 pipline
减小操作的粒度
比如大 zset ,可以分批,小量小量地删除(删除操作,可以凌晨或业务空闲的时候处理)
删除大 key
在业务繁忙时,不要删除一个大 key ,可以临时 rename 这个 key,然后定时在凌晨相对空闲时才正式删除。
scan 注意
scan 的耗时与 count 的大小有非常重要的关系, count 的参数越大,耗时越多。