初识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 分钟前
MySQL报错解决:The user specified as a definer (‘root‘@‘%‘) does not exist
android·数据库·mysql
白云如幻9 分钟前
MySQL的分组函数
数据库·mysql
荒川之神25 分钟前
ORACLE 闪回技术简介
数据库·oracle
HBryce2430 分钟前
缓存-基础概念
java·缓存
时差9532 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
让学习成为一种生活方式2 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
秋意钟2 小时前
MySQL日期类型选择建议
数据库·mysql
Dxy12393102163 小时前
python下载pdf
数据库·python·pdf
桀桀桀桀桀桀4 小时前
数据库中的用户管理和权限管理
数据库·mysql
superman超哥5 小时前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba