用了好几年的Redis,很多东西还是一知半解。于是决定系统的学习一下,也写些笔记以做巩固。
Redis 有哪些特性
- 速度快(单线程)
- 基于键值对的数据结构服务器
- 丰富的功能
- 除了基础的5种数据结构,还提供了发布订阅、Lua脚本、简单的事务等等功能。
- 简单稳定
- 客户端语言多
- 持久化
- 主从复制
- 高可用及分布式
Redis 能用来做什么
- 缓存
- 分布式锁
- 排行榜系统
- 计数器应用(如 api 限频)
- 消息队列系统
Redis 的基本数据结构
Redis 使用了单线程架构和 I/O 多路复用模型来实现高性能的内存数据库服务。它提供了 5 种数据结构。
字符串
- 常用命令
- set key value [ex seconds] [px milliseconds] [nx|xx]
- get key
- mset key value [key value …]
- hget key [key …]
- incro key (如果键值不存在,会按照值0自增,返回1)
- 内部编码
- int : 长整型(8字节,-2^63 ~ 2^63 -1)
- embstr :大于等于39个字节的字符串
- raw:大于39个字节的字符串
- 使用场景
- 缓存
- 计数
- 共享 session
- 限频
哈希
- 常用命令
- hset key field value
- hget key field
- hdel key field [field …]
- hmset key field value [field value …]
- hmget key field [field]
- hkeys key (获取所有field)
- hvals key (获取所有vaule)
- hgetall key (获取所有field-value)
- 内部编码
- ziplist (压缩列表)
- hashtable (哈希表)
- 使用场景
- 存储数据库表记录
列表
- 常用命令
- rpush key value [value …] (lpush 同理) ( r-right, l-left)
- linsert key before|after pivot value 从某个值前后插入元素
- lrange key start end
- lindex key index 获取指定索引下标元素
- llen key 列表长度
- lpop key (rpop 同理)
- 内部编码
- ziplist (压缩列表)
- linkedlist (链表)
- 使用场景
- 消息队列(如 laravel 的队列实现)
集合
- 常用命令
- sadd key element [element …]
- srem key element [element …]
- scard key 计算元素个数
- sismember key element 判断元素是否在集合中
- smembers key 获取所有元素 (慎用)
- sinter key [key …] 多个集合的交集
- sunion key [key …] 多个集合的并集
- sdiff key [key …] 多个集合的差集
- 内部编码
- intset (整数集合)
- hashtable (哈希表)
- 使用场景
- 用户标签
- 大数组操作
有序集合
- 常用命令
- zadd key score member [score member …]
- zcard key 计算成员数量
- zscore key member 获取成员的分数
- zrem key member [member …]
- zrange key start end [withscores] 从低到高返回指定排名范围的成员 (下标从0开始)
- 内部编码
- ziplist (压缩列表)
- skiplist (跳跃列表)
- 使用场景
- 排行榜
键管理
单个键
- 重命名 :rname key newkey
- 随即返回一个key :randomkey
- 键过期
- expire key seconds
- expire key timestamp
- ttl key
- 迁移键
- move key db
- dump + restore
- migrate
遍历键
- 全量遍历键:keys pattern
- 渐进遍历键:scan cursor [match pattern] [count number] (number 默认为10)
数据库
- 切换数据库:select dbIndex
- 清除数据库:flushdb/flushall