目录
[1.1 Redis是什么?](#1.1 Redis是什么?)
[1.2 Redis的特性](#1.2 Redis的特性)
[1.2.1 速度快](#1.2.1 速度快)
[1.2.2 基于键值对的数据结构服务器](#1.2.2 基于键值对的数据结构服务器)
[1.2.3 丰富的功能](#1.2.3 丰富的功能)
[1.2.4 简单稳定](#1.2.4 简单稳定)
[1.2.5 持久化](#1.2.5 持久化)
[1.2.6 主从复制](#1.2.6 主从复制)
[1.2.7 高可用和分布式](#1.2.7 高可用和分布式)
[1.3 Redis的使用场景](#1.3 Redis的使用场景)
[1.3.1 缓存](#1.3.1 缓存)
[1.3.2 排行榜系统](#1.3.2 排行榜系统)
[1.3.3 计数器应用](#1.3.3 计数器应用)
[1.3.4 社交网络](#1.3.4 社交网络)
[1.3.5 消息队列](#1.3.5 消息队列)
[2.1 基本全局命令](#2.1 基本全局命令)
[2.1.1 KEYS](#2.1.1 KEYS)
[2.1.2 EXISTS](#2.1.2 EXISTS)
[2.1.3 DEL](#2.1.3 DEL)
[2.1.4 EXPIRE](#2.1.4 EXPIRE)
[2.1.5 TTL](#2.1.5 TTL)
[2.1.6 TYPE](#2.1.6 TYPE)
[2.2 数据结构和内部编码](#2.2 数据结构和内部编码)
1.初识Redis
1.1 Redis是什么?
Redis是一个在内存中存储数据的中间件,用于作为数据库,用于作为数据缓存,在分布式系统中有很大的用处,由于Redis将所有的数据存储在内存中,所以Redis的读写性能非常高效
1.2 Redis的特性
1.2.1 速度快
1)Redis数据存储在内存中,所以就比访问硬盘的数据库快很多
2)Redis的核心功能都是比较简单的操作内存的数据结构
3)从网络的角读看,Redis使用了IO多路复用的方式,一个线程管理多个socket
4)Redis使用了单线程模型,减少了不必要的线程之间的竞争开销
1.2.2 基于键值对的数据结构服务器
Redis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由String、hash、list、set、zset(有序集合)、Bitmaps(位图)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景
1.2.3 丰富的功能
除了5中数据结构,Redis海提供了许多额外的功能:
1)提供了键过期功能,可以用来实现缓存
2)提供了发布订阅功能,可以用来实现消息系统
3)支持Lua脚本功能,可以利用Lua创建出新的Redis命令
4)提供了简单的事务功能,能在一定程度上保证事务特性
5)提供了流水线功能,客户端能将一批命令一次性传到Redis,减少了网络的开销
1.2.4 简单稳定
Redis的简单主要表现在三个方面,首先,Redis的源码很少,相对于很多NoSQL数据库来说代码量相对要少很多。其次,Redis使用单线程模型,使得Redis服务端处理模型变得简单。最后,Redis不需要依赖其他操作系统中的类库,自己实现了事件处理的相关功能
1.2.5 持久化
通常看,将数据放在内存中不安全,一旦发生断电,重要的数据可能就会丢失,因此Redis提供了两种持久化的方式:RDB和AOF,使用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久化
1.2.6 主从复制
Redis提供了复制功能,实现了多个相同的Redis副本,复制功能是分布式Redis的基础
1.2.7 高可用和分布式
Redis提供了高可用实现的Redis哨兵(Redis Sentinel),能够保证Redis结点的故障发现和故障自动转移,也提供了Redis集群(Redis Cluster),是真正的分布式实现,提供了高可用、读写和容量的扩展性
1.3 Redis的使用场景
1.3.1 缓存
缓存机制几乎在所有的网站都有使用,合理的使用缓存可以加速数据的访问速度,Redis提供了键值对过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略
1.3.2 排行榜系统
Redis提供了列表和有序集合的结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统
1.3.3 计数器应用
在视频网站中,每播放一次视频播放量就加1,如果并发量很大对于传统关系型数据的性能是⼀种挑战,Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择
1.3.4 社交网络
由于社交网站访问量通常比较大,而且传统的关系型数据不太合适保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能
1.3.5 消息队列
消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,对于一般的消息队列功能基本可以满足
2.Redis常见的数据类型
2.1 基本全局命令
Redis由5中数据结构,它们都是键值对中的值,对于键来说有一些通用的命令
2.1.1 KEYS
返回所有满足样式的key,例如
h?llo匹配hello,hallo和hxllo,?匹配任意一个字符
h*llo匹配hllo,hello,heeeello,*匹配0个或者多个任意字符
h[ae]llo匹配hello和hallo,[ae]只能匹配a和e
h[^e]匹配hallo,hxllo,[^e]排除e,其他都能匹配
h[a-b]llo匹配hallo和hbllo,只匹配a-b之间的范围,包含两侧边界
keys的时间复杂度是O(N),其中keys *(查询redis中的所有key)
2.1.2 EXISTS
判断某个key是否存在
时间复杂度:O(1)
返回值:key存在的个数
2.1.3 DEL
删除指定的key
时间复杂度:O(1)
返回值:删除掉key的个数
2.1.4 EXPIRE
为指定的key添加秒级的过期时间,key存活时间超过指定的值就会被自动删除
时间复杂度:O(1)
返回值:1表示设置成功,0表示设置失败
2.1.5 TTL
获取指定key的过期时间,秒级
时间复杂度:O(1)
返回值:剩余时间。-1表示没有关联过期时间,-2表示key不存在
2.1.6 TYPE
返回key对应的数据类型,Redis的所有key都是String,key对应的value可能会存在多种类型
时间复杂度:O(1)
返回值:none,string,list,set,zset,hash,stream
总结:
keys:用来查看匹配规则的key
exists:用来判定指定key是否存在
del:删除指定的key
expire:给key设置过期时间
ttl:查询key的过期时间
type:查询key对应的value的类型
2.2 数据结构和内部编码
type命令实际返回的就是当前键的数据结构类型,它们分别是:String、list、hash、set、zest,这些只是Redis对外的数据结构
Redis数据结构和内部编码
String
raw:最基本的字符串
int:redis通常也可以用来实现一些"计数"功能,当value是一个整数的时候,此时可能redis会直接使用int来保存
embstr:针对短字符串进行的特殊优化
hash
hashtable:最基本的哈希表
ziplist:压缩列表,当哈希表里面的元素比较少时,可能就优化成ziplist,从而节省空间
list
linkedlist:链表
ziplist:压缩列表
从Redis3.2开始,引入新的实现方式quicklist,它同时兼顾了linkedlist和ziplist的优点,其中quicklist就是一个链表,每个元素又是一个ziplist,兼顾到时间和空间
set
intset:集合中存的都是整数
zset
skiplist:跳表
上述每种数据结构都有至少两种以上的内部编码实现,其中可以通过object encoding命令来查询内部编码
hello对应值的内部编码时embstr,mylist对应值的内部编码时ziplist
Redis这样设计有两个好处:
1)可以改进内部编码,而对外的数据结构和命令没有任何影响,因此一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,形成了高内聚低耦合,例如Redis3.2提供了quicklist,它是结合了ziplist和linkedlist两者的优点,为列表类型提供了一种更为优秀的内部编码实现,用户是感知不到的
2)多种内部编码实现可以在不同场景下发挥各自的优势,例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会下降,这时候Redis会根据配置选项将列表类型的内部实现转换为
linkedlist,整个过程用户也感知不到