第一章:初识 Redis
1.1盛赞 Redis
1.2 Redis 特性
1. 速度快
2. 基于键值对的数据结构服务器
3. 丰富的功能
4. 简单稳定
5. 客⼾端语⾔多
6. 持久化(Persistence)
7. 主从复制(Replication)
8. ⾼可⽤(High Availability)和分布式(Distributed)
1.3 Redis 使⽤场景
1.3.1 Redis 可以做什么
1. 缓存(Cache)
2. 排⾏榜系统
3. 计数器应⽤
4. 社交⽹络
5. 消息队列系统
1.3.2 Redis 不可以做什么
第⼆章 Redis 常⻅数据类型
2.1.1 基本全局命令
KEYS

EXISTS
DEL
EXPIRE
TTL
TYPE
2.1.2 数据结构和内部编码
2.1.3 单线程架构
1. 引出单线程模型
redis单线程,只有一个线程去接收处理所有的请求,并不是服务器进程内部只有一个线程,其实也有很多线程,这些线程都在处理网络IO

上面这个情况,可能会有线程安全问题

其实redis服务器并不会有这种情况,因为redis服务器是单线程服务器,把接收到的请求串行执行,多个请求到达redis队列中,也是需要进行排队等候的.
redis能够使用单线程模型,很好的工作,是因为redis处理的业务逻辑是短平快,不消耗CPU资源,如果一个操作执行的时间太长,就会影响其他的请求的执行
2.为什么redis是单线程,速度还能这么快,效率这么高?
他的速度快和效率高是与关系性数据库(MySQL,Orcale)进行对比
1.redis直接访问的是内存,而关系性数据库访问的硬盘
2.redis的核心功能,比关系性数据库的核心功能要简单,数据库对于数据的插入查询,都有更复杂的功能支持,
3.单线程模型,减少了不必要的线程竞争开销,redis每个操作都是短平快,不涉及特别消耗cpu的操作
4.处理网络IO的时候,使用了epoll这样的IO多路复用机制,IO多路复用机制,一个线程就可以处理多个socket,,epoll事件通知/回调机制,一个线程可以完成好多任务,前提是这些任务的交互不频繁,大部分时间都在等,可以采取epoll多路复用机制

1.String 字符串
在redis中,所以的key都是string类型,value的数据类型才有差异

常见命令
SET

GET
MGET
MSET
SETNX
计数命令
INCR
INCRBY
DECR
DECYBY
INCRBYFLOAT
APPEND
GETRANGE
SETRANGE
STRLEN
命令⼩结
内部编码



典型使⽤场景
缓存(Cache)功能


举一个例子来理解一下缓存
这是一段伪代码
redis这样的缓存,经常存储"热点"数据(被高频使用的数据),最近一段时间都会反复用到的数据,

计数(Counter)功能
共享会话(Session)
⼿机验证码
2.Hash 哈希
常见命令
1.HSET
2.HGET
3.HEXISTS
4.HDEL
5.HKEYS
6.HGETALL
7.HMGET
8.HLEN
9.HSETNX
10.HINCRBY
命令⼩结
内部编码
ziplist(压缩列表):
hashtable(哈希表):
1)当 field 个数⽐较少且没有⼤的 value 时,内部编码为 ziplist:
2)当有 value ⼤于 64 字节时,内部编码会转换为 hashtable:
3)当 field 个数超过 512 时,内部编码也会转换为 hashtable:
使⽤场景
注意
缓存⽅式对⽐
1. 原⽣字符串类型
2. 序列化字符串类型,例如 JSON 格式
3. 哈希类型
关于内聚和耦合
高内聚:有关联的代码紧密联系在一起

低耦合:代码的各个模块之间影响不大

3.List列表
列表类型的特点:
第⼀:
第⼆
第三
常见命令
LPUSH(头插)
LPUSHX
RPUSH(尾插)
RPUSHX
LRANGE
LPOP(头删)
RPOP(尾删)
LINDEX
LINSERT
LLEN
LREM
指定元素精准删除

1.当count>0时,从头开始删除指定元素的次数

2.当count<0时,从尾开始删除指定元素的次数

3.当count=0时,删除全部指定的元素

LTRIM
只保留范围内的元素


LSET
根据下标修改元素


阻塞版本命令
BLPOP
BRPOP
内部编码
ziplist(压缩列表):
linkedlist(链表):
quicklist
每个节点都是一个压缩列表,以链表的形式连接起来
使⽤场景
作为数组

消息队列
微博 Timeline
4.set集合
基本命令
SADD
SMEMBERS
SISMEMBER
SCARD
SPOP
SMOVE
SREM
集合间操作
SINTER
SINTERSTORE
SUNION
SUNIONSTORE
SDIFF
SDIFFSTORE
命令小结

内部编码
intset(整数集合):
hashtable(哈希表):
使⽤场景
1.使用set来保存用户的标签
2.使用set来计算共同好友,基于集合求交集
Zset 有序集合
常见命令
zadd
ZCARD
ZCOUNT
ZRANGE
ZREVRANGE
ZRANGEBYSCORE
ZPOPMAX
BZPOPMAX
ZPOPMIN
BZPOPMIN
ZRANK
ZREVRANK
ZSCORE
ZREM
ZREMRANGEBYRANK
ZREMRANGEBYSCORE
ZINCRBY
集合间操作

ZINTERSTORE(交集)

ZUNIONSTORE并集

命令⼩结


内部编码
ziplist(压缩列表):
当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个), 同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作
skiplist(跳表):
使⽤场景



















