Redis学习笔记
简介
NoSQL
- NoSQL:非关系型数据库
- 特征:
- 非结构化:数据约束松散,如键值型/文档型/列类型/图型
- 无关联:不维护表之间的关联
- 非SQL:没有固定统一的语法格式
- BASE:无法满足ACID
- 存储在内存中,性能较高
- 支持水平扩展
- 适用场景:
- 数据结构不固定
- 对一致性、安全性要求不高
- 对性能要求高
Redis
- Redis:全称 Remote Dictionary Server (远程辞典服务器),是一个基于内存的键值型NoSQL数据库
- 特征:
- 键值型,
value
支持多种不同的数据结构,功能丰富 - 单线程,每个命令具备原子性
- 低延迟,速度快(基于内存、IO多路复用、良好的编码)
- 支持数据持久化
- 支持主从集群、分片集群
- 支持多语言客户端
- 键值型,
初次使用
安装与配置
笔者使用的是 Arch Linux
操作系统,因此仅对此说明
- 安装
sudo pacman -S redis
- 服务启动
sudo systemctl start redis
- 服务开机启动
sudo systemctl enable redis
- 查看服务状态
sudo systemctl status redis
- 配置文件
配置文件地址:/etc/redis/redis.conf
# 修改监听地址:将下面这行注释掉,添加自己需要的ip
bind 127.0.0.1 -::1
# 设置访问密码
requirepass 123456
# 监听端口
port 6379
# 最大内存占用
maxmemory 512mb
# 日志文件
logfile "redis.log"
命令行客户端
开启 Redis 命令行客户端的命令:
redis-cli [options] [commands]
一般来说,使用如下命令启动客户端:
redis-cli -p 6379
启动客户端后,需要输入登录信息:
AUTH wxy3265 123456
如果未设置用户名,只需输入密码:
AUTH 123456
检查连接:
ping
若输出为 PONG
,说明连接成功
Key 的层级结构
Redis 的 key
允许有多个单词形成层级结构,多个单词之间用 :
隔开,格式:项目名:业务名:类型:id
该格式并非固定,可以根据自己的需求修改,如:
eastwood:student:1
eastwood:classes:1
如果 value
是一个 Java 对象,例如一个 User
对象,则可以将对象序列化为 JSON 字符串后存储:
key | value |
---|---|
eastwood:student :1 | {“id”:1, “name”:“steve”, “score”: “85”} |
eastwood:classes:1 | {“id”: 1, “name”:“ClassA”} |
命令与数据结构
官方文档:https://redis.io/commands
通用命令
help [command]
:查看一个命令的用法KEYS
说明:查看符合模板的所有 key (可使用通配符模糊查询)。效率较低,不建议在生产环境设备上使用
例:KEYS *
DEL
说明:删除一个或多个指定的 KEY 。如果包含不存在的 key ,则只删除存在的部分,返回删除的条数。
例:DEL k1 k2 k3
EXISTS
说明:判断 key 是否存在
例:EXIST k
EXPIRE
说明:给一个 key 设置有效期,有效期到期时该 key 会被自动删除
例:EXPIRE k 10
TTL
说明:查看一个 key 的剩余有效期,永久数据返回-1
,数据不存在返回-2
例:TTL k
String
介绍
String
:字符串类型,是 Redis 中最简单的存储类型。- 类型:
string
:普通字符串int
:整数类型,可以做自增、自减操作float
:浮点类型,可以做自增、自减操作
- 无论类型,底层均为字节数组存储,但编码方式不同
- 字符串类型的最大空间不能超过512MB
常见命令
SET
:添加或修改已经存在的一个String
类型的键值对GET
:根据key
获取String
类型的value
MSET
:批量添加多个String
类型的键值对MGET
:根据多个key
获取多个String
类型的value
INCR
:让一个整型的key
自增1INCRBY
:让一个整型的key
自增并指定步长,如INCRBY num 2
为让num
自增 2INCRBYFLOAT
:让一个浮点类型的数字自增并指定步长SETNX
:添加一个String
类型的键值对,前提是这个key
不存在,否则不执行SETEX
:添加一个String
类型的键值对,并且指定有效期
Hash
介绍
Hash
的value
是一个无序字典,类似于 Java 中的HashMap
结构。Hash
结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD
常见命令
HSET key field value
:添加或修改hash
类型key
的 fi`eld 的值HGET key field
:获取一个hash
类型的key
的field
的值HMSET
:批量添加HMGET
:批量获取HGETALL
:获取一个hash
类型的key
中的所有的field
和value
HKEYS
:获取一个hash
类型的key
中的所有field
HVALS
:获取一个hash
类型的key
中的所有value
HINCRBY
:让一个hash
类型key
的字段值自增并指定步长HSETNX
:添加一个hash
类型的key
的field
值,前提是这个field
不存在,否则不执行
List
介绍
- List 与 Java 中的 LinkedList 类似,可以看作是一个双向链表结构。既可以支持正向检索也可以支持反向检索。
- 特征
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
- 常用于保存对顺序有要求的数据,如点赞、评论
常见命令
LPUSH key element ...
:向列表左侧插入一个或多个元素LPOP key
:移除并返回列表左侧的第一个元素,没有则返回nil
RPUSH key element
:向列表右侧插入一个或多个元素RPOP key
:移除并返回列表右侧的第一个元素LRANGE key star end
:返回一段角标范围内的所有元素BLPOP
和BRPOP
:与LPOP
和RPOP
类似,但在没有元素时等待指定时间,而不是直接返回nil
Set
介绍
Set
与 Java 中的HashSet
类似,可以看作一个value
为null
的HashMap
。因为也是一个hash
表,因此具备与HashSet
类似的特征:- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
常见命令
SADD key member ...
:向set
中添加一个或多个元素SREM key member ...
:移除set
中的指定元素SCARD key
:返回set
中元素的个数SISMEMBER key member
:判断一个元素是否存在于set
中,返回 1/0SMEMBERS
:获取set
中的所有元素SINTER key1 key2 ...
:求key1
与key2
的交集SDIFF key1 key2 ...
:求key1
与key2
的差集SUNION key1 key2 ...
:求key1
与key2
的并集
SortedSet
介绍
SortedSet
是一个可排序的set
集合,与 Java 中的TreeSet
有些类似,但底层数据结构却差别很大。SortedSet
中的每一个元素都带有一个score
属性,可以基于score
属性对元素排序,底层的实现是一个跳表(SkipList
) 加hash
表。- 特性
- 可排序
- 元素不重复
- 查询速度快
- 因为其可排序特性,常用于实现排行榜这样的功能。
常见命令
ZADD key score member
:添加一个或多个元素到 sorted set ,如果已存在则更新 score 值。ZREM key member
:删除 sorted set 中的一个指定元素ZSCORE key member
:获取 sorted set 中的指定元素的 score 值ZRANK key member
:获取 sorted set 中的指定元素的排名ZCARD key
:获取 sorted set 中的元素个数ZCOUNT key min max
:统计 score 值在给定范围内的所有元素个数ZINCRBY key increment member
:让 sorted set 中的指定元素自增,步长为指定的 increment 值ZRANGE key min max
:按照 score 排序后,获取指定 score 范围内的元素ZDIFF
、ZINTER
、ZUNION
:求差集、交集、并集