步骤:
- 要将1千万个键值对, 放到N个bucket中, 但是为了防止ziplist变为hashtable, 每个bucket不能超过512个键值对, 1千万 / 512 = 19531. 将所有key hash到所有bucket中, 但由于hash函数的不确定性, 可能出现不均等分配, 可以分配25000个bucket, 或者30000个bucket.
- 选用hash算法, 决定将key放到哪个bucket. 这里我们采用高效而且均衡的知名算法crc32. 通过获取原有md5(key)的crc32后, 再对bucket的数量进行取余.
- 第2步确定了外层的key, 内部的field我们选用bkdr哈希算法. public static int BKDRHash(String str) {
int seed = 131;
int hash = 0;
for (int i = 0; i < str.length; i++) {
hash = (hash * seed) + str.charAt(i);
}
return (hash & 0X7FFFFFFF);
} - 测试装入1000万条数据, 内存降低了85%; 查询测试, 查100万条数据, 对比查询速度: key-value耗时:10653、10790、11318、9900、11270、11029毫秒 hash-field耗时:12042、11349、11126、11355、11168毫秒

文章插图
蓝色的表示可能发生高延迟的地方
redis提供的慢查询统计功能: slowlog get {n}, 默认返回执行超过10ms(可配置)的命令.
- slowlog-log-slower-than, 配置超过几毫秒的数据被记录到慢查询队列中
- 慢查询队列的最大长度: slowlog-max-len
> slowlog get1) (integer) 26 # 在慢日志中的序列号2) (integer) 1450253133 # 该记录执行的系统时间3) (integer) 43097 # 该记录执行所消耗的时间4) "flushdb" # 执行的操作redis高延迟原因- 不合理的命令或者数据结构避免使用hgetall操作, redis提供发现各种数据结构中大对象的工具, redis-cli-h {ip} -p {port} bigkeys
- 持久化阻塞开启了持久化操作的redis, 当执行fork和AOF时会引起阻塞fork阻塞fork 操作发生在 RDB 和 AOF 重写时, Redis 主线程调用 fork 操作产生共享内存的子进程, 由子进程完成对应的持久化工作. 如果 fork 操作本身耗时过长, 必然会导致主线程的阻塞 。AOF阻塞当我们开启AOF持久化功能时,文件刷盘的方式一般采用每秒一次, 后台线程每秒对AOF文件做 fsync 操作. 当硬盘压力过大时, fsync 操作需要等待,直到写入完成.内存交换内存交换(swap)对于 Redis 来说是非常致命的, Redis 保证高性能的一个重要前提是所有的数据在内存中. 如果操作系统把 Redis 使用的部分内存换出到硬盘, 由于内存与硬盘读写速度差几个数量级, 会导致发生交换后的 Redis 性能急剧下降. 识别 Redis 内存交换的检查方法如下:>redis-cli -p 6383 info server | grep process_id # 查询 redis 进程号
>cat /proc/4476/smaps | grep Swap # 查询内存交换大小
Swap: 0 kB
Swap: 4 kB
Swap: 0 kB
Swap: 0 kB如果交换量都是0KB或者个别的是4KB, 则是正常现象, 说明Redis进程内存没有被交换有很多方法可以避免内存交换的发生:保证机器充足的可用内存确保所有Redis实例设置最大可用内存(maxmemory), 防止极端情况下Redis内存不可控的增长降低系统使用swap优先级, 如 echo10>/proc/sys/vm/swappiness
【一篇文章读懂redis】
推荐阅读
- 什么是工艺花茶,调味茶是什么
- 企业VPN数据传输流量走向解密
- 玫瑰茶的功效与禁忌,玫瑰花茶泡水喝的功效
- 昆仑雪菊的冲泡方法,冲泡小诀窍
- 新疆野生胎菊的功效,由内而外的美
- 丰胸花茶有哪些,茉莉花茶的产地有哪些
- 白梅花的功效与作用,苹果花的功效与作用
- 枸杞茉莉花茶的功效,喝茉莉花茶的好处和功效作用
- 玫瑰花茶搭配大全,玫瑰花茶怎么泡
- 明目花茶搭配大全,巧喝花茶
