初识Redis

文章目录


初识Redis

1. 介绍

Redis是一个非关系型的数据库,基于客服端服务端这种形式实现,数据是以键值对的形式进行存储,且数据是存储的在内存中的。由于数据是在内存中进行存储对比想MySQL这样的在磁盘中存储的数据,Redis的优势就是快,对比MySQL可能要快上上万被,但使用Redis的劣势就是存储空间大小是有限的。在分布式场景中,Redis和MySQL一般是配合起来使用,Redis存储一些比较热门的数据来缓解MySQL的压力。

Redis的一些特点(优点):

  • 在内存中存储,速度快
  • 可以使用一些脚本语言对Redis执行一些批量操作
  • 提供了简单的TCP通讯,让绝大部分主流编程语言都可以操作Redis
  • 持久化,Redis把数据存储在内存上数据是容易丢失的,Redis会把数据存储在硬盘上,也就是内存为主硬盘为辅。相当于对内存中的数据进行了一个备份,如果Redis重启了,就会在重启的时候加载硬盘中的备份数据,使Redis的内存中的数据恢复到重启之前的状态。
  • 支持集群和主从复制的结构

Redis为什么快?

  1. Redis数据在内存中存储,访问内存比访问磁盘要快上万倍
  2. 从网络的角度上,Redis使用了IO多路复用(epoll)的方式,使用一个线程管理很多个socket
  3. Redis使用的是单线程模型(高版本中引入了多线程),单线程模型减少了不必要的线程之间相互竞争的开销
  4. 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)


相关推荐
永乐春秋5 分钟前
WEB-通用漏洞&SQL注入&CTF&二次&堆叠&DNS带外
数据库·sql
打鱼又晒网39 分钟前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!44 分钟前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix2 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
秋意钟2 小时前
缓存雪崩、缓存穿透【Redis】
redis
南城花随雪。2 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了2 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度2 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
简 洁 冬冬2 小时前
046 购物车
redis·购物车
天海华兮2 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql