什么是Reids(REmote Dictionary Server)
- Redis是现在主流的数据库之一,是一个使用ANSI C编写的开源、包含多种数据结构、支持网络的、基于内存、可选持久性的键值对存储数据。
特性
1.速度快
- :Redis的数据全部存储瑜内存中。 可以通过下面的表来对比一下
- Redis的核心功能都是比较简单的逻辑,核心功能都是比较简单的数据结构来实现的
- 从网络角度上来看,Redis使用了“IO多路复用的方式”
- Redis使用的是单线程模型,减少了锁之间的冲突
基于键值对的数据结构
几乎所有的编程语言都提供了类似字典的功能,例如C++中的map,java中的map等,类似于这种键值对的方式,与很多键值对不同的是,Redis中的值不仅可以是字符串,还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开发,同时也能提⾼开发效率。
3.丰富的功能
- 提供了键过期功能,可以用来实现缓存
- 提供了发布订阅的功能,可以用来实现消息系统
- 支持Lua脚本功能,可以利用脚本创造出Redis命令
- 提供了简单的事务功能,能在一定程度上保证事务特性
- 提供了流水线功能,这样客户端 能将一批命令一次上传到Redis中,减少了网络的开销
4.持久化
通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化⽅式:RDB和AOF,即可以⽤两种策略将内存的数据保存到硬盘中,这样可以保证数据的可持久性。
当然Redis还有很多的特性,可以去官网上看看。
基本全局命令
set
- 将key和value存储进去
注意一点就是key都是string,但是value可以是多种类型
get
- 根据key获取对应的value
- 如果当前的key不存在,就返回nil
keys
- 返回所有满足样式的key。支持通配符匹配
- 时间复杂度:O(N)
通配符匹配规则:
- ?:匹配一个字符
- *:匹配0个或者多个字符
- [a,b]:匹配a到b的字符
- [^e]:匹配除了e的字符
下面是例子
- h?llo 匹配 hello , hallo和 hxllo
- h*llo 匹配 hllo和 heeeello
- h[ae]llo匹配 hello和 hallo但不匹配 hillo
注意的是keys的时间复杂度是O(N)
所以在生产环境中,禁止使用keys * 来查询所有的key。
- 因为redis是一个单线程的服务器,执行keys*的时间非常长,就使redis阻塞住了,无法给其他客户端提供服务了。
- redis经常被用来做缓存,挡在数据库的前面,如果redis因为keys*阻塞住了,那么当一大批请求过来的时候,mysql就很容易挂掉。
exists
使用方法: EXISTS key [key …]
- 判断某个key是否存在
- 时间复杂度:O(1)
- 返回值:key存在的个数
DEL
删除指定的key
使用方法:DEL key [key …]
- 时间复杂度:O(1)
- 返回值:删除掉key的个数
EXPIRE
为指定的key添加秒级的过期时间
使用方法: EXPIRE key seconds
- 时间复杂度:O(1)
- 返回值:1表示成功,0表示设置失败
TTL
获取指定key的过期时间,秒级
使用方法:TTL key
- 时间复杂度:O(1)
- 返回值:剩余过期时间。-1表示没有关联的过期时间,-2表示key不存在
图解过期机制:
type
返回key对应的数据类型
使用方法:TYPE key
- 时间复杂度:O(1)
- 返回值:none,string,list,set,zset,hash和stream
redis中的过期策略
redis的key过期策略如何实现的? 一个redis中可能同时存在很多key,这些key中可能有一大部分都有过期时间,此时,redis服务器怎么知道key已经过期了呢??
redis整体的策略
- 定期删除:
- 惰性删除
定期删除
结合定期删除操作。
惰性删除
假设这个key已经到了过期时间,但是暂时不用删除它,key还存在,当下一次访问的时候,用到这个key的时候,会让redis触发删除机制,同时分会一个nil
关于定时删除的功能,其实redis中没有采用定时器的方式来实现定期删除key。
如果有多个key过期了,可以采用通过一个定时器的来高效/节省CPU的前提下处理多个key(即优先级队列 或者基于时间轮都可以实现高效的定时器)