Redis学习笔记

Reids简介

Redis是基于键值对的NoSql数据库。
redis把数据存放在内存中,读写性能快。

特性

速度快

  1. 数据存放在内存
  2. C语言实现
  3. 单线程,无竞争问题

键值对数据结构

  1. 值:字符串、哈希、列表、集合、有序集合

单线程为什么快

  1. 纯内存访问, Redis将所有数据放在内存中, 内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。
  2. 非阻塞I/O, Redis使用epoll作为I/O多路复用技术的实现。
  3. 单线程可以简化数据结构和算法的实现。 如果对高级编程语言熟悉的读者应该了解并发数据结构实现不但困难而且开发测试比较麻烦。 第二,单线程避免了线程切换和竞态产生的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手

哈希表

1
2
3
4
5
6
7
hset key field value

hget key field

hlen key

hkeys key

哈希类型内部编码

.ziplist

结构紧凑,占用内存下,适用于元素个数较小的场景

.hashtable

.ziplist无法满足时采用,读写时间复杂度为O(1)

哈希类型和关系型数据库两点不同

  1. 哈希类型是稀疏的, 而关系型数据库是完全结构化的, 例如哈希类型每个键可以有不同的field, 而关系型数据库一旦添加新的列, 所有行都要为其设置值(即使为NULL)
  2. 关系型数据库可以做复杂的关系查询, 而Redis去模拟关系型复杂查询开发困难, 维护成本高

重点

1) Redis提供5种数据结构, 每种数据结构都有多种内部编码实现。
2) 纯内存存储、 IO多路复用技术、 单线程架构是造就Redis高性能的三个因素。
3) 由于Redis的单线程架构, 所以需要每个命令能被快速执行完, 否则会存在阻塞Redis的可能, 理解Redis单线程命令处理机制是开发和运维Redis的核心之一。
4) 批量操作(例如mget、 mset、 hmset等) 能够有效提高命令执行的效率, 但要注意每次批量操作的个数和字节数。
5) 了解每个命令的时间复杂度在开发中至关重要, 例如在使用keys、hgetall、 smembers、 zrange等时间复杂度较高的命令时, 需要考虑数据规模对于Redis的影响。
6) persist命令可以删除任意类型键的过期时间, 但是set命令也会删除字符串类型键的过期时间, 这在开发时容易被忽视。
7) move、 dump+restore、 migrate是Redis发展过程中三种迁移键的方式, 其中move命令基本废弃, migrate命令用原子性的方式实现了dump+restore, 并且支持批量操作, 是Redis Cluster实现水平扩容的重要工具。
8) scan命令可以解决keys命令可能带来的阻塞问题, 同时Redis还提供170了hscan、 sscan、 zscan渐进式地遍历hash、 set、 zset。