Redis 使用规范围绕如下几个纬度展开:
键值对使用规范;
命令使用规范;
数据保存规范;
运维规范。
键值对使用规范
有两点需要注意:
好的 key 命名,才能提供可读性强、可维护性高的 key,便于定位问题和寻找数据。
value要避免出现 bigkey、选择高效的序列化和压缩、使用对象共享池、选择高效恰当的数据类型。
key 命名规范
规范的 key命名,在遇到问题的java培训时候能够方便定位。Redis 属于 没有 Scheme的 NoSQL数据库。
所以要靠规范来建立其 Scheme 语意,就好比根据不同的场景我们建立不同的数据库。
敲黑板
把「业务模块名」作为前缀(好比数据库 Scheme),通过「冒号」分隔,再加上「具体业务名」。
这样我们就可以通过 key 前缀来区分不同的业务数据,清晰明了。
总结起来就是:「业务名:表名:id」
key 是字符串,底层的数据结构是 SDS,SDS 结构中会包含字符串长度、分配空间大小等元数据信息。
字符串长度增加,SDS 的元数据也会占用更多的内存空间。
所以当字符串太长的时候,我们可以采用适当缩写的形式。
不要使用 bigkey
因为 Redis 是单线程执行读写指令,java培训如果出现bigkey 的读写操作就会阻塞线程,降低 Redis 的处理效率。
bigkey包含两种情况:
键值对的 value很大,比如 value保存了 2MB的 String数据;
键值对的 value是集合类型,元素很多,比如保存了 5 万个元素的 List 集合。
虽然 Redis 官方说明了 key和string类型 value限制均为512MB。最新 Redis 面试题整理好了,点击Java面试库小程序在线刷题。
防止网卡流量、慢查询,string类型控制在10KB以内,hash、list、set、zset元素个数不要超过 5000。
我们还可以通过 gzip 数据压缩来减小数据大小:
/**
- 使用gzip压缩字符串
*/
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
try (ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out)) {
gzip.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return new sun.misc.BASE64Encoder().encode(out.toByteArray());
}
/**
- 使用gzip解压缩
*/
public static String uncompress(String compressedStr) {
if (compressedStr == null || compressedStr.length() == 0) {
return compressedStr;
}
byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);;
String decompressed = null;
try (ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(compressed);
GZIPInputStream ginzip = new GZIPInputStream(in);) {
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = ginzip.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString();
} catch (IOException e) {
e.printStackTrace();
}
return decompressed;
}
集合类型
如果集合类型的元素的确很多,我们可以将一个大集合拆分成多个小集合来保存。
文章来源Java技术栈
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。