redis简介

redis(Remote dictionary server)是一个开源的基于内存的数据存储系统, 可以用于数据库缓存和消息队列等各种场景, 是目前最热门的NoSQL数据库之一。随着现代应用需要处理越来越大的访问量,传统数据库受限于磁盘I/O的速度, 其性能瓶颈越来越明显。因此基于内存的数据存储系统就应运而生了(内存的读写速度远高于磁盘)

redis支持以下五种基础数据类型:

  • 字符串 String
  • 列表 List
  • 集合 Set
  • 有序集合 SortedSet
  • 哈希 Hash

除此之外redis支持以下五种高级数据类型:

  • 消息队列 Stream
  • 地理空间 Geospatial
  • HyperLogLog
  • 位图 Bitmap
  • 位域 Bitfield

安装redis

在linux系统上安装redis非常简单, 我们只需要在终端输入如下指令即可安装:

1
sudo apt install redis

redis的基本指令

安装完成后, 我们可以通过以下命令启动redis服务

1
redis-server

在启动redis服务后, 我们可以使用以下命令启动一个redis客户端:

1
redis-cli

字符串 String

redis中的数据使用键值对存储:

1
2
3
4
5
6
7
8
9
10
set name takune   # 设置一个键值对, key=name value=takune
get name # 获取键所对应的value
del name # 删除
exists name # 查看键是否存在, 1为存在, 0为不存在
keys *me # 根据pattern(正则表达式?)查找键
flushall # 删除数据库所有的键
ttl name # 查看键的过期时间, -1表示未设置, 正数n表示还有n秒过期,-2表示已过期
expire name 10 # 设置name的过期时间为10s
setex sex 5 male # 设置一个键值对, 过期时间为5s
setnx name takune # 若数据库中没有对应的键, 设置一个新的键值对

列表 List

List用来操作一组有顺序的数据, 类似于数组, 通过这个数据结构可以实现各种队列

1
2
3
4
5
6
lpush list a      # 在list左边添加一个值'a'
rpush list b # 在list右边添加一个值'b'
rpop list # 删除list最右边的一个一个值并且返回它(在一些新版本可以指定删除的个数)
lrange list 0 -1 # 查看list指定范围内的值
llen list # 查看list的长度
ltrim list 1 3 # 修剪list,使之只有范围内的值

集合 SET

就像离散数学的集合一样, SET里的元素不能重复, 而且没有顺序

1
2
3
4
5
6
7
sadd set redis      # 在集合set中添加元素redis
smembers set # 查看集合set的所有元素
sismember set redis # 查看redis是否是集合set的元素
srem set redis # 从集合set中移除元素redis
sinter key [key...] # 返回给定所有集合的交集
sunion key [key...] # 返回给定所有集合的并集
sdiff key [key...] # 返回第一个集合与其他集合之间的差异

有序集合 SORTSET

相较于集合, 有序集合还会为每一个成员绑定一个数值,根据这个数值对集合元素默认进行从小到大排列:

1
2
3
4
zadd college 680 清华 675 北大 660 北航 670 浙大    # 创建一个有序集合college
zrange college 0 -1 whitscores # 查看有序集合的成员(添加whitscores显示分数)
zrank college 清华 # 查看某个元素的排名(默认从低到高)
zrevrank college 清华 # 查看某个元素的排名(从高到低)

哈希 hash

哈希是一个字符类型的字段和值的映射表:

1
2
3
hset person name haruki   # 向person(key)中添加name(field)对应的值(value)
hget person name # 在person中查找name
hgetall person # 查找person中所有的filed及其对应的值(value)

发布订阅模式

redis通过这个模式可以实现类似于视频网站的订阅功能, 制作者发布消息, 订阅该频道的人可以实时收到消息, 不过数据无法持久化, 无法记录历史信息:

1
2
publish channel message # 发布message到channel
subscribe channel # 订阅channel

消息队列 stream

1
xadd