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.yscore 方式来排序. 置顶时 x=1, 否则就是 x=0, 然后 y 就是最新消息的时间戳.这样子就可以实现两人个字段来排序的逻辑了.

编码注意

多用 pipline

业务允许的话,尽可能将命令合并到一个 pipline

减小操作的粒度

比如大 zset ,可以分批,小量小量地删除(删除操作,可以凌晨或业务空闲的时候处理)

删除大 key

在业务繁忙时,不要删除一个大 key ,可以临时 rename 这个 key,然后定时在凌晨相对空闲时才正式删除。

scan 注意

scan 的耗时与 count 的大小有非常重要的关系, count 的参数越大,耗时越多。