Redis优雅地解决大Key读取(redis读取大key)

压力 高并发场景下,读取大Key的压力是一种普遍的问题,Redis常用于缓存相关服务,并且对大Key读取做了优化。对于大…

压力

高并发场景下,读取大Key的压力是一种普遍的问题,Redis常用于缓存相关服务,并且对大Key读取做了优化。对于大Key读取,能够优雅地处理这种现象。

##### 1.切分大Key

在Redis读取大Key的场景下,首先要做的就是切分大Key,并将之分到多个小Key下。切分的时候需要考虑用户的完整使用体验,将界面上不容易区分的部分切分,但是又不影响整体的流程。切分后的小Key,可以精准的跟踪用户行为,可以更直观的分析数据,而且读取数据的时候也更快更灵活,如下所示:

//例如:将大Key"userInfo"切分为以下几个小Key
userInfo:username
userInfo:phone
userInfo:eml

##### 2.哈希类型存储

对大Key读取的时候,我们可以使用哈希类型来存储,相比于字符串或者列表,哈希类型只要取出一次,就能读取出多个字段,大大减少IO操作次数,提高性能。如下所示:

//在存储的时候:
HSET userinfo username Tom
HSET userinfo phone 15511111111
HSET userinfo eml [email protected]

//在获取的时候:
HMSET userinfo username Tom phone 15511111111 eml [email protected]

+ HMGet命令可以快速获取用户手机号,邮箱等字段值,而不需要遍历全部字段,大幅减少IO操作。

+ 由于大量Key使用哈希类型存储,碎片化问题会急剧加剧,而因此Redis 4.0之后的版本采用了虚拟槽(cluster slot)的技术,将哈希类型的存储分散到多个节点中,使Redis在存储哈希类型的时候更加稳定。

##### 3.对象缓存

在存储大Key的时候,可以使用JSON格式存储,然后将其缓存到Redis中,极大的简化了存储和读取的工作量。实现方式如下所示:

//定义User对象
class User{
private String username;
private String phone;
private String eml;
//getter/setter
}
//存储对象
JSONObject userJsonObject = new JSONObject();
//将user对象转换成json
userJsonObject.put("username",user.getUsername());
userJsonObject.put("phone",user.getPhone());
userJsonObject.put("eml",user.getEml());
//存储到Redis
jedis.set("userInfo",userJsonObject.toJSONString());
//读取对象
String userJsonString = jedis.get("userInfo");
//将json转换成User对象
User user = (User)JSONObject.toBean(JSONObject.fromObject(userJsonString),User.class);

使用对象缓存能够更简单的让我们的数据存储在Redis中,同时读取也更加方便。

以上三个方式,都可以优雅的解决大Key读取的压力,能有效的提高系统的并发吞吐性能。

香港服务器首选港服(Server.HK),2H2G首月10元开通。
港服(Server.HK)(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

为您推荐

港服(Server.HK)MongoDB教程:MongoDB 索引

MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件...

港服(Server.HK)PostgreSQL教程PostgreSQL 别名

PostgreSQL 别名 我们可以用 SQL 重命名一张表或者一个字段的名称,这个名称就叫着该表或该字段的别名。 创建...

港服(Server.HK)Memcached教程:Memcached stats 命令

Memcached stats 命令 Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号...

港服(Server.HK)Redis教程:Redis 数据类型

Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集...

港服(Server.HK)Redis教程:Redis GEO

Redis GEO Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 ...
返回顶部