Redis基础

1 Redis是什么

是一个key-value存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

官方网址

GitHub

2 Redis特性

速度快:数据存在内存中(主要原因)、每秒10w读写、c语言实现、单线程模型

持久化:rdb和aof

多种数据结构

5大数据结构

BitMaps位图:布隆过滤器 本质是 字符串

HyperLogLog:超小内存唯一值计数,12kb HyperLogLog 本质是 字符串

GEO:地理信息定位 本质是有序集合

支持多种编程语言:基于tcp通信协议,各大编程语言都支持

功能丰富:发布订阅(消息) Lua脚本,事务(pipeline)

简单:源代码几万行,不依赖外部库

主从复制:主服务器和从服务器,主服务器可以同步到从服务器中

高可用和分布式

​ 2.8版本以后使用redis-sentinel(哨兵)支持高可用

​ 3.0版本以后支持分布式

3 下载和安装

3.1 windows

下载安装https://github.com/tporadowski/redis/releases

windows的启动与关闭服务自行百度。

3.2 linux

官方网址获取最新稳定版。

1
wget https://download.redis.io/releases/redis-6.2.6.tar.gz

解压

1
tar -xzf redis-6.2.6.tar.gz

建立软连接,方便升级

1
ln -s redis-6.2.6 redis

编译安装

1
2
3
cd redis
make
make install

可执行文件一般都在src目录下

启动方式

可以在src下启动redis-server,默认监听6379端口

也可以在启动时动态指定监听端口

1
redis-server --port 6666

还可以通过配置文件启动

1
2
redis-server redis.conf 
# redis.conf 为配置文件

在redis安装目录下有redis.conf ,有一些默认配置,常用的配置项有:

1
2
3
4
5
6
7
8
9
daemonize yes # 是否以守护进程启动
pidfile /var/run/redis.pid # pid进程号的位置,删除
port 6379 # 启动端口号
dir "/opt/soft/redis/data" # 工作目录,必须是已存在的目录
logfile “6379.log” # 日志位置
requirepass 123456 # 密码
bind 127.0.0.1 # 绑定监听端口,默认127.0.0.1本地回环地址不支持远程连接;0.0.0.0可以远程连接
protected-mode no # 保护模式
databases 16 # 设置数据库数量,默认16(索引0-15)

点击这里下载一个redis.conf文件示例,查看更多配置项。

通过ps命令查看redis是否启动

1
ps aux | grep redis

连接(默认情况)

1
2
3
redis-cli -h 地址 -p 端口号 -a 密码(如果没有密码可以省略此项)
redis-cli -h 127.0.0.1 -p 6379
redis-cli # 默认连接到127.0.0.1:6379

使用ping命令测试连接情况

1
redis-cli -h 127.0.0.1 -p 6379 ping

image-20211204001327470

关闭方式
1
2
3
kill -9 进程pid
# 或者
redis-cli shutdown

3.3 redis-cli中查看修改配置

在redis-cli内查看配置信息

1
config get *

会列出所有配置信息(键值对存储,所以总数除以二,有一百条左右)

修改某些配置信息

1
2
3
CONFIG SET requirepass 123456  # 修改密码
CONFIG SET maxmemory 128M # 设置最大使用的内存,默认为0(不限)
CONFIG REWRITE # 保存到配置文件

4 redis使用场景

缓存系统:使用最广泛的就是缓存

计数器:网站访问量,转发量,评论数(文章转发,商品销量,单线程模型,不会出现并发问题)

消息队列:发布订阅,阻塞队列实现(简单的分布式,blpop:阻塞队列,生产者消费者)

排行榜:有序集合(阅读排行,点赞排行,推荐(销量高的,推荐))

社交网络:很多特效跟社交网络匹配,粉丝数,关注数

实时系统:垃圾邮件处理系统,布隆过滤器

5 常用方法

只列举出常用命令,更多命令可以查看中文文档(2.8),或者官方文档,前者做了分类,后者是命令大全。推荐前者,后者作为补充。

keys

1
2
3
4
5
6
7
8
9
10
11
12
# 查找所有符合给定模式 pattern 的 key
KEYS pattern
#打印出所有key
keys *
#打印出所有以he开头的key
keys he*
#打印出所有以he开头,第三个字母是h到l的范围
keys he[h-l]
#三位长度,以he开头,?表示任意一位
keys he?
# 匹配 hello 和 hallo ,但不匹配 hillo
KEYS h[ae]llo

KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个很大的数据集中查找特定的key ,用scan命令代替。

exists

1
2
3
EXISTS key
# 检查给定 key 是否存在
# 若 key 存在,返回 1 ,否则返回 0

expire

为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。

1
2
3
EXPIRE key seconds
# 可以对一个已经带有生存时间的 key 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。
# 设置成功返回 1 。

ttl

以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)

1
2
3
4
ttl key
# 以秒为单位,返回 key 的剩余生存时间
# 当 key 存在但没有设置剩余生存时间时,返回 -1
# 当 key 不存在时,返回 -2

del

删除给定的一个或多个键,不存在的会被忽略

1
2
DEL key [key ...]
# 返回值为被删除 key 的数量

persist

移除给定 key 的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。

1
2
3
PERSIST key
# 当生存时间移除成功时,返回 1
# 如果 key 不存在或 key 没有设置生存时间,返回 0

type

返回 key 所储存的值的类型。

1
2
3
4
5
6
7
8
TYPE key
# 返回值有5+1种
# none (key不存在)
# string (字符串)
# list (列表)
# set (集合)
# zset (有序集)
# hash (哈希表)

rename

将key重命名为newkey,如果新旧key相同,或者key不存在时,返回错误,如果newkey已经存在,则覆盖原来的

1
2
RENAME key newkey
# 改名成功时提示 OK ,失败时候返回一个错误

randomkey

从当前数据库中随机返回(不删除)一个 key

1
RANDOMKEY

move

将当前数据库的 key 移动到给定的数据库 db 当中。

1
MOVE key db

dbsize

返回当前数据库的key的数量。

1
DBSIZE

info

以一种易于解释且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。

1
INFO

flushdb

清空当前数据库中的所有key

警告:谨慎使用。

1
2
FLUSHDB
# 此命令从不失败

flushall

清空所有数据库中的所有key(清空整个 Redis 服务器的数据)

警告:谨慎使用。

1
2
FLUSHALL
# 此命令从不失败

client setname

为当前连接分配一个名字,新连接默认没有名字,设置名字里不允许使用空格

1
2
3
4
5
CLIENT SETNAME connection-name
# 为连接设置名字
CLIENT SETNAME hello-world-connection
# 将连接的名字设为空字符串 "",相当于移除名字
CLIENT SETNAME ""

client getname

返回 CLIENT SETNAME命令为连接设置的名字

1
CLIENT GETNAME

client list

以人类可读的格式,返回所有连接到服务器的客户端信息和统计数据。

1
CLIENT LIST

image-20211204022452902

client kill

关闭地址为 ip:port 的客户端,必须是CLIENT LIST返回的的ip和端口才可以。

因为 Redis 使用单线程设计,所以当 Redis 正在执行命令的时候,不会有客户端被断开连接。

如果要被断开连接的客户端正在执行命令,那么当这个命令执行之后,在发送下一个命令的时候,它就会收到一个网络错误,告知它自身的连接已被关闭。

1
2
CLIENT KILL ip:port
# 成功关闭时,返回 OK

select

切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。

默认使用 0 号数据库。

1
SELECT index

monitor

实时打印出 Redis 服务器接收到的命令,调试用

1
MONITOR

6 字符串命令

get

返回 key 所关联的字符串值。

如果 key 不存在那么返回特殊值 nil

1
GET key

set

设置键值,如果 key 已经持有其他值,使用此命令会覆盖掉原值。

1
SET key value [EX seconds] [PX milliseconds] [NX|XX]

7 哈希命令

hget

返回哈希表 key 中给定域 field 的值。

1
HGET key field

hset

将哈希表 key 中的域 field 的值设为 value

1
HSET key field value

8 列表命令

列表是一个双端队列。

查看命令

9 集合命令

集合无序,不重复。

查看命令

10 有序集合命令

查看命令