文章目录
初识Redis
1. 介绍
Redis是一个非关系型的数据库,基于客服端服务端这种形式实现,数据是以键值对的形式进行存储,且数据是存储的在内存中的。由于数据是在内存中进行存储对比想MySQL这样的在磁盘中存储的数据,Redis的优势就是快,对比MySQL可能要快上上万被,但使用Redis的劣势就是存储空间大小是有限的。在分布式场景中,Redis和MySQL一般是配合起来使用,Redis存储一些比较热门的数据来缓解MySQL的压力。
Redis的一些特点(优点):
- 在内存中存储,速度快
- 可以使用一些脚本语言对Redis执行一些批量操作
- 提供了简单的TCP通讯,让绝大部分主流编程语言都可以操作Redis
- 持久化,Redis把数据存储在内存上数据是容易丢失的,Redis会把数据存储在硬盘上,也就是内存为主硬盘为辅。相当于对内存中的数据进行了一个备份,如果Redis重启了,就会在重启的时候加载硬盘中的备份数据,使Redis的内存中的数据恢复到重启之前的状态。
- 支持集群和主从复制的结构
Redis为什么快?
- Redis数据在内存中存储,访问内存比访问磁盘要快上万倍
- 从网络的角度上,Redis使用了IO多路复用(epoll)的方式,使用一个线程管理很多个socket
- Redis使用的是单线程模型(高版本中引入了多线程),单线程模型减少了不必要的线程之间相互竞争的开销
- Redis核心功能都是在操作作内存中的一些高效的数据结构
Redis的使用场景
- 作为缓存和MySQL这样的数据库配置使用,储存热点数据缓解MySQL的压力
- 在排行榜中使用,Redis提供了有序集合和列表,合理使用这些数据结果可以实现排行榜
- 计数器,对于像视频浏览量这种频繁增加的场景使用向MySQL关系型数据库显然是不合适的。
- 存储session,在分布式场景中使用Redis记录用户的登录状态,在其它机器上都能访问,即便其它主机服务重启也并不影响。
需要注意的是如果是单机服务器情况,存一些键值对数据时,redis是不如HashMap快的,因为redis是先从客户端通过网络再操作服务端操作内存,而HashMap是直接操作内存的。
2. 安装Redis
一下是在Linux云服务器的Centos8中安装Redis。
shell
# yum -y install redis
修改配置文件
shell
# vim /etc/redis.conf
#设置访问ip
bind 0.0.0.0
#关闭保护模式
protected-mode no
# 启动守护进程
daemonize yes
守护进程也就是后台进程,避免Redis退出客户端导致进程退出。
Redis中常用目录
shell
# 日志目录
logfile /var/log/redis/redis.log
# 功能目录
dir /var/lib/redis
启动redis
shell
# systemctl start redis
3. Redis命令
Redis支持很多种数据结构,整体来说Redis是以键值对的形式存储的,key是固定的字符串,value会涉及到多种类型,比如常见的字符串、哈希表、列表、集合、有序集合。操作不同的数据结果就会有不同的命令。在Redis中命令是不区分大小写的。
最常用命令
set&get
对于一下的key和value不需要加上引号,就是表示的字符串类型,当然也是可以给key和value加上引用(单引号或双引号)。nil相当于null。
shell
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> get str
"hello"
127.0.0.1:6379> get num
(nil)
全局命令
全局命令就是能够搭配任意一个数据结构来进行使用。
keys
通过一些特殊符号(通配符)来匹配key并查询到对应的key。
shell
KEYS pattern
pattern 参数可以是包含特殊符号的字符串。
*
:匹配0个或者多个字符
shell
127.0.0.1:6379> keys *
1) "str11"
2) "redis"
3) "str4"
4) "str2"
5) "str3"
6) "str1"
7) "hello"
8) "str222"
9) "str5"
127.0.0.1:6379> keys str*
1) "str11"
2) "str4"
3) "str2"
4) "str3"
5) "str1"
6) "str222"
7) "str5"
?
:匹配任意一个字符
shell
127.0.0.1:6379> keys str?
1) "str4"
2) "str2"
3) "str3"
4) "str1"
5) "str5"
[13]
只是配1和3,其它不匹配
shell
127.0.0.1:6379> keys str[13]
1) "str1"
2) "str3"
[1-3]
匹配1到3这个范围内的字符
shell
127.0.0.1:6379> keys str[1-3]
1) "str2"
2) "str3"
3) "str1"
不匹配s这个字符[^s]
java
127.0.0.1:6379> keys [^s]*
1) "redis"
2) "hello"
或者是不匹配1到3[^1-3]
shell
127.0.0.1:6379> keys str[^1-3]
1) "str4"
2) "str5"
需要注意的是 keys
这个命令的时间复杂度为 O ( n ) O(n) O(n),特别是key *
效率是非常低的,由于Redis是单线程服务器使用key *
执行时间是非常长的,就可能导致服务阻塞无法为其它客户端提供服务。
exists
判断指定的1个或多个key是否存在,返回其中key存在的个数
shell
127.0.0.1:6379> exists str1 str2 str3
(integer) 3
在Redis中这些key是通过哈希表组织的。
该命令的时间复杂度为 O ( 1 ) O(1) O(1),返回值为存在的个数
del
删除指定的一个或者多个key
shell
127.0.0.1:6379> del str1
(integer) 1
127.0.0.1:6379> del str2 str3
(integer) 2
该命令时间复杂度为 O ( 1 ) ) O(1)) O(1)),返回值为删除的个数
expire
为指定的key设置过期时间,单位为秒。
java
127.0.0.1:6379> set times hello
OK
127.0.0.1:6379> expire times 10
(integer) 1
时间复杂度为 O ( 1 ) O(1) O(1),放回值1表示设置成功,0表示设置失败。
pexpire
为指定的key设置过期时间,单位为秒毫秒。
shell
127.0.0.1:6379> pexpire test 5000
时间复杂度为 O ( 1 ) O(1) O(1),放回值1表示设置成功,0表示设置失败。
TTL
获取指定key的过期时间,秒级
java
ttl key
时间复杂度: O ( 1 ) O(1) O(1)
返回值:剩余过期时间。-1表⽰没有关联过期时间,-2表⽰key不存在
PTTL
获取指定key的过期时间,毫秒级
shell
pttl key
时间复杂度: O ( 1 ) O(1) O(1)
返回值:剩余过期时间。-1表⽰没有关联过期时间,-2表⽰key不存在
type
返回key对应的数据类型
shell
type key
时间复杂度: O ( 1 ) O(1) O(1)